//----------------------------------------------------------------------------- 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; }