From c7b6cbb9f41178c26ec2fb40ae766e3ef08094a1 Mon Sep 17 00:00:00 2001 From: Water-Melon Date: Tue, 6 Feb 2024 16:00:48 +0000 Subject: [PATCH] refactor(lex): use function templates to define functions --- include/mln_lex.h | 261 +++++++++++++++++++--------------------------- src/mln_lex.c | 101 +++++++++--------- 2 files changed, 158 insertions(+), 204 deletions(-) diff --git a/include/mln_lex.h b/include/mln_lex.h index 476f880c..8054de7f 100644 --- a/include/mln_lex.h +++ b/include/mln_lex.h @@ -13,6 +13,7 @@ #include "mln_string.h" #include "mln_alloc.h" #include "mln_rbtree.h" +#include "mln_func.h" #include #include @@ -212,7 +213,8 @@ extern void mln_lex_input_free(void *in); ((lex)->cur==NULL? NULL: ((lex)->cur->type==M_INPUT_T_BUF?NULL: ((lex)->cur->data))) #define mln_lex_result_get(lex,res_pstr) mln_string_nset((res_pstr), lex->result_buf, lex->result_pos-lex->result_buf) #define mln_lex_error_set(lex,err) ((lex)->error = (err)) -static inline void mln_lex_stepback(mln_lex_t *lex, char c) +MLN_FUNC_VOID(static inline, void, mln_lex_stepback, \ + (mln_lex_t *lex, char c), (lex, c), \ { if (c == MLN_EOF) return; if (lex->cur == NULL || lex->cur->pos <= lex->cur->buf) { @@ -220,8 +222,9 @@ static inline void mln_lex_stepback(mln_lex_t *lex, char c) abort(); } --(lex->cur->pos); -} -static inline int mln_lex_putchar(mln_lex_t *lex, char c) +}) +MLN_FUNC(static inline, int, mln_lex_putchar, \ + (mln_lex_t *lex, char c), (lex, c), \ { if (lex->result_buf == NULL) { if ((lex->result_buf = (mln_u8ptr_t)mln_alloc_m(lex->pool, lex->result_buf_len)) == NULL) { @@ -244,10 +247,9 @@ static inline int mln_lex_putchar(mln_lex_t *lex, char c) } *(lex->result_pos)++ = (mln_u8_t)c; return 0; -} +}) -static inline char mln_lex_getchar(mln_lex_t *lex) -{ +MLN_FUNC(static inline, char, mln_lex_getchar, (mln_lex_t *lex), (lex), { int n; mln_lex_input_t *in; lp: @@ -290,30 +292,27 @@ static inline char mln_lex_getchar(mln_lex_t *lex) } } return (char)(*(in->pos)++); -} +}) -static inline int mln_lex_is_letter(char c) -{ +MLN_FUNC(static inline, int, mln_lex_is_letter, (char c), (c), { if (c == '_' || isalpha(c)) return 1; return 0; -} +}) -static inline int mln_lex_is_oct(char c) -{ +MLN_FUNC(static inline, int, mln_lex_is_oct, (char c), (c), { if (c >= '0' && c < '8') return 1; return 0; -} +}) -static inline int mln_lex_is_hex(char c) -{ +MLN_FUNC(static inline, int, mln_lex_is_hex, (char c), (c), { if (isdigit(c) || \ (c >= 'a' && c <= 'f') || \ (c >= 'A' && c <= 'F')) return 1; return 0; -} +}) @@ -430,134 +429,102 @@ PREFIX_NAME##_type_t PREFIX_NAME##_token_type_array[] = { \ {TK_PREFIX##_TK_KEYWORD_BEGIN,#TK_PREFIX"_TK_KEYWORD_BEGIN"}, \ ## __VA_ARGS__ \ };\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_excl_default_handler(mln_lex_t *lex, void *data)\ - {\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_excl_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_EXCL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_dblq_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_dblq_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_DBLQ);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_nums_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_nums_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_NUMS);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_doll_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_doll_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_DOLL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_perc_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_perc_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_PERC);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_amp_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_amp_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_AMP);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_sglq_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_sglq_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_SGLQ);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lpar_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lpar_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_LPAR);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_rpar_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_rpar_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_RPAR);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_ast_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_ast_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_AST);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_plus_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_plus_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_PLUS);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_comma_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_comma_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_COMMA);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_sub_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_sub_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_SUB);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_period_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_period_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_PERIOD);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_slash_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_slash_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_SLASH);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_colon_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_colon_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_COLON);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_semic_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_semic_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_SEMIC);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lagl_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lagl_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_LAGL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_equal_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_equal_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_EQUAL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_ragl_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_ragl_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_RAGL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_ques_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_ques_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_QUES);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_at_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_at_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_AT);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lsquar_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lsquar_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_LSQUAR);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_bslash_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_bslash_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_BSLASH);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_rsquar_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_rsquar_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_RSQUAR);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_xor_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_xor_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_XOR);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_under_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_under_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_UNDER);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_fulstp_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_fulstp_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_FULSTP);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lbrace_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lbrace_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_LBRACE);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_vertl_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_vertl_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_VERTL);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_rbrace_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_rbrace_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_RBRACE);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_dash_default_handler(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_dash_default_handler, (mln_lex_t *lex, void *data), (lex, data), {\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_DASH);\ - }\ + })\ \ mln_spechar_t PREFIX_NAME##_handlers[] = { \ {'!', (lex_hook)PREFIX_NAME##_excl_default_handler, NULL},\ @@ -594,8 +561,7 @@ PREFIX_NAME##_type_t PREFIX_NAME##_token_type_array[] = { \ {'~', (lex_hook)PREFIX_NAME##_dash_default_handler, NULL} \ };\ \ - static void PREFIX_NAME##_set_hooks(mln_lex_t *lex)\ - {\ + MLN_FUNC_VOID(static, void, PREFIX_NAME##_set_hooks, (mln_lex_t *lex), (lex), {\ mln_lex_hooks_t *hooks = &(lex->hooks);\ if (hooks->excl_handler != NULL) {PREFIX_NAME##_handlers[0].handler = hooks->excl_handler; PREFIX_NAME##_handlers[0].data = hooks->excl_data; }\ if (hooks->dblq_handler != NULL) {PREFIX_NAME##_handlers[1].handler = hooks->dblq_handler; PREFIX_NAME##_handlers[1].data = hooks->dblq_data; }\ @@ -629,10 +595,9 @@ PREFIX_NAME##_type_t PREFIX_NAME##_token_type_array[] = { \ if (hooks->vertl_handler != NULL) {PREFIX_NAME##_handlers[29].handler = hooks->vertl_handler; PREFIX_NAME##_handlers[29].data = hooks->vertl_data; }\ if (hooks->rbrace_handler != NULL) {PREFIX_NAME##_handlers[30].handler = hooks->rbrace_handler;PREFIX_NAME##_handlers[30].data = hooks->rbrace_data;}\ if (hooks->dash_handler != NULL) {PREFIX_NAME##_handlers[31].handler = hooks->dash_handler; PREFIX_NAME##_handlers[31].data = hooks->dash_data; }\ - }\ + })\ \ - PREFIX_NAME##_struct_t *PREFIX_NAME##_new(mln_lex_t *lex, enum PREFIX_NAME##_enum type)\ - {\ + MLN_FUNC(, PREFIX_NAME##_struct_t *, PREFIX_NAME##_new, (mln_lex_t *lex, enum PREFIX_NAME##_enum type), (lex, type), {\ mln_string_t tmp;\ PREFIX_NAME##_struct_t *ptr;\ if ((ptr = (PREFIX_NAME##_struct_t *)mln_alloc_m(lex->pool, sizeof(PREFIX_NAME##_struct_t))) == NULL) {\ @@ -658,18 +623,16 @@ PREFIX_NAME##_type_t PREFIX_NAME##_token_type_array[] = { \ mln_lex_error_set(lex, MLN_LEX_SUCCEED);\ lex->result_pos = lex->result_buf;\ return ptr;\ - }\ + })\ \ - void PREFIX_NAME##_free(PREFIX_NAME##_struct_t *ptr)\ - {\ + MLN_FUNC_VOID(, void, PREFIX_NAME##_free, (PREFIX_NAME##_struct_t *ptr), (ptr), {\ if (ptr == NULL) return ;\ if (ptr->text != NULL) mln_string_free(ptr->text);\ if (ptr->file != NULL) mln_string_free(ptr->file);\ mln_alloc_free(ptr);\ - }\ + })\ \ - static inline PREFIX_NAME##_struct_t *PREFIX_NAME##_process_keywords(mln_lex_t *lex)\ - {\ + MLN_FUNC(static inline, PREFIX_NAME##_struct_t *, PREFIX_NAME##_process_keywords, (mln_lex_t *lex), (lex), {\ if (lex->keywords == NULL) return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_ID);\ mln_string_t tmp;\ mln_u32_t diff = lex->result_pos - lex->result_buf;\ @@ -684,10 +647,9 @@ PREFIX_NAME##_type_t PREFIX_NAME##_token_type_array[] = { \ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_KEYWORD_BEGIN+plk->val+1);\ }\ return PREFIX_NAME##_new(lex, TK_PREFIX##_TK_ID);\ - }\ + })\ \ - static inline PREFIX_NAME##_struct_t *PREFIX_NAME##_process_spec_char(mln_lex_t *lex, char c)\ - {\ + MLN_FUNC(static inline, PREFIX_NAME##_struct_t *, PREFIX_NAME##_process_spec_char, (mln_lex_t *lex, char c), (lex, c), {\ mln_s32_t i;\ mln_s32_t end = sizeof(PREFIX_NAME##_handlers)/sizeof(mln_spechar_t);\ for (i = 0; ifile = mln_string_ref(src->file);\ }\ return (void *)dest;\ - }\ + })\ \ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_include(mln_lex_t *lex, void *data)\ - {\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_include, (mln_lex_t *lex, void *data), (lex, data), {\ char c;\ mln_string_t path;\ while (1) {\ @@ -900,9 +859,8 @@ lp:\ }\ mln_lex_result_clean(lex);\ return PREFIX_NAME##_token(lex);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_define(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_define, (mln_lex_t *lex, void *data), (lex, data), {\ char c;\ mln_string_t str, *k = NULL, *v = NULL;\ mln_lex_macro_t *lm, tmp;\ @@ -993,9 +951,8 @@ goon:\ }\ mln_lex_result_clean(lex);\ return PREFIX_NAME##_token(lex);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_if(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_if, (mln_lex_t *lex, void *data), (lex, data), {\ int ret;\ mln_lex_preprocess_data_t *lpd = (mln_lex_preprocess_data_t *)data;\ mln_lex_result_clean(lex);\ @@ -1012,9 +969,8 @@ goon:\ }\ mln_lex_result_clean(lex);\ return PREFIX_NAME##_token(lex);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_else(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_else, (mln_lex_t *lex, void *data), (lex, data), {\ mln_lex_preprocess_data_t *lpd = (mln_lex_preprocess_data_t *)data;\ if (lpd->if_level == 0) {\ mln_lex_error_set(lex, MLN_LEX_EINVMACRO);\ @@ -1029,9 +985,8 @@ goon:\ lex->ignore = 0;\ }\ return PREFIX_NAME##_token(lex);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_endif(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_endif, (mln_lex_t *lex, void *data), (lex, data), {\ mln_lex_preprocess_data_t *lpd = (mln_lex_preprocess_data_t *)data;\ if (lpd->if_level == 0) {\ mln_lex_error_set(lex, MLN_LEX_EINVMACRO);\ @@ -1043,9 +998,8 @@ goon:\ lex->ignore = !(lpd->if_matched == lpd->if_level);\ mln_lex_result_clean(lex);\ return PREFIX_NAME##_token(lex);\ - }\ - static PREFIX_NAME##_struct_t *PREFIX_NAME##_lex_preprocess_undef(mln_lex_t *lex, void *data)\ - {\ + })\ + MLN_FUNC(static, PREFIX_NAME##_struct_t *, PREFIX_NAME##_lex_preprocess_undef, (mln_lex_t *lex, void *data), (lex, data), {\ char c;\ mln_string_t str;\ mln_lex_macro_t tmp;\ @@ -1088,7 +1042,7 @@ goon:\ }\ mln_lex_result_clean(lex);\ return PREFIX_NAME##_token(lex);\ - }\ + })\ mln_preprocess_handler_t PREFIX_NAME##_preprocess_handlers[] = {\ {mln_string("define"), (lex_hook)PREFIX_NAME##_lex_preprocess_define},\ {mln_string("include"), (lex_hook)PREFIX_NAME##_lex_preprocess_include},\ @@ -1097,8 +1051,7 @@ goon:\ {mln_string("endif"), (lex_hook)PREFIX_NAME##_lex_preprocess_endif},\ {mln_string("undef"), (lex_hook)PREFIX_NAME##_lex_preprocess_undef}\ };\ - PREFIX_NAME##_struct_t *PREFIX_NAME##_nums_handler(mln_lex_t *lex, void *data)\ - {\ + MLN_FUNC(, PREFIX_NAME##_struct_t *, PREFIX_NAME##_nums_handler, (mln_lex_t *lex, void *data), (lex, data), {\ mln_preprocess_handler_t *ph, *phend;\ mln_string_t tmp;\ mln_rbtree_node_t *rn;\ @@ -1140,7 +1093,7 @@ goon:\ }\ mln_lex_error_set(lex, MLN_LEX_EUNKNOWNMACRO);\ return NULL;\ - } + }) #define mln_lex_init_with_hooks(PREFIX_NAME,lex_ptr,attr_ptr) \ if ((attr_ptr)->preprocess) {\ diff --git a/src/mln_lex.c b/src/mln_lex.c index 5b85d66e..5249a631 100644 --- a/src/mln_lex.c +++ b/src/mln_lex.c @@ -40,22 +40,22 @@ char mln_lex_errmsg[][MLN_LEX_ERRMSG_LEN] = { }; char error_msg_err[] = "No memory to store error message."; -mln_lex_preprocess_data_t *mln_lex_preprocess_data_new(mln_alloc_t *pool) -{ +MLN_FUNC(, mln_lex_preprocess_data_t *, mln_lex_preprocess_data_new, (mln_alloc_t *pool), (pool), { mln_lex_preprocess_data_t *lpd = (mln_lex_preprocess_data_t *)mln_alloc_m(pool, sizeof(mln_lex_preprocess_data_t)); if (lpd == NULL) return NULL; lpd->if_level = 0; lpd->if_matched = 0; return lpd; -} +}) -void mln_lex_preprocess_data_free(mln_lex_preprocess_data_t *lpd) -{ +MLN_FUNC_VOID(, void, mln_lex_preprocess_data_free, (mln_lex_preprocess_data_t *lpd), (lpd), { if (lpd == NULL) return; mln_alloc_free(lpd); -} +}) -static inline int mln_lex_base_dir(mln_lex_t *lex, mln_lex_input_t *input, char *path, int *err) +MLN_FUNC(static inline, int, mln_lex_base_dir, \ + (mln_lex_t *lex, mln_lex_input_t *input, char *path, int *err), \ + (lex, input, path, err), \ { char *p = strrchr(path, '/'); char tmp[1024] = {0}; @@ -73,10 +73,11 @@ static inline int mln_lex_base_dir(mln_lex_t *lex, mln_lex_input_t *input, char return -1; } return 0; -} +}) -mln_lex_input_t * -mln_lex_input_new(mln_lex_t *lex, mln_u32_t type, mln_string_t *data, int *err, mln_u64_t line) +MLN_FUNC(, mln_lex_input_t *, mln_lex_input_new, \ + (mln_lex_t *lex, mln_u32_t type, mln_string_t *data, int *err, mln_u64_t line), \ + (lex, type, data, err, line), \ { int r; mln_lex_input_t *li; @@ -174,10 +175,9 @@ mln_lex_input_new(mln_lex_t *lex, mln_u32_t type, mln_string_t *data, int *err, } return li; -} +}) -void mln_lex_input_free(void *in) -{ +MLN_FUNC_VOID(, void, mln_lex_input_free, (void *in), (in), { if (in == NULL) return; mln_lex_input_t *input = (mln_lex_input_t *)in; if (input->fd >= 0) close(input->fd); @@ -185,10 +185,11 @@ void mln_lex_input_free(void *in) if (input->dir != NULL) mln_string_free(input->dir); if (input->buf != NULL && input->type == M_INPUT_T_FILE) mln_alloc_free(input->buf); mln_alloc_free(input); -} +}) -mln_lex_macro_t * -mln_lex_macro_new(mln_alloc_t *pool, mln_string_t *key, mln_string_t *val) +MLN_FUNC(, mln_lex_macro_t *, mln_lex_macro_new, \ + (mln_alloc_t *pool, mln_string_t *key, mln_string_t *val), \ + (pool, key, val), \ { mln_lex_macro_t *lm; if ((lm = (mln_lex_macro_t *)mln_alloc_m(pool, sizeof(mln_lex_macro_t))) == NULL) { @@ -205,26 +206,26 @@ mln_lex_macro_new(mln_alloc_t *pool, mln_string_t *key, mln_string_t *val) } if (val == NULL) lm->val = NULL; return lm; -} +}) -void mln_lex_macro_free(void *data) -{ +MLN_FUNC_VOID(, void, mln_lex_macro_free, (void *data), (data), { if (data == NULL) return; mln_lex_macro_t *lm = (mln_lex_macro_t *)data; if (lm->key != NULL) mln_string_free(lm->key); if (lm->val != NULL) mln_string_free(lm->val); mln_alloc_free(lm); -} +}) -static int mln_lex_macro_cmp(const void *data1, const void *data2) +MLN_FUNC(static, int, mln_lex_macro_cmp, \ + (const void *data1, const void *data2), (data1, data2), \ { mln_lex_macro_t *lm1 = (mln_lex_macro_t *)data1; mln_lex_macro_t *lm2 = (mln_lex_macro_t *)data2; return mln_string_strcmp(lm1->key, lm2->key); -} +}) -static inline mln_lex_keyword_t * -mln_lex_keyword_new(mln_string_t *keyword, mln_uauto_t val) +MLN_FUNC(static inline, mln_lex_keyword_t *, mln_lex_keyword_new, \ + (mln_string_t *keyword, mln_uauto_t val), (keyword, val), \ { mln_lex_keyword_t *lk = (mln_lex_keyword_t *)malloc(sizeof(mln_lex_keyword_t)); if (lk == NULL) return NULL; @@ -234,25 +235,24 @@ mln_lex_keyword_new(mln_string_t *keyword, mln_uauto_t val) } lk->val = val; return lk; -} +}) -static void mln_lex_keyword_free(void *data) -{ +MLN_FUNC_VOID(static, void, mln_lex_keyword_free, (void *data), (data), { if (data == NULL) return; mln_lex_keyword_t *lk = (mln_lex_keyword_t *)data; if (lk->keyword != NULL) mln_string_free(lk->keyword); free(lk); -} +}) -static int mln_lex_keywords_cmp(const void *data1, const void *data2) +MLN_FUNC(static, int, mln_lex_keywords_cmp, \ + (const void *data1, const void *data2), (data1, data2), \ { mln_lex_keyword_t *lk1 = (mln_lex_keyword_t *)data1; mln_lex_keyword_t *lk2 = (mln_lex_keyword_t *)data2; return mln_string_strcmp(lk1->keyword, lk2->keyword); -} +}) -mln_lex_t *mln_lex_init(struct mln_lex_attr *attr) -{ +MLN_FUNC(, mln_lex_t *, mln_lex_init, (struct mln_lex_attr *attr), (attr), { mln_lex_macro_t *lm; struct mln_rbtree_attr rbattr; mln_rbtree_node_t *rn; @@ -369,10 +369,9 @@ mln_lex_t *mln_lex_init(struct mln_lex_attr *attr) } return lex; -} +}) -void mln_lex_destroy(mln_lex_t *lex) -{ +MLN_FUNC_VOID(, void, mln_lex_destroy, (mln_lex_t *lex), (lex), { if (lex == NULL) return; if (lex->preprocess) { mln_lex_preprocess_data_free((mln_lex_preprocess_data_t *)(lex->hooks.at_data)); @@ -387,10 +386,9 @@ void mln_lex_destroy(mln_lex_t *lex) if (lex->env != NULL) mln_string_free(lex->env); if (lex->preprocess_data != NULL) mln_lex_preprocess_data_free(lex->preprocess_data); mln_alloc_free(lex); -} +}) -char *mln_lex_strerror(mln_lex_t *lex) -{ +MLN_FUNC(, char *, mln_lex_strerror, (mln_lex_t *lex), (lex), { if (lex->err_msg != NULL) mln_alloc_free(lex->err_msg); int len = 0; if (lex->cur != NULL) { @@ -426,9 +424,10 @@ char *mln_lex_strerror(mln_lex_t *lex) n += snprintf(lex->err_msg + n, len - n, ". %s", strerror(errno)); lex->err_msg[n] = 0; return lex->err_msg; -} +}) -int mln_lex_push_input_file_stream(mln_lex_t *lex, mln_string_t *path) +MLN_FUNC(, int, mln_lex_push_input_file_stream, \ + (mln_lex_t *lex, mln_string_t *path), (lex, path), \ { int err = MLN_LEX_SUCCEED; mln_lex_input_t *in; @@ -533,9 +532,10 @@ int mln_lex_push_input_file_stream(mln_lex_t *lex, mln_string_t *path) lex->line = 1; } return 0; -} +}) -int mln_lex_push_input_buf_stream(mln_lex_t *lex, mln_string_t *buf) +MLN_FUNC(, int, mln_lex_push_input_buf_stream, \ + (mln_lex_t *lex, mln_string_t *buf), (lex, buf), \ { int err = MLN_LEX_SUCCEED; mln_lex_input_t *in = mln_lex_input_new(lex, M_INPUT_T_BUF, buf, &err, lex->line); @@ -558,18 +558,20 @@ int mln_lex_push_input_buf_stream(mln_lex_t *lex, mln_string_t *buf) } lex->line = 1; return 0; -} +}) -static int mln_lex_check_file_loop_iterate_handler(void *st_data, void *data) +MLN_FUNC(static, int, mln_lex_check_file_loop_iterate_handler, \ + (void *st_data, void *data), (st_data, data), \ { mln_string_t *path = (mln_string_t *)data; mln_lex_input_t *in = (mln_lex_input_t *)st_data; if (in->type != M_INPUT_T_FILE) return 0; if (!mln_string_strcmp(path, in->data)) return -1; return 0; -} +}) -int mln_lex_check_file_loop(mln_lex_t *lex, mln_string_t *path) +MLN_FUNC(, int, mln_lex_check_file_loop, \ + (mln_lex_t *lex, mln_string_t *path), (lex, path), \ { char p[1024]; struct stat path_stat; @@ -654,10 +656,9 @@ int mln_lex_check_file_loop(mln_lex_t *lex, mln_string_t *path) } } return 0; -} +}) -int mln_lex_condition_test(mln_lex_t *lex) -{ +MLN_FUNC(, int, mln_lex_condition_test, (mln_lex_t *lex), (lex), { mln_lex_result_clean(lex); char c; @@ -714,5 +715,5 @@ int mln_lex_condition_test(mln_lex_t *lex) return reverse? 1: 0; } return reverse? 0: 1; -} +})