static long ParseXML( char * buffer, ModulePtr * module, TagPtr * personalities ) { long length, pos; TagPtr moduleDict, required; ModulePtr tmpModule; pos = 0; while (1) { length = XMLParseNextTag(buffer + pos, &moduleDict); if (length == -1) break; pos += length; if (moduleDict == 0) continue; if (moduleDict->type == kTagTypeDict) break; XMLFreeTag(moduleDict); } if (length == -1) return -1; required = XMLGetProperty(moduleDict, kPropOSBundleRequired); if ( (required == 0) || (required->type != kTagTypeString) || !strcmp(required->string, "Safe Boot")) { XMLFreeTag(moduleDict); return -2; } tmpModule = (ModulePtr)malloc(sizeof(Module)); if (tmpModule == 0) { XMLFreeTag(moduleDict); return -1; } tmpModule->dict = moduleDict; // For now, load any module that has OSBundleRequired != "Safe Boot". tmpModule->willLoad = 1; *module = tmpModule; // Get the personalities. *personalities = XMLGetProperty(moduleDict, kPropIOKitPersonalities); return 0; }
static long ParseTagList(char *buffer, TagPtr * tag, long type, long empty) { long length, pos = 0; TagPtr tmpTag, tagList = 0; if (!empty) { while (1) { length = XMLParseNextTag(buffer + pos, &tmpTag); if (length == -1) { break; } pos += length; if (tmpTag == 0) { break; } tmpTag->tagNext = tagList; tagList = tmpTag; } if (length == -1) { XMLFreeTag(tagList); return -1; } } tmpTag = NewTag(); if (tmpTag == 0) { XMLFreeTag(tagList); return -1; } tmpTag->type = type; tmpTag->string = 0; tmpTag->tag = tagList; tmpTag->tagNext = 0; *tag = tmpTag; return pos; }
static long ParseTagString( char * buffer, TagPtr * tag ) { long length; char * string; length = FixDataMatchingTag(buffer, kXMLTagString); if (length == -1) return -1; TagPtr tmpTag = NewTag(); if (tmpTag == 0) return -1; string = NewSymbol(buffer); if (string == 0) { XMLFreeTag(tmpTag); return -1; } tmpTag->type = kTagTypeString; tmpTag->string = string; tmpTag->tag = 0; tmpTag->offset = buffer_start ? buffer - buffer_start: 0; tmpTag->tagNext = 0; *tag = tmpTag; return length; }
//#if UNUSED //========================================================================== // XMLParseFile // 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 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; int strlength = strlen(buffer); configBuffer = malloc(strlength+1); bcopy(buffer, configBuffer, strlength); configBuffer[strlength] = 0; buffer_start = configBuffer; while (1) { length = XMLParseNextTag(configBuffer + pos, &tag); if (length == -1) break; pos += length; if (tag == 0) continue; if (tag->type == kTagTypeDict) break; XMLFreeTag(tag); } free(configBuffer); if (length < 0) { return -1; } *dict = tag; return pos; }
//========================================================================== // ParseXMLFile // Modifies the input buffer. // Expects to see one dictionary in the XML file. // Puts the first dictionary it finds in the // tag pointer and returns 0, or returns -1 if not found // (and does not modify dict pointer). // Prints an error message if there is a parsing error. // int ParseXMLFile( 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(configBuffer + pos, &tag); if (length == -1) break; pos += length; if (tag == 0) continue; if (tag->type == kTagTypeDict) break; XMLFreeTag(tag); } free(configBuffer); if (length < 0) { error ("Error parsing plist file\n"); return -1; } *dict = tag; return 0; }
//========================================================================== // XMLParseFile // Expects to see one dictionary in the XML file. // Puts the first dictionary it finds in the // tag pointer and returns 0, or returns -1 if not found. // long XMLParseFile( char * buffer, TagPtr * dict ) { long length, pos; TagPtr tag; pos = 0; while (1) { length = XMLParseNextTag(buffer + pos, &tag); if (length == -1) break; pos += length; if (tag == 0) continue; if (tag->type == kTagTypeDict) break; XMLFreeTag(tag); } if (length < 0) { return -1; } *dict = tag; return 0; }
bool XMLAddTagToDictionary(TagPtr dict, char* key, TagPtr value) { if (!dict || dict->type != kTagTypeDict) return false; TagPtr tmpTag; char* string; tmpTag = NewTag(); if (tmpTag == 0) { return false; } string = NewSymbol(key); if (string == 0) { XMLFreeTag(tmpTag); return false; } tmpTag->type = kTagTypeKey; tmpTag->string = string; tmpTag->tag = value; tmpTag->offset = 0; tmpTag->tagNext = 0; TagPtr tagList = dict->tag; if(!tagList) { // First tag dict->tag = tmpTag; return true; } while(tagList && tagList->tagNext) tagList = tagList->tagNext; if(tagList) { tagList->tagNext = tmpTag; return true; } XMLFreeTag(tmpTag); return false; }
static long ParseTagKey(char *buffer, TagPtr * tag) { long length = FixDataMatchingTag(buffer, kXMLTagKey); if (length == -1) { return -1; } TagPtr subTag; long length2 = XMLParseNextTag(buffer + length, &subTag); if (length2 == -1) { return -1; } TagPtr tmpTag = NewTag(); if (tmpTag == 0) { XMLFreeTag(subTag); return -1; } char *string = NewSymbol(buffer); if (string == 0) { XMLFreeTag(subTag); XMLFreeTag(tmpTag); return -1; } tmpTag->type = kTagTypeKey; tmpTag->string = string; tmpTag->tag = subTag; tmpTag->tagNext = 0; *tag = tmpTag; return length + length2; }
void XMLFreeTag( TagPtr tag ) { #if DOFREE if (tag == 0) return; if (tag->string) FreeSymbol(tag->string); XMLFreeTag(tag->tag); XMLFreeTag(tag->tagNext); // Clear and free the tag. tag->type = kTagTypeNone; tag->string = 0; tag->tag = 0; tag->tagNext = gTagsFree; gTagsFree = tag; #else return; #endif }
/** * prepare_devicetree * * Prepare and flatten the devicetree. */ int prepare_devicetree(void) { void *deviceTreeImage, *deviceTreeData; uint32_t deviceTreeSize, length, pos = 0; Node *root; TagPtr tag; char *xmlRepresentation; deviceTreeImage = get_image3(kImage3TypeXmlDeviceTree); assert(deviceTreeImage != NULL); image3_get_tag_data(deviceTreeImage, kImage3TagData, &deviceTreeData, &deviceTreeSize); /* Create root of DT */ DT__Initialize(); root = DT__RootNode(); xmlRepresentation = (char *)deviceTreeData; /* Enter everything into the DeviceTree. (not mine) */ assert(root); while (1) { length = XMLParseNextTag(xmlRepresentation + pos, &tag); if (length == -1) break; pos += length; if (!tag) continue; if (tag->type == kTagTypeDict) { PopulateDeviceTreeNode(tag, root); XMLFreeTag(tag); return true; } XMLFreeTag(tag); } return false; }
static long ParseTagInteger( char * buffer, TagPtr * tag ) { long length, integer; bool negative = false; TagPtr tmpTag; char* val = buffer; int size; if(buffer[0] == '<') { printf("Warning integer is non existant\n"); getchar(); tmpTag = NewTag(); tmpTag->type = kTagTypeInteger; tmpTag->string = 0; tmpTag->tag = 0; tmpTag->offset = 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); getchar(); XMLFreeTag(tmpTag); return -1; } } } else if ( size ) // Decimal value { if (*val == '-') { negative = true; val++; size--; } for (integer = 0; size > 0; size--) { if(*val) // UGLY HACK, fix me. { if (*val < '0' || *val > '9') { printf("ParseTagInteger decimal error (0x%x) in buffer %s\n", *val, buffer); getchar(); return -1; } integer = (integer * 10) + (*val++ - '0'); } } if (negative) integer = -integer; } tmpTag->type = kTagTypeInteger; tmpTag->string = (char *)integer; tmpTag->tag = 0; tmpTag->offset = buffer_start ? buffer - buffer_start: 0; tmpTag->tagNext = 0; *tag = tmpTag; return length; }