mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-09 03:51:08 +08:00
add function/macros to support wmain
This commit is contained in:
parent
b2df7f3de1
commit
62e637fb7f
@ -1,4 +1,12 @@
|
||||
# 最新动态
|
||||
|
||||
2023/08/21
|
||||
* 增加函数cmd\_args\_process\_wstr
|
||||
* 增加函数tk\_utf8\_dup\_wstr
|
||||
* 增加函数tk\_to\_utf8\_argv
|
||||
* 增加函数tk\_free\_utf8\_argv
|
||||
* 增加宏MAIN/END\_MAIN
|
||||
|
||||
2023/08/16
|
||||
* 增加函数str\_equal/wstr\_eq/wstr\_create/wstr\_destroy/wstr\_append\_more等函数
|
||||
* 增加宏STR\_DESTROY/WSTR\_DESTROY。
|
||||
|
@ -19,6 +19,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "tkc/mem.h"
|
||||
#include "tkc/utils.h"
|
||||
#include "tkc/tokenizer.h"
|
||||
#include "tkc/cmd_args.h"
|
||||
@ -193,3 +194,19 @@ ret_t cmd_args_process_str(cmd_args_t* args, const char* cmd_line) {
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ret_t cmd_args_process_wstr(cmd_args_t* args, int argc, wchar_t* _argv[]) {
|
||||
uint32_t i = 0;
|
||||
ret_t ret = RET_OK;
|
||||
char** argv = NULL;
|
||||
return_value_if_fail(args != NULL && _argv != NULL, RET_BAD_PARAMS);
|
||||
argv = tk_to_utf8_argv(argc, _argv);
|
||||
return_value_if_fail(argv != NULL, RET_OOM);
|
||||
ret = cmd_args_process(args, argc, argv);
|
||||
tk_free_utf8_argv(argc, argv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -110,6 +110,18 @@ ret_t cmd_args_show_help(cmd_args_t* args);
|
||||
*/
|
||||
ret_t cmd_args_process(cmd_args_t* args, int argc, char* argv[]);
|
||||
|
||||
/**
|
||||
* @method cmd_args_process_wstr
|
||||
* 处理。
|
||||
*
|
||||
* @param {cmd_args_t*} args args对象。
|
||||
* @param {int} argc 参数个数。
|
||||
* @param {wchar_t**} argv 参数数组。
|
||||
*
|
||||
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
|
||||
*/
|
||||
ret_t cmd_args_process_wstr(cmd_args_t* args, int argc, wchar_t* argv[]);
|
||||
|
||||
/**
|
||||
* @method cmd_args_process_str
|
||||
* 处理。
|
||||
|
@ -1685,3 +1685,38 @@ ret_t bits_stream_set(uint8_t* buff, uint32_t size, uint32_t index, bool_t value
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
char* tk_utf8_dup_wstr(const wchar_t* str) {
|
||||
str_t s;
|
||||
return_value_if_fail(str != NULL, NULL);
|
||||
str_init(&s, wcslen(str) * 4 + 1);
|
||||
str_from_wstr(&s, str);
|
||||
|
||||
return s.str;
|
||||
}
|
||||
|
||||
char** tk_to_utf8_argv(int argc, wchar_t* argv[]) {
|
||||
uint32_t i = 0;
|
||||
char** argv_utf8 = NULL;
|
||||
argv_utf8 = TKMEM_ALLOC(sizeof(char*) * argc);
|
||||
return_value_if_fail(argv_utf8 != NULL, NULL);
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
argv_utf8[i] = tk_utf8_dup_wstr(argv[i]);
|
||||
}
|
||||
|
||||
return argv_utf8;
|
||||
}
|
||||
|
||||
ret_t tk_free_utf8_argv(int argc, char** argv) {
|
||||
uint32_t i = 0;
|
||||
return_value_if_fail(argv != NULL, RET_BAD_PARAMS);
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
TKMEM_FREE(argv[i]);
|
||||
}
|
||||
TKMEM_FREE(argv);
|
||||
|
||||
return RET_OK;
|
||||
}
|
@ -745,6 +745,17 @@ char* tk_str_tolower(char* str);
|
||||
*/
|
||||
wchar_t* tk_wstr_dup_utf8(const char* str);
|
||||
|
||||
/**
|
||||
* @method tk_utf8_dup_wstr
|
||||
*
|
||||
* 将UCS字符串拷贝为utf8字符串。
|
||||
*
|
||||
* @param {const wchar_t*} str 字符串。
|
||||
*
|
||||
* @return {char*} 返回UTF-8字符串(需要调用TKMEM_FREE释放)。
|
||||
*/
|
||||
char* tk_utf8_dup_wstr(const wchar_t* str);
|
||||
|
||||
/**
|
||||
* @method tk_wstr_count_c
|
||||
*
|
||||
@ -997,8 +1008,23 @@ ret_t bits_stream_get(const uint8_t* buff, uint32_t size, uint32_t index, bool_t
|
||||
*/
|
||||
ret_t bits_stream_set(uint8_t* buff, uint32_t size, uint32_t index, bool_t value);
|
||||
|
||||
/*public for test*/
|
||||
ret_t xml_file_expand(const char* filename, str_t* s, const char* data);
|
||||
/**
|
||||
* @method tk_to_utf8_argv
|
||||
* 将宽字符串数组转换成utf8字符串数组。
|
||||
* @param {int} argc 参数个数。
|
||||
* @param {wchar_t*} argv 参数。
|
||||
* @return {char**} 返回utf8字符串数组。
|
||||
*/
|
||||
char** tk_to_utf8_argv(int argc, wchar_t* argv[]);
|
||||
|
||||
/**
|
||||
* @method tk_free_utf8_argv
|
||||
* 释放utf8字符串数组。
|
||||
* @param {int} argc 参数个数。
|
||||
* @param {char**} argv 参数。
|
||||
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
|
||||
*/
|
||||
ret_t tk_free_utf8_argv(int argc, char** argv);
|
||||
|
||||
#define TK_STRDUP(str) ((str) != NULL) ? strdup(str) : NULL
|
||||
#define TK_STRNDUP(str) ((str) != NULL) ? strndup(str) : NULL
|
||||
@ -1006,6 +1032,25 @@ ret_t xml_file_expand(const char* filename, str_t* s, const char* data);
|
||||
#define tk_str_cmp tk_strcmp
|
||||
#define tk_str_icmp tk_stricmp
|
||||
|
||||
#ifdef WIN32
|
||||
#define MAIN() \
|
||||
int wmain(int argc, wchar_t* wargv[]) { \
|
||||
char** argv = tk_to_utf8_argv(argc, wargv);
|
||||
|
||||
#define END_MAIN(code) \
|
||||
tk_free_utf8_argv(argc, argv); \
|
||||
return code; \
|
||||
}
|
||||
#else
|
||||
#define MAIN() int main(int argc, char* argv[]) {
|
||||
#define END_MAIN(code) \
|
||||
return code; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/*public for test*/
|
||||
ret_t xml_file_expand(const char* filename, str_t* s, const char* data);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /*TK_UTILS_H*/
|
||||
|
@ -126,3 +126,30 @@ TEST(CmdArgs, basic2) {
|
||||
|
||||
st_args_reset(&args);
|
||||
}
|
||||
|
||||
TEST(CmdArgs, wstr) {
|
||||
cmd_args_t parser;
|
||||
st_args_t args;
|
||||
const wchar_t* argv[] = {L"st",
|
||||
L"--auto_type_promotion",
|
||||
L"--locale=zh_CN",
|
||||
L"--strings_file",
|
||||
L"strings.xml",
|
||||
L"--output",
|
||||
L"test.st",
|
||||
L"a.st",
|
||||
L"b.st"};
|
||||
const char* usage = "parse st text";
|
||||
st_args_init(&args);
|
||||
cmd_args_init(&parser, usage, args_desc, ARRAY_SIZE(args_desc), st_args_on_arg, &args);
|
||||
cmd_args_process_wstr(&parser, ARRAY_SIZE(argv), (wchar_t**)argv);
|
||||
|
||||
ASSERT_STREQ(args.locale, "zh_CN");
|
||||
ASSERT_STREQ(args.strings_file, "strings.xml");
|
||||
ASSERT_EQ(args.sources.size, 2);
|
||||
|
||||
ASSERT_STREQ((char*)darray_get(&(args.sources), 0), "a.st");
|
||||
ASSERT_STREQ((char*)darray_get(&(args.sources), 1), "b.st");
|
||||
|
||||
st_args_reset(&args);
|
||||
}
|
@ -835,3 +835,11 @@ TEST(Utils, bits_stream) {
|
||||
ASSERT_NE(bits_stream_set(buff, sizeof(buff), 10000, TRUE), RET_OK);
|
||||
ASSERT_NE(bits_stream_get(buff, sizeof(buff), 10000, &v), RET_OK);
|
||||
}
|
||||
|
||||
TEST(Utils, argv) {
|
||||
const wchar_t* wargv[2] = {L"abc", L"123"};
|
||||
char** argv = tk_to_utf8_argv(2, (wchar_t**)wargv);
|
||||
ASSERT_STREQ(argv[0], "abc");
|
||||
ASSERT_STREQ(argv[1], "123");
|
||||
tk_free_utf8_argv(2, argv);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user