static tb_bool_t tb_oc_json_writer_func_array(tb_oc_json_writer_t* writer, tb_object_ref_t object, tb_size_t level) { // check tb_assert_and_check_return_val(writer && writer->stream, tb_false); // writ if (tb_oc_array_size(object)) { // writ beg if (tb_stream_printf(writer->stream, "[") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // walk tb_for_all (tb_object_ref_t, item, tb_oc_array_itor(object)) { // item if (item) { // func tb_oc_json_writer_func_t func = tb_oc_json_writer_func(item->type); tb_assert_and_check_continue(func); // writ tab if (item_itor != item_head) { if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, ",") < 0) return tb_false; if (!tb_oc_writer_tab(writer->stream, writer->deflate, 1)) return tb_false; } else if (!tb_oc_writer_tab(writer->stream, writer->deflate, level + 1)) return tb_false; // writ if (!func(writer, item, level + 1)) return tb_false; } } // writ end if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "]") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } else { if (tb_stream_printf(writer->stream, "[]") < 0) return tb_false;
static tb_bool_t tb_oc_xml_writer_func_date(tb_oc_xml_writer_t* writer, tb_object_ref_t object, tb_size_t level) { // check tb_assert_and_check_return_val(writer && writer->stream, tb_false); // no empty? tb_time_t time = tb_oc_date_time(object); if (time > 0) { // writ beg if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<date>") < 0) return tb_false; // writ date tb_tm_t date = {0}; if (tb_localtime(time, &date)) { if (tb_stream_printf(writer->stream, "%04ld-%02ld-%02ld %02ld:%02ld:%02ld" , date.year , date.month , date.mday , date.hour , date.minute , date.second) < 0) return tb_false; } // writ end if (tb_stream_printf(writer->stream, "</date>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } else { // writ if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<date/>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } // ok return tb_true; }
/* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ static tb_bool_t tb_oc_json_writer_func_null(tb_oc_json_writer_t* writer, tb_object_ref_t object, tb_size_t level) { // check tb_assert_and_check_return_val(writer && writer->stream, tb_false); // writ if (tb_stream_printf(writer->stream, "null") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // ok return tb_true; }
static tb_bool_t tb_oc_xml_writer_func_data(tb_oc_xml_writer_t* writer, tb_object_ref_t object, tb_size_t level) { // check tb_assert_and_check_return_val(writer && writer->stream, tb_false); // no empty? if (tb_oc_data_size(object)) { // writ beg if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<data>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // decode base64 data tb_byte_t const* ib = (tb_byte_t const*)tb_oc_data_getp(object); tb_size_t in = tb_oc_data_size(object); tb_size_t on = in << 1; tb_char_t* ob = tb_malloc0_cstr(on); tb_assert_and_check_return_val(ob && on, tb_false); on = tb_base64_encode(ib, in, ob, on); tb_trace_d("base64: %u => %u", in, on); // writ data tb_char_t const* p = ob; tb_char_t const* e = ob + on; tb_size_t n = 0; for (; p < e && *p; p++, n++) { if (!(n & 63)) { if (n) if (!tb_oc_writer_newline(writer->stream, writer->deflate)) break; if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) break; } if (tb_stream_printf(writer->stream, "%c", *p) < 0) break; } // free the data tb_free(ob); // check tb_check_return_val(p == e, tb_false); // writ newline if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // writ end if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "</data>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } else { // writ if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<data/>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } // ok return tb_true; }