From 9363c73bbdcd50ae05f27370ab92c433157ddc56 Mon Sep 17 00:00:00 2001 From: Timerix Date: Sat, 26 Apr 2025 03:19:44 +0500 Subject: [PATCH] fixed some bugs in parser --- example.proj.dtsod | 32 ++++++++++++++++++-------------- src/CompilationScenario.c | 30 +++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/example.proj.dtsod b/example.proj.dtsod index f93c159..f5df969 100644 --- a/example.proj.dtsod +++ b/example.proj.dtsod @@ -6,17 +6,15 @@ gcc: { src_dirs: [ "src" ], }; -configurations: { - release: { - preprocess_sources: { - src_languages: [ "c", "c++" ], - src_dirs: [ "src" ], - }, - gcc: { - pre_args: [ "-O2" ], - post_args: [ "-Wl,--gc-sections" ], - }; - }; +release: { + preprocess_sources: { + src_languages: [ "c", "c++" ], + src_dirs: [ "src" ], + }, + gcc: { + pre_args: [ "-O2" ], + post_args: [ "-Wl,--gc-sections" ], + }, }; tasks: { @@ -24,7 +22,7 @@ tasks: { pre_tasks: [ ], tool_order: [ "preprocess_sources", "gcc", "g++", "g++-link" ], #g++: [ ... ], - }; + }, }; languages: [ @@ -35,14 +33,20 @@ languages: [ { aliases: [ "c-header" ], file_extensions: [ "h" ], - } + }, ]; tools: [ + { + aliases: [ "preprocess_sources" ], + exe_file: "echo", + supported_languages: [ "any" ], + parallel: false, + }, { aliases: [ "gcc" ], exe_file: "gcc", supported_languages: [ "c" ]; # set to "any" to use with any lang parallel: false, - } + }, ]; \ No newline at end of file diff --git a/src/CompilationScenario.c b/src/CompilationScenario.c index 5c34a43..b21c3e5 100644 --- a/src/CompilationScenario.c +++ b/src/CompilationScenario.c @@ -74,11 +74,14 @@ Maybe Tool_tryApplyOptions(Tool* t, Hashtable* dtsod){ if(!UniCheckTypePtr(val, Autoarr(Unitype))) safethrow("src_languages value expected to be a string array", ;); Autoarr(Unitype)* ar = val.VoidPtr; + + Unitype any_lang_uni; + bool is_any_language = Hashtable_tryGet(t->supported_languages, "any", &any_lang_uni); Autoarr_foreach(ar, el, if(!UniCheckTypePtr(el, char)) safethrow("src_languages array values expected to be string", ;); const char* l_name = el.VoidPtr; - if(!Hashtable_tryGet(t->supported_languages, l_name, &val)) + if(!is_any_language && !Hashtable_tryGet(t->supported_languages, l_name, &val)) safethrow(cptr_concat("language '", l_name, "' isn't supported by tool '", Autoarr_get(t->aliases, 0), "'"), ;); Hashtable_add(t->src_languages, l_name, val); ) @@ -127,11 +130,7 @@ Maybe CompilationScenario_tryApplyPlatformSpecificOptions(CompilationScenario* s try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, os_and_arch), _m2, ;); free(os_and_arch); - os_and_arch = cptr_concat(os, "_", arch); - try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, os_and_arch), _m3, ;); - free(os_and_arch); - - return SUCCESS(UniBool(_m0.value.Bool || _m1.value.Bool || _m2.value.Bool || _m3.value.Bool)); + return SUCCESS(UniBool(_m0.value.Bool || _m1.value.Bool || _m2.value.Bool)); } Maybe CompilationScenario_applyConfigurationOptions(CompilationScenario* sc, Hashtable* dtsod, const char* configuration){ @@ -142,8 +141,13 @@ Maybe CompilationScenario_applyConfigurationOptions(CompilationScenario* sc, Has } Maybe CompilationScenario_applyTaskOptions(CompilationScenario* sc, Hashtable* dtsod, const char* task){ - try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, task), _m0, ;); - if(!_m0.value.Bool) + Unitype tasks_uni; + if(!Hashtable_tryGet(dtsod, "tasks", &tasks_uni)) + safethrow(cptr_concat("key 'tasks' not found"), ;); + if(!UniCheckTypePtr(tasks_uni, Hashtable)) + safethrow(ERR_WRONGTYPE, ;); + try(CompilationScenario_tryApplyConditionalOptions(sc, tasks_uni.VoidPtr, task), _m1, ;); + if(!_m1.value.Bool) safethrow(cptr_concat("task '", task, "' not found"), ;); return MaybeNull; } @@ -192,10 +196,18 @@ Maybe CompilationScenario_tryRegisterLanguages(CompilationScenario* sc, Hashtabl // registers each alias of the language Autoarr_foreach(aliases, l_name, if(!Hashtable_tryAdd(sc->languages, l_name, UniHeapPtr(Language, lang))) - safethrow(cptr_concat("language '", l_name, "has been already registered"), ;); + safethrow(cptr_concat("language '", l_name, "' has been already registered"), ;); ) ) + // "any" language + Language* any_lang = malloc(sizeof(Language)); + Autoarr(Pointer)* any_aliases = Autoarr_create(Pointer, 1, 1); + Autoarr_add(any_aliases, cptr_copy("any")); + Language_construct(any_lang, any_aliases, Autoarr_create(Pointer, 0, 0)); + if(!Hashtable_tryAdd(sc->languages, "any", UniHeapPtr(Language, any_lang))) + safethrow(cptr_concat("language '", "any", "has been already registered"), ;); + return SUCCESS(UniTrue); }