static void tf_json_append_list(const gchar *name, const gchar *value, gsize value_len, json_state_t *state) { tf_json_append_key(name, state); g_string_append_c(state->buffer, ':'); g_string_append_c(state->buffer, '['); ListScanner scanner; gboolean first = TRUE; list_scanner_init(&scanner); list_scanner_input_string(&scanner, value, value_len); while (list_scanner_scan_next(&scanner)) { if (!first) g_string_append_c(state->buffer, ','); else first = FALSE; g_string_append_c(state->buffer, '"'); tf_json_append_escaped(state->buffer, list_scanner_get_current_value(&scanner), -1); g_string_append_c(state->buffer, '"'); } list_scanner_deinit(&scanner); g_string_append_c(state->buffer, ']'); }
static void tf_json_append_key(const gchar *name, json_state_t *state) { if (state->need_comma) g_string_append_c(state->buffer, ','); g_string_append_c(state->buffer, '"'); tf_json_append_escaped(state->buffer, name, -1); g_string_append_c(state->buffer, '"'); }
static gboolean tf_json_append_value(const gchar *name, const gchar *value, gsize value_len, json_state_t *state, gboolean quoted) { if (state->need_comma) g_string_append_c(state->buffer, ','); g_string_append_c(state->buffer, '"'); tf_json_append_escaped(state->buffer, name, -1); if (quoted) g_string_append(state->buffer, "\":\""); else g_string_append(state->buffer, "\":"); tf_json_append_escaped(state->buffer, value, value_len); if (quoted) g_string_append_c(state->buffer, '"'); return TRUE; }
static void tf_json_append_value(const gchar *name, const gchar *value, gsize value_len, json_state_t *state, gboolean quoted) { tf_json_append_key(name, state); if (quoted) g_string_append(state->buffer, ":\""); else g_string_append_c(state->buffer, ':'); tf_json_append_escaped(state->buffer, value, value_len); if (quoted) g_string_append_c(state->buffer, '"'); }
static gboolean tf_json_obj_start(const gchar *name, const gchar *prefix, gpointer *prefix_data, const gchar *prev, gpointer *prev_data, gpointer user_data) { json_state_t *state = (json_state_t *)user_data; if (state->need_comma) g_string_append_c(state->buffer, ','); if (name) { g_string_append_c(state->buffer, '"'); tf_json_append_escaped(state->buffer, name, -1); g_string_append(state->buffer, "\":{"); } else g_string_append_c(state->buffer, '{'); state->need_comma = FALSE; return FALSE; }