jsonlite_result jsonlite_builder_double(jsonlite_builder builder, double value) { jsonlite_write_state *ws; char buff[128]; int size = 0; if (builder == NULL) { return jsonlite_result_invalid_argument; } ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_value) ) { jsonlite_builder_prepare_value_writing(builder); size = sprintf(buff, builder->doubleFormat, value); jsonlite_builder_raw(builder, buff, size); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only) ) { ws->accept = jsonlite_accept_continue_array; } else { ws->accept = jsonlite_accept_continue_object; } return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_raw_key(jsonlite_builder builder, const void *data, size_t length) { jsonlite_write_state *ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_key)) { if (jsonlite_builder_accept(builder, jsonlite_accept_next)) { jsonlite_builder_raw(builder, ",", 1); } if (builder->indentation != 0) { jsonlite_builder_raw_char(builder, '\r'); jsonlite_builder_repeat(builder, ' ', (builder->state - builder->stack) * builder->indentation); } jsonlite_builder_raw_char(builder, '\"'); jsonlite_builder_raw(builder, data, length); jsonlite_builder_raw_char(builder, '\"'); if (builder->indentation != 0) { jsonlite_builder_raw(builder, ": ", 2); } else { jsonlite_builder_raw_char(builder, ':'); } *ws = jsonlite_accept_value; return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_key(jsonlite_builder builder, const char *data, size_t length) { jsonlite_write_state *ws; if (builder == NULL || data == NULL) { return jsonlite_result_invalid_argument; } ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_key) ) { if (jsonlite_builder_accept(builder, jsonlite_accept_next) ) { jsonlite_builder_raw_char(builder, ','); } if (builder->indentation != 0) { jsonlite_builder_raw_char(builder, '\r'); jsonlite_builder_repeat(builder, ' ', (builder->state - builder->stack) * builder->indentation); } jsonlite_builder_write_uft8(builder, data, length); if (builder->indentation != 0) { jsonlite_builder_raw(builder, ": ", 2); } else { jsonlite_builder_raw_char(builder, ':'); } ws->accept = jsonlite_accept_value; return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_base64_value(jsonlite_builder builder, const void *data, size_t length) { jsonlite_write_state *ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_value)) { jsonlite_builder_prepare_value_writing(builder); jsonlite_builder_write_base64(builder, data, length); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only)) { *ws = jsonlite_accept_continue_array; } else { *ws = jsonlite_accept_continue_object; } return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_false(jsonlite_builder builder) { static const char value[] = "false"; jsonlite_write_state *ws = builder->state; if (!(jsonlite_builder_accept(builder, jsonlite_accept_value))) { return jsonlite_result_not_allowed; } jsonlite_builder_prepare_value_writing(builder); jsonlite_builder_raw(builder, (char *)value, sizeof(value) - 1); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only)) { *ws = jsonlite_accept_continue_array; } else { *ws = jsonlite_accept_continue_object; } return jsonlite_result_ok; }
static void jsonlite_builder_prepare_value_writing(jsonlite_builder builder) { jsonlite_write_state *ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_values_only) ) { if (jsonlite_builder_accept(builder, jsonlite_accept_next) ) { jsonlite_builder_raw_char(builder, ','); } if (builder->indentation != 0) { jsonlite_builder_raw_char(builder, '\r'); jsonlite_builder_repeat(builder, ' ', (builder->state - builder->stack) * builder->indentation); } } else { ws->accept &= ~jsonlite_accept_value; ws->accept |= jsonlite_accept_key; } ws->accept |= jsonlite_accept_next; }
static void jsonlite_builder_pop_state(jsonlite_builder builder) { jsonlite_write_state *ws = --builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_values_only)) { *ws = jsonlite_accept_continue_array; } else { *ws = jsonlite_accept_continue_object; } }
jsonlite_result jsonlite_builder_double(jsonlite_builder builder, double value) { char buff[64]; size_t size = 0; jsonlite_write_state *ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_value)) { jsonlite_builder_prepare_value_writing(builder); size = sprintf(buff, builder->doubleFormat, value); jsonlite_builder_raw(builder, buff, size); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only)) { *ws = jsonlite_accept_continue_array; } else { *ws = jsonlite_accept_continue_object; } return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_object_begin(jsonlite_builder builder) { jsonlite_builder_check_depth(); if (jsonlite_builder_accept(builder, jsonlite_accept_object_begin)) { jsonlite_builder_prepare_value_writing(builder); *++builder->state = jsonlite_accept_object_end | jsonlite_accept_key; jsonlite_builder_raw_char(builder, '{'); return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_array_end(jsonlite_builder builder) { if (jsonlite_builder_accept(builder, jsonlite_accept_array_end)) { jsonlite_builder_pop_state(builder); if (builder->indentation != 0) { jsonlite_builder_raw_char(builder, '\r'); jsonlite_builder_repeat(builder, ' ', (builder->state - builder->stack) * builder->indentation); } jsonlite_builder_raw_char(builder, ']'); return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_raw_value(jsonlite_builder builder, const void *data, size_t length) { jsonlite_write_state *ws; if (builder == NULL || data == NULL || length == 0) { return jsonlite_result_invalid_argument; } ws = builder->state; if (jsonlite_builder_accept(builder, jsonlite_accept_value) ) { jsonlite_builder_prepare_value_writing(builder); jsonlite_builder_raw(builder, data, length); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only) ) { ws->accept = jsonlite_accept_continue_array; } else { ws->accept = jsonlite_accept_continue_object; } return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_null(jsonlite_builder builder) { static const char value[] = "null"; jsonlite_write_state *ws; if (builder == NULL) { return jsonlite_result_invalid_argument; } ws = builder->state; if (!(jsonlite_builder_accept(builder, jsonlite_accept_value) )) { return jsonlite_result_not_allowed; } jsonlite_builder_prepare_value_writing(builder); jsonlite_builder_raw(builder, (char *)value, sizeof(value) - 1); if (jsonlite_builder_accept(builder, jsonlite_accept_values_only) ) { ws->accept = jsonlite_accept_continue_array; } else { ws->accept = jsonlite_accept_continue_object; } return jsonlite_result_ok; }
jsonlite_result jsonlite_builder_object_end(jsonlite_builder builder) { if (builder == NULL) { return jsonlite_result_invalid_argument; } if (jsonlite_builder_accept(builder, jsonlite_accept_object_end)) { jsonlite_builder_pop_state(builder); if (builder->indentation != 0) { jsonlite_builder_raw_char(builder, '\r'); jsonlite_builder_repeat(builder, ' ', (builder->state - builder->stack) * builder->indentation); } jsonlite_builder_raw_char(builder, '}'); return jsonlite_result_ok; } return jsonlite_result_not_allowed; }
jsonlite_result jsonlite_builder_object_begin(jsonlite_builder builder) { if (builder == NULL) { return jsonlite_result_invalid_argument; } jsonlite_builder_check_depth(); if (jsonlite_builder_accept(builder, jsonlite_accept_object_begin)) { jsonlite_builder_prepare_value_writing(builder); jsonlite_builder_push_state(builder); builder->state->accept = jsonlite_accept_object_end | jsonlite_accept_key; jsonlite_builder_raw_char(builder, '{'); return jsonlite_result_ok; } return jsonlite_result_not_allowed; }