#include "sl.h"␊ |
#include "xml.h"␊ |
␊ |
string_ref* ref_strings = NULL;␊ |
␊ |
// TODO: redo the next two functions␊ |
void SaveRefString(char* string, int id)␊ |
{␊ |
␉//printf("Adding Ref String %d (%s)\n", id, string);␊ |
␉string_ref* tmp = ref_strings;␊ |
␉while(tmp)␊ |
␉{␊ |
␉␉if(tmp->id == id)␊ |
␉␉{␊ |
␉␉␉tmp->string = malloc(strlen(string+1));␊ |
␉␉␉sprintf(tmp->string, "%s", string);␊ |
␉␉␉return;␊ |
␉␉}␊ |
␉␉tmp = tmp->next;␊ |
␉}␊ |
␉␊ |
␉string_ref* new_ref = malloc(sizeof(string_ref));␊ |
␉new_ref->string = malloc(strlen(string)+1);␊ |
␉sprintf(new_ref->string, "%s", string);␊ |
␉new_ref->id = id;␊ |
␉new_ref->next = ref_strings;␊ |
␉ref_strings = new_ref;␊ |
}␊ |
␊ |
char* GetRefString(int id)␊ |
{␊ |
␉string_ref* tmp = ref_strings;␊ |
␉while(tmp)␊ |
␉{␊ |
␉␉if(tmp->id == id) return tmp->string;␊ |
␉␉tmp = tmp->next;␊ |
␉}␊ |
␉//verbose("Unable to locate Ref String %d\n", id);␊ |
␉return "Unknown";␊ |
}␊ |
␊ |
␊ |
struct Module { ␊ |
struct Module *nextModule;␊ |
long willLoad;␊ |
|
return 0;␊ |
}␊ |
␊ |
␊ |
// XMLGetTag(int index)␊ |
␊ |
// XMLTagCount( TagPtr dict )␊ |
int XMLTagCount( TagPtr dict )␊ |
{␊ |
␉int count = 0;␊ |
␉TagPtr tagList, tag;␊ |
␊ |
if (dict->type != kTagTypeDict && dict->type != kTagTypeArray) return 0;␊ |
␉tag = 0;␊ |
tagList = dict->tag;␊ |
while (tagList)␊ |
{␊ |
␉␉tag = tagList;␊ |
tagList = tag->tagNext;␊ |
␉␉␊ |
␉␉if (((tag->type != kTagTypeKey) && ((tag->string == 0) || (tag->string[0] == 0)))␊ |
␉␉␉&& (dict->type != kTagTypeArray)␉// If we are an array, any element is valid␊ |
␉␉␉) continue;␊ |
␉␉␊ |
␉␉if(tag->type == kTagTypeKey) printf("Located key %s\n", tag->string);␊ |
␊ |
␉␉count++;␊ |
}␊ |
␉␊ |
␉return count;␊ |
}␊ |
␊ |
TagPtr XMLGetElement( TagPtr dict, int id )␊ |
{␊ |
␉if(dict->type != kTagTypeArray) return 0;␊ |
␉␊ |
␉int element = 0;␊ |
␉TagPtr tmp = dict->tag;␊ |
␊ |
␉while(element < id)␊ |
␉{␊ |
␉␉element++;␊ |
␉␉tmp = tmp->tagNext;␊ |
␉}␊ |
␉␊ |
␉return tmp;␊ |
}␊ |
/* Function for basic XML character entities parsing */␊ |
␊ |
char*␊ |
|
return out;␊ |
} ␊ |
␊ |
#if UNUSED␊ |
//#if UNUSED␊ |
//==========================================================================␊ |
// XMLParseFile␊ |
// Expects to see one dictionary in the XML file.␊ |
// Expects to see one dictionary in the XML file, the final pos will be returned␊ |
// If the pos is not equal to the strlen, then there are multiple dicts␊ |
// Puts the first dictionary it finds in the␊ |
// tag pointer and returns 0, or returns -1 if not found.␊ |
// tag pointer and returns the end of the dic, or returns -1 if not found.␊ |
//␊ |
long␊ |
XMLParseFile( char * buffer, TagPtr * dict )␊ |
|
long length, pos;␊ |
TagPtr tag;␊ |
pos = 0;␊ |
␊ |
␉char *configBuffer;␊ |
␉␊ |
configBuffer = malloc(strlen(buffer)+1);␊ |
strcpy(configBuffer, buffer);␊ |
␉␊ |
while (1)␊ |
{␊ |
length = XMLParseNextTag(buffer + pos, &tag);␊ |
length = XMLParseNextTag(configBuffer + pos, &tag);␊ |
if (length == -1) break;␊ |
␊ |
pos += length;␊ |
|
␊ |
XMLFreeTag(tag);␊ |
}␊ |
if (length < 0) {␊ |
␉free(configBuffer);␊ |
␉if (length < 0) {␊ |
return -1;␊ |
}␊ |
*dict = tag;␊ |
return 0;␊ |
return pos;␊ |
}␊ |
#endif /* UNUSED */␊ |
//#endif /* UNUSED */␊ |
␊ |
//==========================================================================␊ |
// ParseNextTag␊ |
␊ |
// TODO: cleanup␊ |
long␊ |
XMLParseNextTag( char * buffer, TagPtr * tag )␊ |
{␊ |
|
␊ |
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 (!strcmp(tagName, kXMLTagDict "/"))␊ |
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);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉␉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);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉␉return -1;␊ |
␉␉␉␉␉␊ |
␉␉␉␉}␊ |
␉␉␉␉␊ |
␉␉␉}␊ |
␉␉␉char* str = GetRefString(id);␊ |
␊ |
␉␉␉TagPtr tmpTag = NewTag();␊ |
␉␉␉tmpTag->type = kTagTypeString;␊ |
␉␉␉tmpTag->string = str;␊ |
␉␉␉tmpTag->tag = 0;␊ |
␉␉␉tmpTag->tagNext = 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);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉␉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);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉␉return -1;␊ |
␉␉␉␉␉␊ |
␉␉␉␉}␊ |
␉␉␉␉␊ |
␉␉␉}␊ |
␉␉␉int integer = (int)GetRefString(id);␊ |
␉␉␉␊ |
␉␉␉TagPtr tmpTag = NewTag();␊ |
␉␉␉tmpTag->type = kTagTypeInteger;␊ |
␉␉␉tmpTag->string = (char*) integer;␊ |
␉␉␉tmpTag->tag = 0;␊ |
␉␉␉tmpTag->tagNext = 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;␊ |
|
ParseTagInteger( char * buffer, TagPtr * tag )␊ |
{␊ |
long length, integer;␊ |
␉bool negative = false;␊ |
TagPtr tmpTag;␊ |
␊ |
length = FixDataMatchingTag(buffer, kXMLTagInteger);␊ |
␉char* val = buffer;␊ |
int size;␊ |
␉␊ |
␉␊ |
␉if(buffer[0] == '<') ␊ |
␉{␊ |
␉␉printf("Warning integer is non existant\n");␊ |
␉␉getc();␊ |
␉␉tmpTag->type = kTagTypeInteger;␊ |
␉␉tmpTag->string = 0;␊ |
␉␉tmpTag->tag = 0;␊ |
␉␉tmpTag->tagNext = 0;␊ |
␉␉␊ |
␉␉*tag = tmpTag;␊ |
␉␉␊ |
␉␉return 0;␊ |
␉}␊ |
␉␊ |
size = length = FixDataMatchingTag(buffer, kXMLTagInteger);␊ |
if (length == -1) return -1;␊ |
␊ |
tmpTag = NewTag();␊ |
if (tmpTag == 0) return -1;␊ |
␊ |
integer = 0;␊ |
␊ |
␊ |
␉if(size > 1 && (val[1] == 'x' || val[1] == 'X'))␉// Hex value␊ |
␉{␊ |
␉␉val += 2;␊ |
␉␉while(*val)␊ |
␉␉{␉␉␉␊ |
␉␉␉if ((*val >= '0' && *val <= '9'))␉// 0 - 9␊ |
␉␉␉{␊ |
␉␉␉␉integer = (integer * 16) + (*val++ - '0');␊ |
␉␉␉}␊ |
␉␉␉else if ((*val >= 'a' && *val <= 'f'))␉// a - f␊ |
␉␉␉{␊ |
␉␉␉␉integer = (integer * 16) + (*val++ - 'a' + 10);␊ |
␉␉␉}␊ |
␉␉␉else if ((*val >= 'A' && *val <= 'F'))␉// A - F␊ |
␉␉␉{␊ |
␉␉␉␉integer = (integer * 16) + (*val++ - 'a' + 10);␊ |
␉␉␉}␊ |
␉␉␉else␊ |
␉␉␉{␊ |
␉␉␉␉printf("ParseTagInteger hex error (0x%x) in buffer %s\n", *val, buffer);␊ |
␉␉␉␉getc();␊ |
␉␉␉␉return -1;␊ |
␉␉␉␉␊ |
␉␉␉}␊ |
␊ |
␉␉}␊ |
␉␉␊ |
␉␉if (negative)␊ |
␉␉␉integer = -integer;␊ |
␉␉␊ |
␉}␊ |
␉else if ( size )␉// Decimal value␊ |
␉{␊ |
␉␉if (*val == '-')␊ |
␉␉{␊ |
␉␉␉negative = true;␊ |
␉␉␉val++;␊ |
␉␉␉size--;␊ |
␉␉}␊ |
␉␉␊ |
␉␉for (integer = 0; size > 0; size--)␊ |
␉␉{␊ |
␉␉␉if (*val < '0' || *val > '9')␊ |
␉␉␉{␊ |
␉␉␉␉printf("ParseTagInteger decimal error (0x%x) in buffer %s\n", *val, buffer);␊ |
␉␉␉␉getc();␊ |
␉␉␉␉return -1;␊ |
␉␉␉}␊ |
␉␉␉␊ |
␉␉␉integer = (integer * 10) + (*val++ - '0');␊ |
␉␉}␊ |
␉␉␊ |
␉␉if (negative)␊ |
␉␉␉integer = -integer;␊ |
␉␉␊ |
␉}␊ |
␉␉␊ |
tmpTag->type = kTagTypeInteger;␊ |
tmpTag->string = (char *)integer;␊ |
tmpTag->tag = 0;␊ |
␉tmpTag->string = (char *)integer;␊ |
␉tmpTag->tag = 0;␊ |
tmpTag->tagNext = 0;␊ |
␊ |
*tag = tmpTag;␊ |
|
{␊ |
long length;␊ |
TagPtr tmpTag;␊ |
␊ |
␊ |
length = FixDataMatchingTag(buffer, kXMLTagData);␊ |
if (length == -1) return -1;␊ |
␊ |
tmpTag = NewTag();␊ |
if (tmpTag == 0) return -1;␊ |
␊ |
␉//printf("ParseTagData unimplimented\n");␊ |
␉//printf("Data: %s\n", buffer);␊ |
␉//␉getc();␊ |
␉␊ |
␉// TODO: base64 decode␊ |
␉␊ |
␉char* string = NewSymbol(buffer);␊ |
tmpTag->type = kTagTypeData;␊ |
tmpTag->string = 0;␊ |
tmpTag->string = string;␊ |
tmpTag->tag = 0;␊ |
tmpTag->tagNext = 0;␊ |
␊ |
|
tmpTag = NewTag();␊ |
if (tmpTag == 0) return -1;␊ |
␊ |
␉printf("ParseTagDate unimplimented\n");␊ |
␉getc();␊ |
␉␊ |
tmpTag->type = kTagTypeDate;␊ |
tmpTag->string = 0;␊ |
tmpTag->tag = 0;␊ |
|
␊ |
return symbol;␊ |
}␊ |
␊ |
␊ |
␊ |
bool XMLIsType(TagPtr dict, enum xmltype type)␊ |
{␊ |
␉if(!dict) return (type == kTagTypeNone);␊ |
␉return (dict->type == type);␊ |
}␊ |
␊ |
␊ |
/*** Cast functions ***/␊ |
TagPtr XMLCastArray(TagPtr dict)␊ |
{␊ |
␉if(!dict) return NULL;␊ |
␉if(dict->type == kTagTypeArray) return dict;␊ |
␉else return NULL;␊ |
}␊ |
␊ |
␊ |
TagPtr XMLCastDict(TagPtr dict)␊ |
{␊ |
␉if(!dict) return NULL;␊ |
␉if(dict->type == kTagTypeDict) return dict;␊ |
␉else return NULL;␊ |
}␊ |
␊ |
char* XMLCastString(TagPtr dict)␊ |
{␊ |
␉if(!dict) return NULL;␊ |
␊ |
␉if((dict->type == kTagTypeString) ||␊ |
␉ (dict->type == kTagTypeKey)) return dict->string;␊ |
␉␊ |
␉return NULL;␊ |
}␊ |
␊ |
bool XMLCastBoolean(TagPtr dict)␊ |
{␊ |
␉if(!dict) return false;␊ |
␉if(dict->type == kTagTypeTrue) return true;␊ |
␉return false;␊ |
}␊ |
␊ |
int XMLCastInteger(TagPtr dict)␊ |
{␊ |
␉if(!dict) return 0;␊ |
␉if(dict->type == kTagTypeInteger) return (int)dict->string;␊ |
␉return 0;␊ |
}␊ |