mirror of
https://github.com/mangosfour/server.git
synced 2025-12-25 04:37:02 +00:00
Mage 400 INTO master/434
Signed-off-by: Salja <salja2012@hotmail.de>
This commit is contained in:
parent
7665a09232
commit
22bfaa12b0
66 changed files with 5773 additions and 3971 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue