//========================================================================== // ParseNextTag // TODO: cleanup long XMLParseNextTag( char * buffer, TagPtr * tag ) { long length, pos; char * tagName; length = GetNextTag(buffer, &tagName, 0); if (length == -1) return -1; pos = length; /* Check most common cases first, make them fast */ /***** key ****/ if (!strcmp(tagName, kXMLTagKey)) { length = ParseTagKey(buffer + pos, tag); } /***** string ****/ else if (!strncmp(tagName, kXMLTagString, kXMLTagStringLen)) { if (!tagName[kXMLTagStringLen]) /* <string> */ { length = ParseTagString(buffer + pos, tag); } else if (' ' == tagName[kXMLTagStringLen]) /* <string ...> */ { // TODO: save tag if if found if(!strncmp(tagName + kXMLTagStringLen + 1, (kXMLStringID "\""), kXMLStringIDLen + 1)) /* <string ID="...> */ { // ID= int id = 0; /* find end of ID string */ int cnt = kXMLTagStringLen + 1 + kXMLStringIDLen + 2; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + kXMLTagStringLen + 1 + kXMLStringIDLen + 1; while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringID error (0x%x)\n", *val); getchar(); return -1; } } length = ParseTagString(buffer + pos, tag); SaveRefString(buffer + pos, id); } else if(!strncmp(tagName + kXMLTagStringLen + 1, kXMLStringIDRef, kXMLStringIDRefLen)) /* <string IDREF= ...> */ { // IDREF= int id = 0; int cnt = strlen(kXMLTagString " " kXMLStringIDRef "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagString " " kXMLStringIDRef "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringIDREF error (0x%x)\n", *val); getchar(); return -1; } } char* str = GetRefString(id); TagPtr tmpTag = NewTag(); tmpTag->type = kTagTypeString; tmpTag->string = str; tmpTag->tag = 0; tmpTag->tagNext = 0; tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0; *tag = tmpTag; length = 0; //printf("Located IDREF, id = %d, string = %s\n", id, str); } } else /* unrecognized <string...> */ { *tag = 0; length = 0; } } /***** integer ****/ else if (!strncmp(tagName, kXMLTagInteger, kXMLTagIntegerLen)) { if (!tagName[kXMLTagIntegerLen]) /* <integer> */ { length = ParseTagInteger(buffer + pos, tag); } else if (' ' == tagName[kXMLTagIntegerLen]) /* <integer ...> */ { if(!strncmp(tagName + kXMLTagIntegerLen + 1, kXMLStringID, kXMLStringIDLen)) /* <integer ID=...> */ { // ID= int id = 0; int cnt = strlen(kXMLTagInteger " " kXMLStringID "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagInteger " " kXMLStringID "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseIntegerID error (0x%x)\n", *val); getchar(); return -1; } } length = ParseTagInteger(buffer + pos, tag); SaveRefString((*tag)->string, id); } else if(!strncmp(tagName + kXMLTagIntegerLen + 1, kXMLStringIDRef, kXMLStringIDRefLen)) /* <integer IDREF=...> */ { // IDREF= int id = 0; int cnt = strlen(kXMLTagInteger " " kXMLStringIDRef "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagInteger " " kXMLStringIDRef "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringIDREF error (0x%x)\n", *val); getchar(); return -1; } } int integer = (int)GetRefString(id); TagPtr tmpTag = NewTag(); tmpTag->type = kTagTypeInteger; tmpTag->string = (char*) integer; tmpTag->tag = 0; tmpTag->tagNext = 0; tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0; *tag = tmpTag; length = 0; //printf("Located IDREF, id = %d, string = %s\n", id, str); } else /* presume <integer ...>...</integer> */ { length = ParseTagInteger(buffer + pos, tag); } } else /* unrecognized <integer...> */ { *tag = 0; length = 0; } } /***** false ****/ else if (!strcmp(tagName, kXMLTagFalse)) { length = ParseTagBoolean(buffer + pos, tag, kTagTypeFalse); } /***** true ****/ else if (!strcmp(tagName, kXMLTagTrue)) { length = ParseTagBoolean(buffer + pos, tag, kTagTypeTrue); } /***** plist ****/ else if (!strncmp(tagName, kXMLTagPList, kXMLTagPListLen)) { length = 0; } /***** dict ****/ else if (!strncmp(tagName, kXMLTagDict, kXMLTagDictLen)) { if (!strncmp(tagName, kXMLTagDict, kXMLTagDictLen) && tagName[strlen(tagName)-1] == '/') /* <dict.../> */ { length = ParseTagList(buffer + pos, tag, kTagTypeDict, 1); } else if (!tagName[kXMLTagDictLen] || ' ' == tagName[kXMLTagDictLen]) /* <dict> or<dict ...> */ { length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0); } else /* unrecognized <dict...> */ { *tag = 0; length = 0; } } /***** data ****/ else if ((!strncmp(tagName, kXMLTagData, kXMLTagDataLen)) && (!tagName[kXMLTagDataLen] /* <data> */ || ' ' == tagName[kXMLTagDataLen])) /* <data ...> */ { length = ParseTagData(buffer + pos, tag); } /***** date ****/ else if ((!strncmp(tagName, kXMLTagDate, kXMLTagDateLen)) && (!tagName[kXMLTagDateLen] /* <date> */ || ' ' == tagName[kXMLTagDateLen])) /* <date ...> */ { length = ParseTagDate(buffer + pos, tag); } /***** array ****/ else if (!strncmp(tagName, kXMLTagArray, kXMLTagArrayLen)) { /* <array...> */ char c = tagName[kXMLTagArrayLen]; if ('/' == c) /* <array/> */ { length = ParseTagList(buffer + pos, tag, kTagTypeArray, 1); } else if ('\0' == c || ' ' == c) /* <array> or <array ...> */ { length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0); } else /* unrecognized <array...> */ { *tag = 0; length = 0; } } /***** unknown ****/ else { *tag = 0; length = 0; } if (length == -1) return -1; return pos + length; }
//========================================================================== // ParseNextTag // TODO: cleanup long XMLParseNextTag( char * buffer, TagPtr * tag ) { long length, pos; char * tagName; length = GetNextTag(buffer, &tagName, 0); if (length == -1) return -1; pos = length; if (!strncmp(tagName, kXMLTagPList, 6)) { length = 0; } /***** dict ****/ else if (!strcmp(tagName, kXMLTagDict)) { length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0); } else if (!strncmp(tagName, kXMLTagDict, strlen(kXMLTagDict)) && tagName[strlen(tagName)-1] == '/') { length = ParseTagList(buffer + pos, tag, kTagTypeDict, 1); } else if (!strncmp(tagName, kXMLTagDict " ", strlen(kXMLTagDict " "))) { length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0); } /***** key ****/ else if (!strcmp(tagName, kXMLTagKey)) { length = ParseTagKey(buffer + pos, tag); } /***** string ****/ else if (!strcmp(tagName, kXMLTagString)) { length = ParseTagString(buffer + pos, tag); } else if (!strncmp(tagName, kXMLTagString " ", strlen(kXMLTagString " "))) { // TODO: save tag if if found if(!strncmp(tagName + strlen(kXMLTagString " "), kXMLStringID, strlen(kXMLStringID))) { // ID= int id = 0; int cnt = strlen(kXMLTagString " " kXMLStringID "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagString " " kXMLStringID "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringID error (0x%x)\n", *val); getchar(); return -1; } } length = ParseTagString(buffer + pos, tag); SaveRefString(buffer + pos, id); } else if(!strncmp(tagName + strlen(kXMLTagString " "), kXMLStringIDRef, strlen(kXMLStringIDRef))) { // IDREF= int id = 0; int cnt = strlen(kXMLTagString " " kXMLStringIDRef "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagString " " kXMLStringIDRef "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringIDREF error (0x%x)\n", *val); getchar(); return -1; } } char* str = GetRefString(id); TagPtr tmpTag = NewTag(); tmpTag->type = kTagTypeString; tmpTag->string = str; tmpTag->tag = 0; tmpTag->tagNext = 0; tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0; *tag = tmpTag; length = 0; //printf("Located IDREF, id = %d, string = %s\n", id, str); } } /***** integer ****/ else if (!strcmp(tagName, kXMLTagInteger)) { length = ParseTagInteger(buffer + pos, tag); } else if (!strncmp(tagName, kXMLTagInteger " ", strlen(kXMLTagInteger " "))) { if(!strncmp(tagName + strlen(kXMLTagInteger " "), kXMLStringID, strlen(kXMLStringID))) { // ID= int id = 0; int cnt = strlen(kXMLTagInteger " " kXMLStringID "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagInteger " " kXMLStringID "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseIntegerID error (0x%x)\n", *val); getchar(); return -1; } } length = ParseTagInteger(buffer + pos, tag); SaveRefString((*tag)->string, id); } else if(!strncmp(tagName + strlen(kXMLTagInteger " "), kXMLStringIDRef, strlen(kXMLStringIDRef))) { // IDREF= int id = 0; int cnt = strlen(kXMLTagInteger " " kXMLStringIDRef "\"") + 1; while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++; tagName[cnt] = 0; char* val = tagName + strlen(kXMLTagInteger " " kXMLStringIDRef "\""); while(*val) { if ((*val >= '0' && *val <= '9')) // 0 - 9 { id = (id * 10) + (*val++ - '0'); } else { printf("ParseStringIDREF error (0x%x)\n", *val); getchar(); return -1; } } int integer = (int)GetRefString(id); TagPtr tmpTag = NewTag(); tmpTag->type = kTagTypeInteger; tmpTag->string = (char*) integer; tmpTag->tag = 0; tmpTag->tagNext = 0; tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0; *tag = tmpTag; length = 0; //printf("Located IDREF, id = %d, string = %s\n", id, str); } else { length = ParseTagInteger(buffer + pos, tag); } } /***** data ****/ else if (!strcmp(tagName, kXMLTagData)) { length = ParseTagData(buffer + pos, tag); } else if (!strncmp(tagName, kXMLTagData " ", strlen(kXMLTagData " "))) { length = ParseTagData(buffer + pos, tag); } else if (!strcmp(tagName, kXMLTagDate)) { length = ParseTagDate(buffer + pos, tag); } /***** date ****/ else if (!strncmp(tagName, kXMLTagDate " ", strlen(kXMLTagDate " "))) { length = ParseTagDate(buffer + pos, tag); } /***** false ****/ else if (!strcmp(tagName, kXMLTagFalse)) { length = ParseTagBoolean(buffer + pos, tag, kTagTypeFalse); } /***** true ****/ else if (!strcmp(tagName, kXMLTagTrue)) { length = ParseTagBoolean(buffer + pos, tag, kTagTypeTrue); } /***** array ****/ else if (!strcmp(tagName, kXMLTagArray)) { length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0); } else if (!strncmp(tagName, kXMLTagArray " ", strlen(kXMLTagArray " "))) { length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0); } else if (!strcmp(tagName, kXMLTagArray "/")) { length = ParseTagList(buffer + pos, tag, kTagTypeArray, 1); } /***** unknown ****/ else { *tag = 0; length = 0; } if (length == -1) return -1; return pos + length; }