Mage 400 INTO master/434

Signed-off-by: Salja <salja2012@hotmail.de>
This commit is contained in:
Salja 2012-08-05 13:30:05 +02:00 committed by Antz
parent 7665a09232
commit 22bfaa12b0
66 changed files with 5773 additions and 3971 deletions

View file

@ -141,6 +141,16 @@ uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos)
return recordsize;
}
uint32 DBCFileLoader::GetFormatStringsFields(const char * format)
{
uint32 stringfields = 0;
for(uint32 x=0; format[x];++x)
if (format[x] == FT_STRING)
++stringfields;
return stringfields;
}
char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable)
{
/*
@ -234,13 +244,77 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**
return dataTable;
}
char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable)
static char const* const nullStr = "";
char* DBCFileLoader::AutoProduceStringsArrayHolders(const char* format, char* dataTable)
{
if(strlen(format)!=fieldCount)
return NULL;
// we store flat holders pool as single memory block
size_t stringFields = GetFormatStringsFields(format);
// each string field at load have array of string for each locale
size_t stringHolderSize = sizeof(char*) * MAX_LOCALE;
size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize;
size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * recordCount;
char* stringHoldersPool= new char[stringHoldersPoolSize];
// dbc strings expected to have at least empty string
for(size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
((char const**)stringHoldersPool)[i] = nullStr;
uint32 offset=0;
// assign string holders to string field slots
for(uint32 y =0;y<recordCount;y++)
{
uint32 stringFieldNum = 0;
for(uint32 x=0;x<fieldCount;x++)
switch(format[x])
{
case FT_FLOAT:
case FT_IND:
case FT_INT:
offset+=4;
break;
case FT_BYTE:
offset+=1;
break;
case FT_STRING:
{
// init dbc string field slots by pointers to string holders
char const*** slot = (char const***)(&dataTable[offset]);
*slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringHolderSize*stringFieldNum]);
++stringFieldNum;
offset+=sizeof(char*);
break;
}
case FT_NA:
case FT_NA_BYTE:
case FT_SORT:
break;
default:
assert(false && "unknown format character");
}
}
//send as char* for store in char* pool list for free at unload
return stringHoldersPool;
}
char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable, LocaleConstant loc)
{
if (strlen(format) != fieldCount)
return NULL;
char* stringPool = new char[stringSize];
memcpy(stringPool, stringTable, stringSize);
// each string field at load have array of string for each locale
size_t stringHolderSize = sizeof(char*) * MAX_LOCALE;
char* stringPool= new char[stringSize];
memcpy(stringPool,stringTable,stringSize);
uint32 offset = 0;
@ -262,14 +336,17 @@ char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable)
break;
case FT_STRING:
{
char** holder = *((char***)(&dataTable[offset]));
char** slot = &holder[loc];
// fill only not filled entries
char** slot = (char**)(&dataTable[offset]);
if (!*slot || !** slot)
if (*slot == nullStr)
{
const char* st = getRecord(y).getString(x);
*slot = stringPool + (st - (const char*)stringTable);
}
offset += sizeof(char*);
offset+=sizeof(char*);
break;
}
case FT_LOGIC: