int w_bser_dump(const bser_ctx_t* ctx, json_t *json, void *data) { int type = json_typeof(json); if (!is_bser_version_supported(ctx)) { return -1; } switch (type) { case JSON_NULL: return ctx->dump(&bser_null, sizeof(bser_null), data); case JSON_TRUE: return ctx->dump(&bser_true, sizeof(bser_true), data); case JSON_FALSE: return ctx->dump(&bser_false, sizeof(bser_false), data); case JSON_REAL: return bser_real(ctx, json_real_value(json), data); case JSON_INTEGER: return bser_int(ctx, json_integer_value(json), data); case JSON_STRING: return bser_bytestring(ctx, json_string_value(json), data); case JSON_ARRAY: return bser_array(ctx, json, data); case JSON_OBJECT: return bser_object(ctx, json, data); default: return -1; } }
int w_bser_dump(json_t *json, json_dump_callback_t dump, void *data) { int type = json_typeof(json); switch (type) { case JSON_NULL: return dump(&bser_null, sizeof(bser_null), data); case JSON_TRUE: return dump(&bser_true, sizeof(bser_true), data); case JSON_FALSE: return dump(&bser_false, sizeof(bser_false), data); case JSON_REAL: return bser_real(json_real_value(json), dump, data); case JSON_INTEGER: return bser_int(json_integer_value(json), dump, data); case JSON_STRING: return bser_string(json_string_value(json), dump, data); case JSON_ARRAY: return bser_array(json, dump, data); case JSON_OBJECT: return bser_object(json, dump, data); default: return -1; } }
static int bser_template(const bser_ctx_t *ctx, const json_t *array, const json_t *templ, void *data) { size_t n = json_array_size(array); size_t i, pn; if (!is_bser_version_supported(ctx)) { return -1; } if (ctx->dump(&bser_template_hdr, sizeof(bser_template_hdr), data)) { return -1; } // The template goes next if (bser_array(ctx, templ, data)) { return -1; } // Now the array of arrays of object values. // How many objects if (bser_int(ctx, n, data)) { return -1; } pn = json_array_size(templ); // For each object for (i = 0; i < n; i++) { json_t *obj = json_array_get(array, i); size_t pi; // For each factored key for (pi = 0; pi < pn; pi++) { const char *key = json_string_value(json_array_get(templ, pi)); json_t *val; // Look up the object property val = json_object_get(obj, key); if (!val) { // property not set on this one; emit a skip if (ctx->dump(&bser_skip, sizeof(bser_skip), data)) { return -1; } continue; } // Emit value if (w_bser_dump(ctx, val, data)) { return -1; } } } return 0; }