fixed some bugs in parser

This commit is contained in:
Timerix 2025-04-26 03:19:44 +05:00
parent 63f0379df0
commit 9363c73bbd
2 changed files with 39 additions and 23 deletions

View File

@ -6,8 +6,7 @@ gcc: {
src_dirs: [ "src" ], src_dirs: [ "src" ],
}; };
configurations: { release: {
release: {
preprocess_sources: { preprocess_sources: {
src_languages: [ "c", "c++" ], src_languages: [ "c", "c++" ],
src_dirs: [ "src" ], src_dirs: [ "src" ],
@ -15,8 +14,7 @@ configurations: {
gcc: { gcc: {
pre_args: [ "-O2" ], pre_args: [ "-O2" ],
post_args: [ "-Wl,--gc-sections" ], post_args: [ "-Wl,--gc-sections" ],
}; },
};
}; };
tasks: { tasks: {
@ -24,7 +22,7 @@ tasks: {
pre_tasks: [ ], pre_tasks: [ ],
tool_order: [ "preprocess_sources", "gcc", "g++", "g++-link" ], tool_order: [ "preprocess_sources", "gcc", "g++", "g++-link" ],
#g++: [ ... ], #g++: [ ... ],
}; },
}; };
languages: [ languages: [
@ -35,14 +33,20 @@ languages: [
{ {
aliases: [ "c-header" ], aliases: [ "c-header" ],
file_extensions: [ "h" ], file_extensions: [ "h" ],
} },
]; ];
tools: [ tools: [
{
aliases: [ "preprocess_sources" ],
exe_file: "echo",
supported_languages: [ "any" ],
parallel: false,
},
{ {
aliases: [ "gcc" ], aliases: [ "gcc" ],
exe_file: "gcc", exe_file: "gcc",
supported_languages: [ "c" ]; # set to "any" to use with any lang supported_languages: [ "c" ]; # set to "any" to use with any lang
parallel: false, parallel: false,
} },
]; ];

View File

@ -74,11 +74,14 @@ Maybe Tool_tryApplyOptions(Tool* t, Hashtable* dtsod){
if(!UniCheckTypePtr(val, Autoarr(Unitype))) if(!UniCheckTypePtr(val, Autoarr(Unitype)))
safethrow("src_languages value expected to be a string array", ;); safethrow("src_languages value expected to be a string array", ;);
Autoarr(Unitype)* ar = val.VoidPtr; 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, Autoarr_foreach(ar, el,
if(!UniCheckTypePtr(el, char)) if(!UniCheckTypePtr(el, char))
safethrow("src_languages array values expected to be string", ;); safethrow("src_languages array values expected to be string", ;);
const char* l_name = el.VoidPtr; 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), "'"), ;); safethrow(cptr_concat("language '", l_name, "' isn't supported by tool '", Autoarr_get(t->aliases, 0), "'"), ;);
Hashtable_add(t->src_languages, l_name, val); 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, ;); try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, os_and_arch), _m2, ;);
free(os_and_arch); free(os_and_arch);
os_and_arch = cptr_concat(os, "_", arch); return SUCCESS(UniBool(_m0.value.Bool || _m1.value.Bool || _m2.value.Bool));
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));
} }
Maybe CompilationScenario_applyConfigurationOptions(CompilationScenario* sc, Hashtable* dtsod, const char* configuration){ 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){ Maybe CompilationScenario_applyTaskOptions(CompilationScenario* sc, Hashtable* dtsod, const char* task){
try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, task), _m0, ;); Unitype tasks_uni;
if(!_m0.value.Bool) 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"), ;); safethrow(cptr_concat("task '", task, "' not found"), ;);
return MaybeNull; return MaybeNull;
} }
@ -192,10 +196,18 @@ Maybe CompilationScenario_tryRegisterLanguages(CompilationScenario* sc, Hashtabl
// registers each alias of the language // registers each alias of the language
Autoarr_foreach(aliases, l_name, Autoarr_foreach(aliases, l_name,
if(!Hashtable_tryAdd(sc->languages, l_name, UniHeapPtr(Language, lang))) 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); return SUCCESS(UniTrue);
} }