diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-25 15:10:40 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-25 15:10:40 +0200 |
| commit | a8784eff9f40ca284cb03ae30a93287ea635ba91 (patch) | |
| tree | c8fdf11d077d76c3a21dd7b5dd49f7baef987e02 /src/tools | |
| parent | b26ae5886ddc7d0d84595fb5b94878f50d488d42 (diff) | |
| download | box64-a8784eff9f40ca284cb03ae30a93287ea635ba91.tar.gz box64-a8784eff9f40ca284cb03ae30a93287ea635ba91.zip | |
[RCFILE] Added support for generic names in RCFiles
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/rcfile.c | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c index 7f3f6a18..b105fa65 100644 --- a/src/tools/rcfile.c +++ b/src/tools/rcfile.c @@ -282,6 +282,7 @@ SUPER() KHASH_MAP_INIT_STR(params, my_params_t) static kh_params_t *params = NULL; +static kh_params_t *params_gen = NULL; static void clearParam(my_params_t* param) { @@ -306,17 +307,18 @@ static void clearParam(my_params_t* param) #undef ENTRYULONG } -static void addParam(const char* name, my_params_t* param) +static void addParam(const char* name, my_params_t* param, int gen) { khint_t k; - k = kh_get(params, params, name); - if(k==kh_end(params)) { + kh_params_t* khp = gen?params_gen:params; + k = kh_get(params, khp, name); + if(k==kh_end(khp)) { int ret; - k = kh_put(params, params, box_strdup(name), &ret); + k = kh_put(params, khp, box_strdup(name), &ret); } else { - clearParam(&kh_value(params, k)); + clearParam(&kh_value(khp, k)); } - my_params_t *p = &kh_value(params, k); + my_params_t *p = &kh_value(khp, k); memcpy(p, param, sizeof(my_params_t)); } @@ -364,6 +366,8 @@ void LoadRCFile(const char* filename) // init the hash table if needed if(!params) params = kh_init(params); + if(!params_gen) + params_gen = kh_init(params); // prepare to parse the file char* line = NULL; size_t lsize = 0; @@ -372,6 +376,7 @@ void LoadRCFile(const char* filename) int dummy; size_t len; char* p; + int decor = 1; // parsing while ((dummy = getline(&line, &lsize, f)) != -1) { // remove comments @@ -383,12 +388,16 @@ void LoadRCFile(const char* filename) if(line[0]=='[' && strchr(line, ']')) { // new entry, will need to add current one if(current_name) - addParam(current_name, ¤t_param); + addParam(current_name, ¤t_param, (decor==2)); + if(line[1]=='*' && line[(intptr_t)(strchr(line, ']')-line)-1]=='*') + decor = 2; + else + decor = 1; // prepare a new entry memset(¤t_param, 0, sizeof(current_param)); free(current_name); - current_name = LowerCase(line+1); - *strchr(current_name, ']') = '\0'; + current_name = LowerCase(line+decor); + *(strchr(current_name, ']')+1-decor) = '\0'; trimString(current_name); } else if(strchr(line, '=')) { // actual parameters @@ -463,7 +472,7 @@ void LoadRCFile(const char* filename) } // last entry to be pushed too if(current_name) { - addParam(current_name, ¤t_param); + addParam(current_name, ¤t_param, (decor==2)); free(current_name); } free(line); @@ -507,28 +516,39 @@ const char* GetLastApplyName() { return old_name; } +void internal_ApplyParams(const char* name, const my_params_t* param); void ApplyParams(const char* name) { if(!name || !params) return; - int new_cycle_log = cycle_log; - int new_maxcpu = box64_maxcpu; - int new_avx = box64_avx2?2:box64_avx; - int box64_dynarec_jvm = box64_jvm; - int new_reserve_high = 0; if(!strcmp(name, old_name)) { return; } strncpy(old_name, name, 255); - khint_t k; + khint_t k1; { char* lname = LowerCase(name); - k = kh_get(params, params, lname); + k1 = kh_get(params, params, lname); + my_params_t* param; + const char* k2; + kh_foreach_ref(params_gen, k2, param, + if(strstr(lname, k2)) + internal_ApplyParams(name, param); + ) free(lname); } - if(k == kh_end(params)) + if(k1 == kh_end(params)) return; - my_params_t* param = &kh_value(params, k); + my_params_t* param = &kh_value(params, k1); + internal_ApplyParams(name, param); +} + +void internal_ApplyParams(const char* name, const my_params_t* param) { + int new_cycle_log = cycle_log; + int new_maxcpu = box64_maxcpu; + int new_avx = box64_avx2?2:box64_avx; + int box64_dynarec_jvm = box64_jvm; + int new_reserve_high = 0; int want_exit = 0; #ifdef DYNAREC int olddynarec = box64_dynarec; |