static tb_object_ref_t tb_object_xplist_reader_func_string(tb_object_xplist_reader_t* reader, tb_size_t event) { // check tb_assert_and_check_return_val(reader && reader->reader && event, tb_null); // empty? if (event == TB_XML_READER_EVENT_ELEMENT_EMPTY) return tb_object_string_init_from_cstr(tb_null); // done tb_bool_t leave = tb_false; tb_object_ref_t string = tb_null; while (!leave && (event = tb_xml_reader_next(reader->reader))) { switch (event) { case TB_XML_READER_EVENT_ELEMENT_END: { // name tb_char_t const* name = tb_xml_reader_element(reader->reader); tb_assert_and_check_break_state(name, leave, tb_true); // is end? if (!tb_stricmp(name, "string")) { // empty? if (!string) string = tb_object_string_init_from_cstr(tb_null); // leave it leave = tb_true; } } break; case TB_XML_READER_EVENT_TEXT: { // text tb_char_t const* text = tb_xml_reader_text(reader->reader); tb_assert_and_check_break_state(text, leave, tb_true); tb_trace_d("string: %s", text); // string string = tb_object_string_init_from_cstr(text); tb_assert_and_check_break_state(string, leave, tb_true); } break; default: break; } } // ok? return string; }
static tb_object_ref_t tb_object_bin_reader_func_string(tb_object_bin_reader_t* reader, tb_size_t type, tb_uint64_t size) { // check tb_assert_and_check_return_val(reader && reader->stream && reader->list, tb_null); // empty? if (!size) return tb_object_string_init_from_cstr(tb_null); // make data tb_char_t* data = tb_malloc0_cstr((tb_size_t)size + 1); tb_assert_and_check_return_val(data, tb_null); // read data if (!tb_stream_bread(reader->stream, (tb_byte_t*)data, (tb_size_t)size)) { tb_free(data); return tb_null; } // decode string { tb_byte_t* pb = (tb_byte_t*)data; tb_byte_t* pe = (tb_byte_t*)data + size; tb_byte_t xb = (tb_byte_t)(((size >> 8) & 0xff) | (size & 0xff)); for (; pb < pe; pb++, xb++) *pb ^= xb; } // make string tb_object_ref_t string = tb_object_string_init_from_cstr(data); // exit data tb_free(data); // ok? return string; }
static tb_object_ref_t tb_object_json_reader_func_string(tb_object_json_reader_t* reader, tb_char_t type) { // check tb_assert_and_check_return_val(reader && reader->stream && (type == '\"' || type == '\''), tb_null); // init data tb_string_t data; if (!tb_string_init(&data)) return tb_null; // walk tb_char_t ch; while (tb_stream_left(reader->stream)) { // read one character ch = tb_stream_bread_s8(reader->stream); // end? if (ch == '\"' || ch == '\'') break; // the escaped character? else if (ch == '\\') { // read one character ch = tb_stream_bread_s8(reader->stream); // unicode? if (ch == 'u') { #ifdef TB_CONFIG_MODULE_HAVE_CHARSET // the unicode string tb_char_t unicode_str[5]; unicode_str[0] = tb_stream_bread_s8(reader->stream); unicode_str[1] = tb_stream_bread_s8(reader->stream); unicode_str[2] = tb_stream_bread_s8(reader->stream); unicode_str[3] = tb_stream_bread_s8(reader->stream); unicode_str[4] = '\0'; // the unicode value tb_uint16_t unicode_val = tb_s16toi32(unicode_str); // the utf8 stream tb_char_t utf8_data[16] = {0}; tb_static_stream_t utf8_stream; tb_static_stream_init(&utf8_stream, (tb_byte_t*)utf8_data, sizeof(utf8_data)); // the unicode stream tb_static_stream_t unicode_stream = {0}; tb_static_stream_init(&unicode_stream, (tb_byte_t*)&unicode_val, 2); // unicode to utf8 tb_long_t utf8_size = tb_charset_conv_bst(TB_CHARSET_TYPE_UCS2 | TB_CHARSET_TYPE_NE, TB_CHARSET_TYPE_UTF8, &unicode_stream, &utf8_stream); if (utf8_size > 0) tb_string_cstrncat(&data, utf8_data, utf8_size); #else // trace tb_trace1_e("unicode type is not supported, please enable charset module config if you want to use it!"); // only append it tb_string_chrcat(&data, ch); #endif } // append escaped character else tb_string_chrcat(&data, ch); } // append character else tb_string_chrcat(&data, ch); } // init string tb_object_ref_t string = tb_object_string_init_from_cstr(tb_string_cstr(&data)); // trace tb_trace_d("string: %s", tb_string_cstr(&data)); // exit data tb_string_exit(&data); // ok? return string; }
static tb_object_ref_t tb_object_bplist_reader_func_string(tb_object_bplist_reader_t* reader, tb_size_t type, tb_size_t size, tb_size_t item_size) { // check tb_assert_and_check_return_val(reader && reader->stream, tb_null); // init tb_char_t* utf8 = tb_null; tb_char_t* utf16 = tb_null; tb_object_ref_t object = tb_null; // read switch (type) { case TB_OBJECT_BPLIST_TYPE_STRING: { // size is too large? if (size == 0x0f) { // read size tb_long_t val = tb_object_bplist_reader_func_size(reader, item_size); tb_assert_and_check_return_val(val >= 0, tb_null); size = (tb_size_t)val; } // read string if (size) { // init utf8 utf8 = tb_malloc_cstr(size + 1); tb_assert_and_check_break(utf8); // read utf8 if (!tb_stream_bread(reader->stream, (tb_byte_t*)utf8, size)) break; utf8[size] = '\0'; } // init object object = tb_object_string_init_from_cstr(utf8); } break; case TB_OBJECT_BPLIST_TYPE_UNICODE: { #ifdef TB_CONFIG_MODULE_HAVE_CHARSET // size is too large? if (size == 0x0f) { // read size tb_long_t val = tb_object_bplist_reader_func_size(reader, item_size); tb_assert_and_check_return_val(val >= 0, tb_null); size = (tb_size_t)val; } // read string if (size) { // init utf8 & utf16 data utf8 = tb_malloc_cstr((size + 1) << 2); utf16 = tb_malloc_cstr(size << 1); tb_assert_and_check_break(utf8 && utf16); // read utf16 if (!tb_stream_bread(reader->stream, (tb_byte_t*)utf16, size << 1)) break; // utf16 to utf8 tb_long_t osize = tb_charset_conv_data(TB_CHARSET_TYPE_UTF16, TB_CHARSET_TYPE_UTF8, (tb_byte_t*)utf16, size << 1, (tb_byte_t*)utf8, (size + 1) << 2); tb_assert_and_check_break(osize > 0 && osize < (tb_long_t)((size + 1) << 2)); utf8[osize] = '\0'; // init object object = tb_object_string_init_from_cstr(utf8); } #else // trace tb_trace1_e("unicode type is not supported, please enable charset module config if you want to use it!"); #endif } break; default: break; } // exit if (utf8) tb_free(utf8); if (utf16) tb_free(utf16); // ok? return object; }