summaryrefslogtreecommitdiffstats
path: root/src/util/support/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/support/json.c')
-rw-r--r--src/util/support/json.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/util/support/json.c b/src/util/support/json.c
index 5151b84159..e3edffd7cd 100644
--- a/src/util/support/json.c
+++ b/src/util/support/json.c
@@ -167,6 +167,13 @@ k5_json_null_create(k5_json_null *val_out)
return (*val_out == NULL) ? ENOMEM : 0;
}
+int
+k5_json_null_create_val(k5_json_value *val_out)
+{
+ *val_out = alloc_value(&null_type, 0);
+ return (*val_out == NULL) ? ENOMEM : 0;
+}
+
/*** Boolean type ***/
static struct json_type_st bool_type = { K5_JSON_TID_BOOL, "bool", NULL };
@@ -265,6 +272,92 @@ k5_json_array_set(k5_json_array array, size_t idx, k5_json_value val)
array->values[idx] = k5_json_retain(val);
}
+int
+k5_json_array_fmt(k5_json_array *array_out, const char *template, ...)
+{
+ const char *p;
+ va_list ap;
+ const char *cstring;
+ unsigned char *data;
+ size_t len;
+ long long nval;
+ k5_json_array array;
+ k5_json_value val;
+ k5_json_number num;
+ k5_json_string str;
+ k5_json_bool b;
+ k5_json_null null;
+ int truth, ret;
+
+ *array_out = NULL;
+ if (k5_json_array_create(&array))
+ return ENOMEM;
+ va_start(ap, template);
+ for (p = template; *p != '\0'; p++) {
+ switch (*p) {
+ case 'v':
+ val = k5_json_retain(va_arg(ap, k5_json_value));
+ break;
+ case 'n':
+ if (k5_json_null_create(&null))
+ goto err;
+ val = null;
+ break;
+ case 'b':
+ truth = va_arg(ap, int);
+ if (k5_json_bool_create(truth, &b))
+ goto err;
+ val = b;
+ break;
+ case 'i':
+ nval = va_arg(ap, int);
+ if (k5_json_number_create(nval, &num))
+ goto err;
+ val = num;
+ break;
+ case 'L':
+ nval = va_arg(ap, long long);
+ if (k5_json_number_create(nval, &num))
+ goto err;
+ val = num;
+ break;
+ case 's':
+ cstring = va_arg(ap, const char *);
+ if (cstring == NULL) {
+ if (k5_json_null_create(&null))
+ goto err;
+ val = null;
+ } else {
+ if (k5_json_string_create(cstring, &str))
+ goto err;
+ val = str;
+ }
+ break;
+ case 'B':
+ data = va_arg(ap, unsigned char *);
+ len = va_arg(ap, size_t);
+ if (k5_json_string_create_base64(data, len, &str))
+ goto err;
+ val = str;
+ break;
+ default:
+ goto err;
+ }
+ ret = k5_json_array_add(array, val);
+ k5_json_release(val);
+ if (ret)
+ goto err;
+ }
+ va_end(ap);
+ *array_out = array;
+ return 0;
+
+err:
+ va_end(ap);
+ k5_json_release(array);
+ return ENOMEM;
+}
+
/*** Object type (string:value mapping) ***/
struct entry {