From: Willem J. P. <wjp...@us...> - 2006-11-25 15:21:06
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv11729/plugins/Core Modified Files: Variables.h Variables.cpp Interface.cpp Map.cpp Log Message: add POINTER (void*) type to Variables class to avoid having to use the STRING type to store pointers. Index: Interface.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.cpp,v retrieving revision 1.436 retrieving revision 1.437 diff -C2 -d -r1.436 -r1.437 *** Interface.cpp 22 Oct 2006 12:51:34 -0000 1.436 --- Interface.cpp 25 Nov 2006 15:21:00 -0000 1.437 *************** *** 719,723 **** } else { ItemTooltipTable = new Variables(); ! ItemTooltipTable->SetType(GEM_VARIABLES_STRING); } table = LoadTable( "tooltip" ); --- 719,723 ---- } else { ItemTooltipTable = new Variables(); ! ItemTooltipTable->SetType(GEM_VARIABLES_POINTER); } table = LoadTable( "tooltip" ); *************** *** 742,746 **** tmppoi[i] = atoi(aa->QueryField(idx,i)); } ! ItemTooltipTable->SetAt(key, (const char *) tmppoi); } DelTable( table ); --- 742,746 ---- tmppoi[i] = atoi(aa->QueryField(idx,i)); } ! ItemTooltipTable->SetAt(key, (void*)tmppoi); } DelTable( table ); *************** *** 764,768 **** if (ItemTooltipTable) { ! ItemTooltipTable->Lookup(itemname, (char *&) value); } if (value && (value[header]>=0)) { --- 764,770 ---- if (ItemTooltipTable) { ! void* lookup; ! ItemTooltipTable->Lookup(itemname, lookup); ! value = (int*)lookup; } if (value && (value[header]>=0)) { *************** *** 4207,4211 **** ItemName[8]=0; strlwr(ItemName); ! RtRows->SetAt(ItemName, (const char *) itemlist); } end: --- 4209,4213 ---- ItemName[8]=0; strlwr(ItemName); ! RtRows->SetAt(ItemName, (void*)itemlist); } end: *************** *** 4231,4235 **** return false; } ! RtRows->SetType( GEM_VARIABLES_STRING ); } if (table<0) { --- 4233,4237 ---- return false; } ! RtRows->SetType( GEM_VARIABLES_POINTER ); } if (table<0) { *************** *** 4293,4300 **** ieResRef NewItem; ! ItemList *itemlist=NULL; ! if ( (!RtRows->Lookup( itm->ItemResRef, (char *&) itemlist )) ) { return true; } i=Roll(1,itemlist->Count,-1); strncpy( NewItem, itemlist->ResRefs[i], sizeof(ieResRef) ); --- 4295,4304 ---- ieResRef NewItem; ! void* lookup; ! if ( !RtRows->Lookup( itm->ItemResRef, lookup ) ) { return true; } + ItemList *itemlist = (ItemList*)lookup; + i=Roll(1,itemlist->Count,-1); strncpy( NewItem, itemlist->ResRefs[i], sizeof(ieResRef) ); Index: Variables.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Variables.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** Variables.cpp 11 Aug 2006 23:17:20 -0000 1.31 --- Variables.cpp 25 Nov 2006 15:21:00 -0000 1.32 *************** *** 302,305 **** --- 302,318 ---- } + bool Variables::Lookup(const char* key, void *&dest) const + { + unsigned int nHash; + MYASSERT(m_type==GEM_VARIABLES_POINTER); + Variables::MyAssoc* pAssoc = GetAssocAt( key, nHash ); + if (pAssoc == NULL) { + return false; + } // not in map + + dest = pAssoc->Value.pValue; + return true; + } + bool Variables::Lookup(const char* key, ieDword& rValue) const { *************** *** 320,327 **** char *str=(char *) malloc(len); memcpy(str,value,len); ! SetAt(key, (const char *) str); } ! void Variables::SetAt(const char* key, const char* value) { unsigned int nHash; --- 333,340 ---- char *str=(char *) malloc(len); memcpy(str,value,len); ! SetAt(key, str); } ! void Variables::SetAt(const char* key, char* value) { unsigned int nHash; *************** *** 347,355 **** //set value only if we have a key if (pAssoc->key) { ! pAssoc->Value.sValue = (char *) value; pAssoc->nHashValue = nHash; } } void Variables::SetAt(const char* key, ieDword value) { --- 360,398 ---- //set value only if we have a key if (pAssoc->key) { ! pAssoc->Value.sValue = value; pAssoc->nHashValue = nHash; } } + void Variables::SetAt(const char* key, void* value) + { + unsigned int nHash; + Variables::MyAssoc* pAssoc; + + MYASSERT( m_type == GEM_VARIABLES_POINTER ); + if (( pAssoc = GetAssocAt( key, nHash ) ) == NULL) { + if (m_pHashTable == NULL) + InitHashTable( m_nHashTableSize ); + + // it doesn't exist, add a new Association + pAssoc = NewAssoc( key ); + // put into hash table + pAssoc->pNext = m_pHashTable[nHash]; + m_pHashTable[nHash] = pAssoc; + } else { + if (pAssoc->Value.sValue) { + free( pAssoc->Value.sValue ); + pAssoc->Value.sValue = 0; + } + } + + //set value only if we have a key + if (pAssoc->key) { + pAssoc->Value.pValue = value; + pAssoc->nHashValue = nHash; + } + } + + void Variables::SetAt(const char* key, ieDword value) { Index: Map.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.cpp,v retrieving revision 1.256 retrieving revision 1.257 diff -C2 -d -r1.256 -r1.257 *** Map.cpp 5 Nov 2006 11:11:45 -0000 1.256 --- Map.cpp 25 Nov 2006 15:21:00 -0000 1.257 *************** *** 147,151 **** Spawns.RemoveAll(NULL); ! Spawns.SetType( GEM_VARIABLES_STRING ); if (table<0) { --- 147,151 ---- Spawns.RemoveAll(NULL); ! Spawns.SetType( GEM_VARIABLES_POINTER ); if (table<0) { *************** *** 179,183 **** } strnlwrcpy( GroupName, tab->GetColumnName( i ), 8); ! Spawns.SetAt( GroupName, (const char *) creatures ); } } --- 179,183 ---- } strnlwrcpy( GroupName, tab->GetColumnName( i ), 8); ! Spawns.SetAt( GroupName, (void*) creatures ); } } *************** *** 2101,2105 **** SpawnGroup *sg=NULL; Actor *creature; ! if ( !Spawns.Lookup( CreName, (char *&) sg) ) { DataStream *stream = core->GetResourceMgr()->GetResource( CreName, IE_CRE_CLASS_ID ); creature = core->GetCreature(stream); --- 2101,2106 ---- SpawnGroup *sg=NULL; Actor *creature; ! void* lookup; ! if ( !Spawns.Lookup( CreName, lookup) ) { DataStream *stream = core->GetResourceMgr()->GetResource( CreName, IE_CRE_CLASS_ID ); creature = core->GetCreature(stream); *************** *** 2110,2113 **** --- 2111,2115 ---- return; } + sg = (SpawnGroup*)lookup; //adjust this with difflev too unsigned int count = sg->Count; Index: Variables.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Variables.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** Variables.h 12 Jun 2006 18:05:32 -0000 1.24 --- Variables.h 25 Nov 2006 15:21:00 -0000 1.25 *************** *** 37,40 **** --- 37,41 ---- #define GEM_VARIABLES_INT 0 #define GEM_VARIABLES_STRING 1 + #define GEM_VARIABLES_POINTER 2 #ifdef WIN32 *************** *** 59,62 **** --- 60,64 ---- ieDword nValue; char* sValue; + void* pValue; } Value; unsigned long nHashValue; *************** *** 97,104 **** bool Lookup(const char* key, ieDword& rValue) const; bool Lookup(const char* key, char*& dest) const; // Operations void SetAtCopy(const char* key, const char* newValue); ! void SetAt(const char* key, const char* newValue); void SetAt(const char* key, ieDword newValue); void RemoveAll(ReleaseFun fun); --- 99,108 ---- bool Lookup(const char* key, ieDword& rValue) const; bool Lookup(const char* key, char*& dest) const; + bool Lookup(const char* key, void*& dest) const; // Operations void SetAtCopy(const char* key, const char* newValue); ! void SetAt(const char* key, char* newValue); ! void SetAt(const char* key, void* newValue); void SetAt(const char* key, ieDword newValue); void RemoveAll(ReleaseFun fun); |