mirror of
https://github.com/t2linux/libxpc.git
synced 2026-04-30 13:54:02 -07:00
6adba5bac7
i think some of these changes might be by mrarm not me
107 lines
3.5 KiB
C
107 lines
3.5 KiB
C
#include <xpc/xpc_debug.h>
|
|
#include "xpc_internal.h"
|
|
#include <stdio.h>
|
|
#include <inttypes.h>
|
|
|
|
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), "<binary data %li>", 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);
|
|
}
|
|
|