From 892b7a9f4e7dab815870db67886e68274da1d93e Mon Sep 17 00:00:00 2001 From: rodrigodornelles Date: Fri, 8 Dec 2023 13:28:59 -0300 Subject: [PATCH] chore: use only string in util_dsl_keyword #421 --- src/lang/lang_3bc_compile.c | 10 +++---- src/util/util_dsl.c | 46 +++++++++++++++++++---------- src/util/util_dsl.h | 11 ++----- tests/unit/error_driver_stack.c | 6 ++-- tests/unit/error_util_dsl_keyword.c | 7 ++--- tests/unit/tests_util_dsl_keyword.c | 14 ++------- 6 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/lang/lang_3bc_compile.c b/src/lang/lang_3bc_compile.c index 2f21f1ca..aafe0e1a 100644 --- a/src/lang/lang_3bc_compile.c +++ b/src/lang/lang_3bc_compile.c @@ -29,7 +29,7 @@ union ___u8_u16_t { * @par JOKE * why you need for CPP if C language is already 'complete and total'? * { .keyword.name = "mode", .opcode = 7 } <-- not allowed in C++ - */ + * @todo refact const tbc_keyword_st opcodes_arr[] = { { "aloc", 2 }, { "back", 1 }, { "call", 1 }, { "fake", 2 }, { "fcal", 2 }, { "fgto", 2 }, { "free", 1 }, { "fret", 2 }, { "goto", 1 }, { "math", 1 }, { "micr", 3 }, @@ -39,8 +39,8 @@ const tbc_keyword_st opcodes_arr[] = { { "aloc", 2 }, { "pull", 3 }, { "push", 5 }, { "real", 1 }, { "seco", 5 }, { "spin", 4 }, { "strb", 1 }, { "strc", 5 }, { "stri", 3 }, { "stro", 2 }, { "strx", 4 }, { "zcal", 3 }, { "zgto", 3 }, { "zret", 3 } }; - -const tbc_i8_t opcodes_size = sizeof(opcodes_arr) / sizeof(*opcodes_arr); +*/ +//const tbc_i8_t opcodes_size = sizeof(opcodes_arr) / sizeof(*opcodes_arr); static const tbc_u8_t column_size[] = {3, 9 ,12}; static const tbc_u8_t column_errors[] = {ERROR_INVALID_REGISTER, @@ -147,7 +147,7 @@ void lang_3bc_compile(tbc_app_st *const self) } } else if (tokens_idk[i] == 4) { - tbc_i16_t key = util_dsl_keyword(tokens[i], opcodes_arr, opcodes_size); + /*tbc_i16_t key = util_dsl_keyword(tokens[i], opcodes_arr, opcodes_size); if (key >= 0) { if (column_size[i] > 8) { *cpu_r[i].u16 = opcodes_arr[key].value; @@ -156,7 +156,7 @@ void lang_3bc_compile(tbc_app_st *const self) } } else { self->cache.l1.error = ERROR_INVALID_MNEMONIC; - } + }*/ } else { self->cache.l1.error = column_errors[i]; diff --git a/src/util/util_dsl.c b/src/util/util_dsl.c index 2e17a496..25d6e7f0 100644 --- a/src/util/util_dsl.c +++ b/src/util/util_dsl.c @@ -17,6 +17,7 @@ #include #include "util_dsl.h" +#include "detect/detect_cpu.h" #include "types/types_null.h" /** @@ -237,14 +238,15 @@ tbc_i8_t util_dsl_line(char **beg, char **mid, char **end, char *src, tbc_u8_t s * @retval 0..32_768 when found * */ -tbc_i16_t util_dsl_keyword(const char *const src, const tbc_keyword_st *const kl, tbc_i16_t kn) +tbc_i16_t util_dsl_keyword(const char *const src, const char *const keys, tbc_i16_t kn) { tbc_i16_t res = -2; tbc_i16_t low = 0; tbc_i16_t high = (kn - 1); tbc_i16_t mid; tbc_i32_t sum; - tbc_keyword_st my; + tbc_keyword_ut key; + tbc_keyword_ut *kl = (tbc_keyword_ut*) keys; do { if (src == NULL) { @@ -260,27 +262,41 @@ tbc_i16_t util_dsl_keyword(const char *const src, const tbc_keyword_st *const kl /* correct params */ res = -1; +#if defined(TBC_CPU_BYTE_SEXBE) + /* copy normal */ + key.name[0] = src[0]; + key.name[1] = src[1]; + key.name[2] = src[2]; + key.name[3] = src[3]; +#elif defined(TBC_CPU_BYTE_SEXLE) /* copy reversed */ - my.key.name[0] = src[3]; - my.key.name[1] = src[2]; - my.key.name[2] = src[1]; - my.key.name[3] = src[0]; - + key.name[0] = src[3]; + key.name[1] = src[2]; + key.name[2] = src[1]; + key.name[3] = src[0]; +#else +#error "[3BC] CPU sex not found." +#endif /* force to lowercase */ - my.key.compare |= 0x20202020; + key.compare |= 0x20202020; /* binary search */ do { /* find middle */ mid = (low + high) / 2; - /* force litle endian sub */ +#if defined(TBC_CPU_BYTE_SEXBE) + /* native cpu sub */ + sum = ((tbc_keyword_ut*)keys)[mid].compare - key.compare; +#else + /* force big endian sub */ sum = 0; - sum |= kl[mid].key.name[3]; - sum |= kl[mid].key.name[2] << 8; - sum |= kl[mid].key.name[1] << 16; - sum |= kl[mid].key.name[0] << 24; - sum -= *(tbc_i32_t*)&my.key.compare; + sum |= ((tbc_keyword_ut*)keys)[mid].name[3]; + sum |= ((tbc_keyword_ut*)keys)[mid].name[2] << 8; + sum |= ((tbc_keyword_ut*)keys)[mid].name[1] << 16; + sum |= ((tbc_keyword_ut*)keys)[mid].name[0] << 24; + sum -= key.compare; +#endif /* found */ if (sum == 0) { @@ -298,6 +314,6 @@ tbc_i16_t util_dsl_keyword(const char *const src, const tbc_keyword_st *const kl } while (low <= high); } while(0); - + return res; } diff --git a/src/util/util_dsl.h b/src/util/util_dsl.h index 5d6f6ecb..fbd67259 100644 --- a/src/util/util_dsl.h +++ b/src/util/util_dsl.h @@ -3,20 +3,15 @@ #include "types/types_primitive.h" -typedef struct ___tbc_keyword_s tbc_keyword_st; +typedef union ___tbc_keyword_key_u tbc_keyword_ut; union ___tbc_keyword_key_u { - char name[5]; + char name[4]; tbc_i32_t compare; }; -struct ___tbc_keyword_s { - union ___tbc_keyword_key_u key; - tbc_i16_t value; -}; - tbc_i8_t util_dsl_split(char** dest, tbc_u8_t* destn, char* src, tbc_u8_t dn, tbc_u8_t sn); tbc_i8_t util_dsl_line(char **beg, char **mid, char **end, char *src, tbc_u8_t sn); -tbc_i16_t util_dsl_keyword(const char *const src, const tbc_keyword_st *const kl, tbc_i16_t kn); +tbc_i16_t util_dsl_keyword(const char *const src, const char *const keys, tbc_i16_t kn); #endif diff --git a/tests/unit/error_driver_stack.c b/tests/unit/error_driver_stack.c index 48d2cd6a..dde615a9 100644 --- a/tests/unit/error_driver_stack.c +++ b/tests/unit/error_driver_stack.c @@ -15,7 +15,7 @@ int main() unsigned char stack[16] = {0}; driver_stack_init(&app, &stack, 0); assert(app.rc == TBC_RET_THROW_ERROR); - assert(app.cache_l1.error == ERROR_MEM_STACK_CFG_MIS); + assert(app.cache.l1.error == ERROR_MEM_STACK_CFG_MIS); } /** Test case 2: Stack configuration with insufficient stack size */ { @@ -24,7 +24,7 @@ int main() unsigned char stack[4] = {0}; driver_stack_init(&app, &stack, sizeof(stack)); assert(app.rc == TBC_RET_THROW_ERROR); - assert(app.cache_l1.error == ERROR_MEM_STACK_CFG_MIN); + assert(app.cache.l1.error == ERROR_MEM_STACK_CFG_MIN); } /** Test case 3: Stack configuration with insufficient memory to configure all components */ { @@ -33,6 +33,6 @@ int main() unsigned char stack[16] = {0}; driver_stack_init(&app, &stack, sizeof(stack)); assert(app.rc == TBC_RET_THROW_ERROR); - assert(app.cache_l1.error == ERROR_MEM_STACK_CFG_OUT); + assert(app.cache.l1.error == ERROR_MEM_STACK_CFG_OUT); } } \ No newline at end of file diff --git a/tests/unit/error_util_dsl_keyword.c b/tests/unit/error_util_dsl_keyword.c index 18572b98..127d6438 100644 --- a/tests/unit/error_util_dsl_keyword.c +++ b/tests/unit/error_util_dsl_keyword.c @@ -2,11 +2,8 @@ #include "types/types_null.h" #include "util/util_dsl.h" -static tbc_keyword_st keywords[] = { - {"aldo", 2}, {"erdb", 3}, {"rona", 1}, {"socc", 2} -}; - -static const int kn = sizeof(keywords)/sizeof(tbc_keyword_st); +static const char keywords[] = "aldo" "erdb" "rona" "socc"; +static const int kn = sizeof(keywords)/4; int main() { diff --git a/tests/unit/tests_util_dsl_keyword.c b/tests/unit/tests_util_dsl_keyword.c index 89830e1a..c7cb5c44 100644 --- a/tests/unit/tests_util_dsl_keyword.c +++ b/tests/unit/tests_util_dsl_keyword.c @@ -1,10 +1,8 @@ #include #include "util/util_dsl.h" -static tbc_keyword_st keywords[] = { - {"aldo", 2}, {"erdb", 3}, {"rona", 1}, {"socc", 2} -}; -static const int kn = sizeof(keywords)/sizeof(tbc_keyword_st); +static const char keywords[] = "aldo" "erdb" "rona" "socc"; +static const int kn = sizeof(keywords)/4; int main() { @@ -12,49 +10,41 @@ int main() char key[] = "aldo"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 0); - assert(keywords[index].value == 2); } { char key[] = "erdb"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 1); - assert(keywords[index].value == 3); } { char key[] = "rona"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 2); - assert(keywords[index].value == 1); } { char key[] = "socc"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 3); - assert(keywords[index].value == 2); } { char key[] = "ALDO"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 0); - assert(keywords[index].value == 2); } { char key[] = "ERDB"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 1); - assert(keywords[index].value == 3); } { char key[] = "RONA"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 2); - assert(keywords[index].value == 1); } { char key[] = "SOCC"; int index = util_dsl_keyword(key, keywords, kn); assert(index == 3); - assert(keywords[index].value == 2); } return 0; } \ No newline at end of file