core/logic/GameConfigs.cpp
changeset 4058 c3ebd769e128
parent 4038 92fba8db1d33
child 4063 7b7372572e85
     1.1 --- a/core/logic/GameConfigs.cpp	Sun Aug 25 01:42:15 2013 -0700
     1.2 +++ b/core/logic/GameConfigs.cpp	Sun Aug 25 01:42:16 2013 -0700
     1.3 @@ -119,7 +119,6 @@
     1.4  CGameConfig::CGameConfig(const char *file, const char *engine)
     1.5  {
     1.6  	strncopy(m_File, file, sizeof(m_File));
     1.7 -	m_pAddresses = new KTrie<AddressConf>();
     1.8  	m_pStrings = new BaseStringTable(512);
     1.9  
    1.10  	m_CustomLevel = 0;
    1.11 @@ -212,13 +211,10 @@
    1.12  			}
    1.13  			else
    1.14  			{
    1.15 -				ITextListener_SMC **pListen = g_GameConfigs.m_customHandlers.retrieve(name);
    1.16 -
    1.17 -				if (pListen != NULL)
    1.18 +				if (g_GameConfigs.m_customHandlers.retrieve(name, &m_CustomHandler))
    1.19  				{
    1.20  					m_CustomLevel = 0;
    1.21  					m_ParseState = PSTATE_GAMEDEFS_CUSTOM;
    1.22 -					m_CustomHandler = *pListen;
    1.23  					m_CustomHandler->ReadSMC_ParseStart();
    1.24  					break;
    1.25  				}
    1.26 @@ -617,7 +613,7 @@
    1.27  			}
    1.28  
    1.29  			AddressConf addrConf(m_AddressSignature, sizeof(m_AddressSignature), m_AddressReadCount, m_AddressRead);
    1.30 -			m_pAddresses->replace(m_Address, addrConf);
    1.31 +			m_Addresses.replace(m_Address, addrConf);
    1.32  
    1.33  			break;
    1.34  		}
    1.35 @@ -765,7 +761,7 @@
    1.36  	m_Offsets.clear();
    1.37  	m_Props.clear();
    1.38  	m_Keys.clear();
    1.39 -	m_pAddresses->clear();
    1.40 +	m_Addresses.clear();
    1.41  
    1.42  	char path[PLATFORM_MAX_PATH];
    1.43  
    1.44 @@ -920,20 +916,15 @@
    1.45  
    1.46  bool CGameConfig::GetOffset(const char *key, int *value)
    1.47  {
    1.48 -	int *pvalue;
    1.49 -	if ((pvalue = m_Offsets.retrieve(key)) == NULL)
    1.50 -		return false;
    1.51 -
    1.52 -	*value = *pvalue;
    1.53 -	return true;
    1.54 +	return m_Offsets.retrieve(key, value);
    1.55  }
    1.56  
    1.57  const char *CGameConfig::GetKeyValue(const char *key)
    1.58  {
    1.59 -	int *pkey;
    1.60 -	if ((pkey = m_Keys.retrieve(key)) == NULL)
    1.61 +	int address;
    1.62 +	if (!m_Keys.retrieve(key, &address))
    1.63  		return NULL;
    1.64 -	return m_pStrings->GetString(*pkey);
    1.65 +	return m_pStrings->GetString(address);
    1.66  }
    1.67  
    1.68  //memory addresses below 0x10000 are automatically considered invalid for dereferencing
    1.69 @@ -941,25 +932,25 @@
    1.70  
    1.71  bool CGameConfig::GetAddress(const char *key, void **retaddr)
    1.72  {
    1.73 -	AddressConf *addrConf;
    1.74 -
    1.75 -	addrConf = m_pAddresses->retrieve(key);
    1.76 -	if (!addrConf)
    1.77 +	StringHashMap<AddressConf>::Result r = m_Addresses.find(key);
    1.78 +	if (!r.found())
    1.79  	{
    1.80  		*retaddr = NULL;
    1.81  		return false;
    1.82  	}
    1.83  
    1.84 +	AddressConf &addrConf = r->value;
    1.85 +
    1.86  	void *addr;
    1.87 -	if (!GetMemSig(addrConf->signatureName, &addr))
    1.88 +	if (!GetMemSig(addrConf.signatureName, &addr))
    1.89  	{
    1.90  		*retaddr = NULL;
    1.91  		return false;
    1.92  	}
    1.93  
    1.94 -	for (int i = 0; i < addrConf->readCount; ++i)
    1.95 +	for (int i = 0; i < addrConf.readCount; ++i)
    1.96  	{
    1.97 -		int offset = addrConf->read[i];
    1.98 +		int offset = addrConf.read[i];
    1.99  
   1.100  		//NULLs in the middle of an indirection chain are bad, end NULL is ok
   1.101  		if (addr ==  NULL || reinterpret_cast<uintptr_t>(addr) < VALID_MINIMUM_MEMORY_ADDRESS)
   1.102 @@ -1000,11 +991,7 @@
   1.103  
   1.104  bool CGameConfig::GetMemSig(const char *key, void **addr)
   1.105  {
   1.106 -	void **paddr;
   1.107 -	if ((paddr = m_Sigs.retrieve(key)) == NULL)
   1.108 -		return false;
   1.109 -	*addr = *paddr;
   1.110 -	return true;
   1.111 +	return m_Sigs.retrieve(key, addr);
   1.112  }
   1.113  
   1.114  GameConfigManager::GameConfigManager()
   1.115 @@ -1074,7 +1061,6 @@
   1.116  		retval = pConfig->Reparse(error, maxlength);
   1.117  	}
   1.118  
   1.119 -	m_cfgs.push_back(pConfig);
   1.120  	m_Lookup.insert(file, pConfig);
   1.121  
   1.122  	*_pConfig = pConfig;
   1.123 @@ -1108,22 +1094,16 @@
   1.124  	m_customHandlers.insert(sectionname, listener);
   1.125  }
   1.126  
   1.127 -void GameConfigManager::RemoveUserConfigHook(const char *sectionname, ITextListener_SMC *listener)
   1.128 +void GameConfigManager::RemoveUserConfigHook(const char *sectionname, ITextListener_SMC *aListener)
   1.129  {
   1.130 -	ITextListener_SMC **pListener = m_customHandlers.retrieve(sectionname);
   1.131 -
   1.132 -	if (pListener == NULL)
   1.133 -	{
   1.134 +	ITextListener_SMC *listener;
   1.135 +	if (!m_customHandlers.retrieve(sectionname, &listener))
   1.136  		return;
   1.137 -	}
   1.138  
   1.139 -	if (*pListener != listener)
   1.140 -	{
   1.141 +	if (listener != aListener)
   1.142  		return;
   1.143 -	}
   1.144  
   1.145  	m_customHandlers.remove(sectionname);
   1.146 -	
   1.147  	return;
   1.148  }
   1.149