//-----------------------------------------------------------------------------
class TagData
{
public:
TagData(){szTagName[0] = '\0'; szTagType[0] = '\0'; p_szExtended = 0; nDataSize = 0; p_szData = 0;};
~TagData(){if(p_szExtended)delete[] p_szExtended; if(p_szData)delete[] p_szData;};
char szTagName[16];
char szTagType[8];
char *p_szExtended;
unsigned int nDataSize;
char *p_szData;
};
/*
format is code=param06code=param06code=param06
eg. 0x02t=li0x06n=records0x06e=2,40x06s=80x06d=coolcool0x0x060x03
means; list item of list called records, row 2 col 4 in list, 8bytes of data, data is coolcool
02 = start of tag
t = type: str = string, mlstr = multiline string, li = list item(member of n)
n = name of data field
e = extended options: list = x,x(row,column)
s = size of data
d = data + null byte
03 = end of tag
*/
//-----------------------------------------------------------------------------
// szEntryData = entry data to search, nEntrySize = full size of entry,
// nStart = psotion to start search, Tag = data in tag
// return end of this tag, can be used to get next
unsigned int GetTagData(char *szEntryData,int nEntrySize,unsigned int nStart,TagData *Tag)
{
unsigned int nElementStart = 0;
char cElement = '\0';
char *p_szBuffer;
for(int I = nStart; I < nEntrySize; ++I)
{
// beginning tag
if(szEntryData[I] == 0x02)
{
I++;
for(; (I < nEntrySize); ++I)
{
switch(szEntryData[I])
{
case 0x03:
return I;
break;
case 0x06:
switch(cElement)
{
case 't': // type
memset(Tag->szTagType,'\0',sizeof(Tag->szTagType));
strncpy(Tag->szTagType,szEntryData+nElementStart,I-nElementStart);
break;
case 'n': // name
memset(Tag->szTagName,'\0',sizeof(Tag->szTagName));
strncpy(Tag->szTagName,szEntryData+nElementStart,I-nElementStart);
break;
case 'e': // extended info
if(Tag->p_szExtended)
delete[] Tag->p_szExtended;
Tag->p_szExtended = new char[I-nElementStart+1];
memset(Tag->p_szExtended,'\0',I-nElementStart+1);
strncpy(Tag->p_szExtended,szEntryData+nElementStart,I-nElementStart);
break;
case 's': // size of data
p_szBuffer = new char[I-nElementStart+1];
memset(p_szBuffer,'\0',I-nElementStart+1);
strncpy(p_szBuffer,szEntryData+nElementStart,I-nElementStart);
Tag->nDataSize = atoi(p_szBuffer);
delete[] p_szBuffer;
break;
case 'd': // data
if(Tag->p_szData)
delete[] Tag->p_szData;
Tag->p_szData = new char[I-nElementStart+1];
memset(Tag->p_szData,'\0',I-nElementStart+1);
strncpy(Tag->p_szData,szEntryData+nElementStart,I-nElementStart);
break;
}
nElementStart = 0;
break;
default:
if(nElementStart == 0)
{
cElement = szEntryData[I];
I+=2;
nElementStart = I;
}
break;
}
}
--I;
}
}
return 0;
}