#include #include "xpc_internal.h" #include #include static void _xpc_debug_print_array(xpc_object_t obj, xpc_debug_write out, void *userData); static void _xpc_debug_print_dict(xpc_object_t obj, xpc_debug_write out, void *userData); void xpc_debug_print(xpc_object_t obj, xpc_debug_write out, void *userData) { char buf[64]; unsigned char *dat; struct xpc_value *val = (struct xpc_value *) obj; switch (val->type) { case XPC_BOOL: if (XPC_VALUE(val, bool)) out("true", userData); else out("false", userData); break; case XPC_INT64: snprintf(buf, sizeof(buf), "%" PRIi64, XPC_VALUE(val, int64_t)); out(buf, userData); break; case XPC_UINT64: snprintf(buf, sizeof(buf), "%" PRIu64, XPC_VALUE(val, uint64_t)); out(buf, userData); break; case XPC_DOUBLE: snprintf(buf, sizeof(buf), "%lf", XPC_VALUE(val, double)); out(buf, userData); break; case XPC_DATA: snprintf(buf, sizeof(buf), "", xpc_data_get_length(obj)); out(buf, userData); //TODO: could have more than 64 bytes of data here break; case XPC_STRING: out("\"", userData); out(xpc_string_get_string_ptr(obj), userData); out("\"", userData); break; case XPC_UUID: dat = (unsigned char *) val->value; snprintf(buf, sizeof(buf), "\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\"", dat[0], dat[1], dat[2], dat[3], dat[4], dat[5], dat[6], dat[7], dat[8], dat[9], dat[10], dat[11], dat[12], dat[13], dat[14], dat[15]); out(buf, userData); break; case XPC_ARRAY: _xpc_debug_print_array(obj, out, userData); break; case XPC_DICTIONARY: _xpc_debug_print_dict(obj, out, userData); break; } } static void _xpc_debug_print_array(xpc_object_t obj, xpc_debug_write out, void *userData) { struct xpc_array *arr = (struct xpc_array *) obj; int i; out("[", userData); bool first = true; for (i = 0; i < arr->count; ++i) { if (!first) out(", ", userData); first = false; xpc_debug_print(arr->value[i], out, userData); } out("]", userData); } static void _xpc_debug_print_dict(xpc_object_t obj, xpc_debug_write out, void *userData) { struct xpc_dict *dict = (struct xpc_dict *) obj; int i; struct xpc_dict_el *el; out("{", userData); bool first = true; for (i = 0; i < XPC_DICT_NBUCKETS; ++i) { el = dict->buckets[i]; while (el) { if (!first) out(", \"", userData); else out("\"", userData); first = false; out(el->key, userData); out("\": ", userData); xpc_debug_print(el->value, out, userData); el = el->next; } } out("}", userData); } static void _xpc_write(const char *str, void *userData) { fputs(str, userData); } void xpc_debug_print_stdout(xpc_object_t obj) { xpc_debug_print_helper(obj, stdout); //xpc_debug_print(obj, _xpc_write, stdout); //fputc('\n', stdout); } void xpc_debug_print_helper(xpc_object_t obj, FILE *outFile) { xpc_debug_print(obj, _xpc_write, outFile); fputc('\n', outFile); }