#include <CoreFoundation/CoreFoundation.h>
#include "format.h"
static void
_format_dict(const void *key, const void *value, void *context)
{
CFStringRef valstr, str;
valstr = format_small(value);
str = CFStringCreateWithFormat(NULL, NULL, CFSTR("'%@': %@"), key, valstr);
CFArrayAppendValue(context, str);
CFRelease(str);
CFRelease(valstr);
}
static void
_format_array(const void *value, void *context)
{
CFStringRef valstr;
valstr = format_small(value);
CFArrayAppendValue(context, valstr);
CFRelease(valstr);
}
CFStringRef
format_small(CFTypeRef obj)
{
CFTypeID type;
CFStringRef result;
type = CFGetTypeID(obj);
if (type == CFDictionaryGetTypeID()) {
CFMutableArrayRef items;
CFStringRef combined;
items = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
CFDictionaryApplyFunction(obj, _format_dict, items);
combined = CFStringCreateByCombiningStrings(NULL, items, CFSTR(", "));
CFRelease(items);
result = CFStringCreateWithFormat(NULL, NULL, CFSTR("{%@}"), combined);
CFRelease(combined);
} else if (type == CFArrayGetTypeID()) {
if (CFArrayGetCount(obj) == 1) {
result = CFStringCreateWithFormat(NULL, NULL, CFSTR("'%@'"), CFArrayGetValueAtIndex(obj, 0));
} else {
CFMutableArrayRef items;
CFStringRef combined;
items = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
CFArrayApplyFunction(obj, CFRangeMake(0, CFArrayGetCount(obj)), _format_array, items);
combined = CFStringCreateByCombiningStrings(NULL, items, CFSTR(", "));
CFRelease(items);
result = CFStringCreateWithFormat(NULL, NULL, CFSTR("[%@]"), combined);
CFRelease(combined);
}
} else {
result = CFStringCreateWithFormat(NULL, NULL, CFSTR("'%@'"), obj);
}
return result;
}