add function/macros to support wmain

This commit is contained in:
lixianjing 2023-08-21 10:07:43 +08:00
parent b2df7f3de1
commit 62e637fb7f
7 changed files with 154 additions and 2 deletions

View File

@ -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。

View File

@ -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;
}

View File

@ -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
*

View File

@ -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;
}

View File

@ -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*/

View File

@ -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);
}

View File

@ -834,4 +834,12 @@ 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);
}