Files
libxpc/src/xpc_debug.c
Orlando Chamberlain 6adba5bac7 temp
i think some of these changes might be by mrarm not me
2024-06-22 19:45:25 +10:00

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);
}