diff options
| author | ruki <[email protected]> | 2018-08-30 21:02:14 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-08-30 00:13:27 +0800 |
| commit | fa751b550a8363c6d7afc57891f9b4e0fa7ab826 (patch) | |
| tree | 09c8ca320506d899d8e0e5af6c402e1ef6bc59f7 /core/src | |
| parent | 066348679895a8812f83369f55bea777714b5a3d (diff) | |
add string.convert
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/tbox/makefile | 12 | ||||
| -rw-r--r-- | core/src/tbox/src/tbox/charset/charset.h | 2 | ||||
| -rw-r--r-- | core/src/tbox/src/xmake.lua | 2 | ||||
| -rw-r--r-- | core/src/xmake/machine.c | 4 | ||||
| -rw-r--r-- | core/src/xmake/makefile | 1 | ||||
| -rw-r--r-- | core/src/xmake/string/convert.c | 137 |
6 files changed, 154 insertions, 4 deletions
diff --git a/core/src/tbox/makefile b/core/src/tbox/makefile index 82a39714b..ca65a6d1c 100644 --- a/core/src/tbox/makefile +++ b/core/src/tbox/makefile @@ -247,7 +247,17 @@ tbox_C_FILES += \ src/tbox/libm/cosf \ src/tbox/libm/sqrtf \ src/tbox/hash/sha \ - src/tbox/hash/uuid + src/tbox/hash/uuid \ + src/tbox/charset/charset \ + src/tbox/charset/ascii \ + src/tbox/charset/gb2312 \ + src/tbox/charset/utf8 \ + src/tbox/charset/utf16 \ + src/tbox/charset/utf32 \ + src/tbox/charset/ucs2 \ + src/tbox/charset/ucs4 \ + src/tbox/charset/iso8859 + ifeq ($(PLAT),windows) tbox_C_FILES += \ diff --git a/core/src/tbox/src/tbox/charset/charset.h b/core/src/tbox/src/tbox/charset/charset.h index 14a6b0033..8fa2b648d 100644 --- a/core/src/tbox/src/tbox/charset/charset.h +++ b/core/src/tbox/src/tbox/charset/charset.h @@ -140,7 +140,7 @@ tb_size_t tb_charset_type(tb_char_t const* name); * * @return the charset pointer */ -tb_charset_ref_t tb_charset_find(tb_size_t type); +tb_charset_ref_t tb_charset_find(tb_size_t type); /*! convert charset from static stream * diff --git a/core/src/tbox/src/xmake.lua b/core/src/tbox/src/xmake.lua index 30528d8b8..3c8821167 100644 --- a/core/src/tbox/src/xmake.lua +++ b/core/src/tbox/src/xmake.lua @@ -80,7 +80,7 @@ for _, name in ipairs({"xml", "zip", "hash", "regex", "object", "charset", "data add_deps("small", "micro") add_defines_h(format("$(prefix)_MODULE_HAVE_%s", name:upper())) after_check(function (option) - if name ~= "hash" and (option:dep("small"):enabled() or option:dep("micro"):enabled()) then + if (name ~= "hash" and name ~= "charset") and (option:dep("small"):enabled() or option:dep("micro"):enabled()) then option:enable(false) end end) diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c index 24a7ca60a..a9541e410 100644 --- a/core/src/xmake/machine.c +++ b/core/src/xmake/machine.c @@ -108,6 +108,7 @@ tb_int_t xm_winos_registry_query(lua_State* lua); #endif // the string functions +tb_int_t xm_string_convert(lua_State* lua); tb_int_t xm_string_endswith(lua_State* lua); tb_int_t xm_string_startswith(lua_State* lua); @@ -216,7 +217,8 @@ static luaL_Reg const g_hash_functions[] = // the string functions static luaL_Reg const g_string_functions[] = { - { "endswith", xm_string_endswith } + { "convert", xm_string_convert } +, { "endswith", xm_string_endswith } , { "startswith", xm_string_startswith } , { tb_null, tb_null } }; diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index 833c80241..1b5a939cc 100644 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -48,6 +48,7 @@ xmake_C_FILES += \ path/is_absolute \ hash/uuid \ hash/sha256 \ + string/convert \ string/endswith \ string/startswith \ process/open \ diff --git a/core/src/xmake/string/convert.c b/core/src/xmake/string/convert.c new file mode 100644 index 000000000..2805f4b52 --- /dev/null +++ b/core/src/xmake/string/convert.c @@ -0,0 +1,137 @@ +/*!The Make-like Build Utility based on Lua + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright (C) 2015 - 2018, TBOOX Open Source Group. + * + * @author ruki + * @file convert.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "convert" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * globals + */ + +// the charset entry type +typedef struct __xm_charset_entry_t +{ + // the charset type + tb_size_t type; + + // the charset name + tb_char_t const* name; + +}xm_charset_entry_t, *xm_charset_entry_ref_t; + +// the charsets, @note: type & name is sorted +static xm_charset_entry_t g_charsets[] = +{ + {TB_CHARSET_TYPE_ASCII, "ascii" } +, {TB_CHARSET_TYPE_GB2312, "gb2312" } +, {TB_CHARSET_TYPE_GBK, "gbk" } +, {TB_CHARSET_TYPE_ISO8859, "iso8859" } +, {TB_CHARSET_TYPE_UCS2, "ucs3" } +, {TB_CHARSET_TYPE_UCS4, "ucs4" } +, {TB_CHARSET_TYPE_UTF16, "utf16" } +, {TB_CHARSET_TYPE_UTF32, "utf32" } +, {TB_CHARSET_TYPE_UTF8, "utf8" } +}; + +/* ////////////////////////////////////////////////////////////////////////////////////// + * finder + */ +static tb_long_t xm_string_charset_comp_by_name(tb_iterator_ref_t iterator, tb_cpointer_t item, tb_cpointer_t name) +{ + return tb_stricmp(((xm_charset_entry_ref_t)item)->name, (tb_char_t const*)name); +} +static xm_charset_entry_ref_t xm_string_charset_find_by_name(tb_char_t const* name) +{ + // make iterator + tb_array_iterator_t array_iterator; + tb_iterator_ref_t iterator = tb_iterator_make_for_mem(&array_iterator, g_charsets, tb_arrayn(g_charsets), sizeof(xm_charset_entry_t)); + tb_assert_and_check_return_val(iterator, tb_null); + + // find it by the binary search + tb_size_t itor = tb_binary_find_all_if(iterator, xm_string_charset_comp_by_name, name); + if (itor != tb_iterator_tail(iterator)) + return (xm_charset_entry_ref_t)tb_iterator_item(iterator, itor); + else return tb_null; +} + +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ + +/* convert string + * + * @param str the string + * @param ftype the from-charset type, .e.g ascii, gb2312, gbk, ios8859, ucs2, ucs4, utf8, utf16, utf32 + * @param ttype the to-charset type + * + * @code + * local result = string.convert(str, "gbk", "utf8") + * local result = string.convert(str, "utf8", "gb2312") + * @endcode + */ +tb_int_t xm_string_convert(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the string and charset types + size_t src_size = 0; + tb_char_t const* src_cstr = luaL_checklstring(lua, 1, &src_size); + tb_char_t const* ftype_cstr = luaL_checkstring(lua, 2); + tb_char_t const* ttype_cstr = luaL_checkstring(lua, 3); + tb_check_return_val(src_cstr && ftype_cstr && ttype_cstr, 0); + + // find charsets + xm_charset_entry_ref_t fcharset = xm_string_charset_find_by_name(ftype_cstr); + xm_charset_entry_ref_t tcharset = xm_string_charset_find_by_name(ttype_cstr); + tb_check_return_val(fcharset && tcharset, 0); + + // empty string? + if (!src_size) lua_pushstring(lua, ""); + else + { + // convert string + tb_long_t dst_size = 0; + tb_size_t dst_maxn = (tb_size_t)src_size << 2; + tb_byte_t* dst_data = tb_malloc_bytes(dst_maxn); + if (dst_data && dst_maxn && (dst_size = tb_charset_conv_data(fcharset->type, tcharset->type, (tb_byte_t const*)src_cstr, (tb_size_t)src_size, dst_data, dst_maxn)) >= 0 && dst_size < dst_maxn) + { + dst_data[dst_size] = '\0'; + lua_pushstring(lua, (tb_char_t const*)dst_data); + } + else lua_pushnil(lua); + } + + // ok + return 1; +} |
