in dmg/resources.c [347:409]
static void readResourceData(ResourceData* data, char** location, char* xmlStart, FlipDataFunc flipData, const unsigned char* key, bool plstNameIsAttribution) {
char* curLoc;
char* tagBegin;
char* tagEnd;
char* dictEnd;
size_t strLen;
char* buffer;
char* encodedStart;
curLoc = *location;
data->name = NULL;
data->attributes = 0;
data->id = 0;
data->data = NULL;
curLoc = strstr(curLoc, "<dict>");
dictEnd = strstr(curLoc, "</dict>"); /* hope there's not a dict type in this resource data! */
while(curLoc != NULL && curLoc < dictEnd) {
curLoc = strstr(curLoc, "<key>");
if(!curLoc)
break;
curLoc += sizeof("<key>") - 1;
tagEnd = strstr(curLoc, "</key>");
strLen = (size_t)(tagEnd - curLoc);
tagBegin = curLoc;
curLoc = tagEnd + sizeof("</key>") - 1;
if(strncmp(tagBegin, "Attributes", strLen) == 0) {
buffer = getXMLString(&curLoc);
sscanf(buffer, "0x%x", &(data->attributes));
free(buffer);
} else if(strncmp(tagBegin, "Data", strLen) == 0) {
encodedStart = 0;
data->data = getXMLData(&curLoc, &(data->dataLength), &encodedStart, &data->dataXmlSize);
data->dataXmlOffset = encodedStart - xmlStart;
if(flipData) {
(*flipData)(data->data, 0);
}
} else if(strncmp(tagBegin, "ID", strLen) == 0) {
buffer = getXMLString(&curLoc);
sscanf(buffer, "%d", &(data->id));
free(buffer);
} else if(strncmp(tagBegin, "Name", strLen) == 0) {
if (strcmp((char*) key, "plst") == 0 && plstNameIsAttribution) {
char *nameEncodedStart;
size_t nameXmlSize;
size_t nameLength;
unsigned char* attributionFromName = getXMLPlstName(&curLoc, &nameLength, &nameEncodedStart, &nameXmlSize);
data->name = attributionFromName;
flipAttributionResource(data->name, 0);
} else {
data->name = getXMLString(&curLoc);
}
}
}
curLoc = dictEnd + sizeof("</dict>") - 1;
*location = curLoc;
}