Files

107 lines
3.5 KiB
C
Raw Permalink Normal View History

2019-09-03 18:40:11 +02:00
#include <xpc/xpc_debug.h>
2019-09-02 19:34:56 +02:00
#include "xpc_internal.h"
#include <stdio.h>
#include <inttypes.h>
2024-06-22 19:45:25 +10:00
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);
2019-09-02 19:34:56 +02:00
2024-06-22 19:45:25 +10:00
void xpc_debug_print(xpc_object_t obj, xpc_debug_write out, void *userData) {
2019-09-02 19:34:56 +02:00
char buf[64];
2019-09-04 20:28:17 +02:00
unsigned char *dat;
2019-09-02 19:34:56 +02:00
struct xpc_value *val = (struct xpc_value *) obj;
switch (val->type) {
case XPC_BOOL:
if (XPC_VALUE(val, bool))
2024-06-22 19:45:25 +10:00
out("true", userData);
2019-09-02 19:34:56 +02:00
else
2024-06-22 19:45:25 +10:00
out("false", userData);
2019-09-02 19:34:56 +02:00
break;
case XPC_INT64:
snprintf(buf, sizeof(buf), "%" PRIi64, XPC_VALUE(val, int64_t));
2024-06-22 19:45:25 +10:00
out(buf, userData);
2019-09-02 19:34:56 +02:00
break;
case XPC_UINT64:
2024-06-22 19:45:25 +10:00
snprintf(buf, sizeof(buf), "%" PRIu64, XPC_VALUE(val, uint64_t));
out(buf, userData);
2019-09-02 19:34:56 +02:00
break;
case XPC_DOUBLE:
snprintf(buf, sizeof(buf), "%lf", XPC_VALUE(val, double));
2024-06-22 19:45:25 +10:00
out(buf, userData);
2019-09-02 19:34:56 +02:00
break;
2019-09-03 13:24:58 +02:00
case XPC_DATA:
snprintf(buf, sizeof(buf), "<binary data %li>", xpc_data_get_length(obj));
2024-06-22 19:45:25 +10:00
out(buf, userData); //TODO: could have more than 64 bytes of data here
2019-09-03 13:24:58 +02:00
break;
case XPC_STRING:
2024-06-22 19:45:25 +10:00
out("\"", userData);
out(xpc_string_get_string_ptr(obj), userData);
out("\"", userData);
2019-09-03 13:24:58 +02:00
break;
2019-09-04 20:16:05 +02:00
case XPC_UUID:
2019-09-04 20:28:17 +02:00
dat = (unsigned char *) val->value;
2024-06-22 19:45:25 +10:00
snprintf(buf, sizeof(buf), "\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\"",
2019-09-04 20:28:17 +02:00
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]);
2024-06-22 19:45:25 +10:00
out(buf, userData);
2019-09-04 20:16:05 +02:00
break;
2019-09-04 19:41:26 +02:00
case XPC_ARRAY:
2024-06-22 19:45:25 +10:00
_xpc_debug_print_array(obj, out, userData);
2019-09-04 19:41:26 +02:00
break;
2019-09-02 19:34:56 +02:00
case XPC_DICTIONARY:
2024-06-22 19:45:25 +10:00
_xpc_debug_print_dict(obj, out, userData);
2019-09-02 19:34:56 +02:00
break;
}
}
2024-06-22 19:45:25 +10:00
static void _xpc_debug_print_array(xpc_object_t obj, xpc_debug_write out, void *userData) {
2019-09-04 19:41:26 +02:00
struct xpc_array *arr = (struct xpc_array *) obj;
int i;
2024-06-22 19:45:25 +10:00
out("[", userData);
2019-09-04 19:41:26 +02:00
bool first = true;
for (i = 0; i < arr->count; ++i) {
if (!first)
2024-06-22 19:45:25 +10:00
out(", ", userData);
2019-09-04 19:41:26 +02:00
first = false;
2024-06-22 19:45:25 +10:00
xpc_debug_print(arr->value[i], out, userData);
2019-09-04 19:41:26 +02:00
}
2024-06-22 19:45:25 +10:00
out("]", userData);
2019-09-04 19:41:26 +02:00
}
2024-06-22 19:45:25 +10:00
static void _xpc_debug_print_dict(xpc_object_t obj, xpc_debug_write out, void *userData) {
2019-09-02 19:34:56 +02:00
struct xpc_dict *dict = (struct xpc_dict *) obj;
int i;
struct xpc_dict_el *el;
2024-06-22 19:45:25 +10:00
out("{", userData);
2019-09-02 19:34:56 +02:00
bool first = true;
for (i = 0; i < XPC_DICT_NBUCKETS; ++i) {
el = dict->buckets[i];
while (el) {
if (!first)
2024-06-22 19:45:25 +10:00
out(", \"", userData);
else
out("\"", userData);
2019-09-02 19:34:56 +02:00
first = false;
2024-06-22 19:45:25 +10:00
out(el->key, userData);
out("\": ", userData);
xpc_debug_print(el->value, out, userData);
2019-09-02 19:34:56 +02:00
el = el->next;
}
}
2024-06-22 19:45:25 +10:00
out("}", userData);
2019-09-02 19:34:56 +02:00
}
2024-06-22 19:45:25 +10:00
static void _xpc_write(const char *str, void *userData) {
fputs(str, userData);
2019-09-02 19:34:56 +02:00
}
void xpc_debug_print_stdout(xpc_object_t obj) {
2024-06-22 19:45:25 +10:00
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);
}