static void writeNSizResource(NSizResource* data, char* buffer) { char itemBuffer[1024]; char* sha1Buffer; (*buffer) = '\0'; itemBuffer[0] = '\0'; strcat(buffer, plistHeader); if(data->sha1Digest != NULL) { sha1Buffer = convertBase64(data->sha1Digest, 20, 1, 42); sprintf(itemBuffer, "\t<key>SHA-1-digest</key>\n\t<data>\n%s\t</data>\n", sha1Buffer); free(sha1Buffer); strcat(buffer, itemBuffer); } sprintf(itemBuffer, "\t<key>block-checksum-2</key>\n\t<integer>%d</integer>\n", (int32_t)(data->blockChecksum2)); strcat(buffer, itemBuffer); if(data->isVolume) { sprintf(itemBuffer, "\t<key>bytes</key>\n\t<integer>%d</integer>\n", (int32_t)(data->bytes)); strcat(buffer, itemBuffer); sprintf(itemBuffer, "\t<key>date</key>\n\t<integer>%d</integer>\n", (int32_t)(data->modifyDate)); strcat(buffer, itemBuffer); } sprintf(itemBuffer, "\t<key>part-num</key>\n\t<integer>%d</integer>\n", (int32_t)(data->partitionNumber)); strcat(buffer, itemBuffer); sprintf(itemBuffer, "\t<key>version</key>\n\t<integer>%d</integer>\n", (int32_t)(data->version)); strcat(buffer, itemBuffer); if(data->isVolume) { sprintf(itemBuffer, "\t<key>bytes</key>\n\t<integer>%d</integer>\n", (int32_t)(data->volumeSignature)); strcat(buffer, itemBuffer); } strcat(buffer, plistFooter); }
char* getXmlFromDictionary(Dictionary* myself, int tabsCount) { char tabs[100]; char buffer[4096]; char* toReturn; char* ret; size_t toReturnSize; int i; DictValue* curValue; tabs[0] = '\0'; for(i = 0; i < tabsCount; i++) { strcat(tabs, "\t"); } sprintf(buffer, "%s<dict>\n", tabs); toReturnSize = sizeof(char) * (strlen(buffer) + 1); toReturn = malloc(toReturnSize); toReturn = strcpy(toReturn, buffer); curValue = myself->values; while(curValue != NULL) { sprintf(buffer, "%s\t<key>%s</key>\n", tabs, curValue->key); toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); if(curValue->type == DictionaryType) { ret = getXmlFromDictionary((Dictionary*)curValue, tabsCount + 1); toReturnSize += sizeof(char) * (strlen(ret) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, ret); free(ret); } else if(curValue->type == StringType) { sprintf(buffer, "%s\t<string>%s</string>\n", tabs, ((StringValue*)curValue)->value); toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); } else if(curValue->type == DataType) { char* base64 = convertBase64(((DataValue*)curValue)->value, ((DataValue*)curValue)->len, 0, -1); sprintf(buffer, "%s\t<data>", tabs); toReturnSize += sizeof(char) * (strlen(buffer) + strlen(base64) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); toReturn = strcat(toReturn, base64); sprintf(buffer, "</data>\n", tabs); toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); free(base64); } else if(curValue->type == IntegerType) { sprintf(buffer, "%s\t<integer>%d</integer>\n", tabs, ((IntegerValue*)curValue)->value); toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); } else if(curValue->type == ArrayType) { ret = getXmlFromArrayValue((ArrayValue*)curValue, tabsCount + 1); toReturnSize += sizeof(char) * (strlen(ret) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, ret); free(ret); } else if(curValue->type == BoolType) { if(((BoolValue*)curValue)->value) { sprintf(buffer, "%s\t<true/>\n", tabs); } else { sprintf(buffer, "%s\t<false/>\n", tabs); } toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); } curValue = curValue->next; } sprintf(buffer, "%s</dict>\n", tabs); toReturnSize += sizeof(char) * (strlen(buffer) + 1); toReturn = realloc(toReturn, toReturnSize); toReturn = strcat(toReturn, buffer); return toReturn; }