tb_char_t const* tb_string_cstrfcpy(tb_string_ref_t string, tb_char_t const* fmt, ...) { // check tb_assert_and_check_return_val(string && fmt, tb_null); // format data tb_char_t p[TB_SCOPED_STRING_FMTD_SIZE] = {0}; tb_size_t n = 0; tb_vsnprintf_format(p, TB_SCOPED_STRING_FMTD_SIZE, fmt, &n); tb_assert_and_check_return_val(n, tb_null); // done return tb_string_cstrncpy(string, p, n); }
tb_char_t const* tb_string_strcpy(tb_string_ref_t string, tb_string_ref_t s) { // check tb_assert_and_check_return_val(s, tb_null); // done tb_size_t n = tb_string_size(s); if (n) return tb_string_cstrncpy(string, tb_string_cstr(s), n); else { tb_string_clear(string); return tb_null; } }
tb_char_t const* tb_xml_reader_cdata(tb_xml_reader_ref_t reader) { // check tb_xml_reader_impl_t* impl = (tb_xml_reader_impl_t*)reader; tb_assert_and_check_return_val(impl && impl->event == TB_XML_READER_EVENT_CDATA, tb_null); // init tb_char_t const* p = tb_string_cstr(&impl->element); tb_size_t n = tb_string_size(&impl->element); tb_assert_and_check_return_val(p && n >= 11, tb_null); // comment tb_string_cstrncpy(&impl->text, p + 8, n - 10); return tb_string_cstr(&impl->text); }
tb_char_t const* tb_xml_reader_element(tb_xml_reader_ref_t reader) { // check tb_xml_reader_impl_t* impl = (tb_xml_reader_impl_t*)reader; tb_assert_and_check_return_val(impl && ( impl->event == TB_XML_READER_EVENT_ELEMENT_BEG || impl->event == TB_XML_READER_EVENT_ELEMENT_END || impl->event == TB_XML_READER_EVENT_ELEMENT_EMPTY), tb_null); // init tb_char_t const* p = tb_null; tb_char_t const* b = tb_string_cstr(&impl->element); tb_char_t const* e = b + tb_string_size(&impl->element); tb_assert_and_check_return_val(b, tb_null); // </name> or <name ... /> if (b < e && *b == '/') b++; for (p = b; p < e && *p && !tb_isspace(*p) && *p != '/'; p++) ; // ok? return p > b? tb_string_cstrncpy(&impl->element_name, b, p - b) : tb_null; }
tb_char_t const* tb_string_cstrcpy(tb_string_ref_t string, tb_char_t const* s) { // check tb_assert_and_check_return_val(s, tb_null); return tb_string_cstrncpy(string, s, tb_strlen(s)); }