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,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,
}
},
];

View File

@ -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);
}