All pastes #2085955 Raw Edit

Untitled

public text v1 · immutable
#2085955 ·published 2011-09-30 22:29 UTC
rendered paste body
//-----------------------------------------------------------------------------
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;
}