This commit is contained in:
Krzosa Karol
2022-05-07 15:48:53 +02:00
parent d3ede16bab
commit 042127239e
11 changed files with 629 additions and 266 deletions

View File

@@ -13,24 +13,54 @@
#include "new_lex.c"
int main(){
FILE *f = fopen("generated.c", "w");
assert(f);
//-----------------------------------------------------------------------------
// String replacing util
//-----------------------------------------------------------------------------
typedef struct String_Map String_Map;
struct String_Map{
String replace;
String with;
};
function void
output_template(FILE *f, String filename, String_Map *map, SizeU map_cap){
Arena *scratch = arena_begin_scratch();
String file = os_read_file(scratch, lit("token_array.c"));
Token_Array array = lex_stream(scratch, file, lit("token_array.c"));
for(Token *t = token_array_iter_begin(&array); t; t = token_array_iter_next(&array)){
String file = os_read_file(scratch, filename);
Token_Array array = lex_stream(scratch, file, filename);
for(Token *t = token_array_iter_begin(&array); t->kind != TK_End; t = token_array_iter_next(&array)){
String string = t->string;
for(SizeU i = 0; i < map_cap; i++){
if(string_compare(string, map[i].replace)){
string = map[i].with;
break;
}
}
fprintf(f, "%.*s", (int)t->len, t->str);
fprintf(f, "%.*s", (int)string.len, string.str);
if(t->kind == TK_OpenBrace) fprintf(f, "\n");
if(t->kind == TK_CloseBrace && token_array_iter_peek(&array, 0)->kind != TK_Semicolon) fprintf(f, "\n");
if(t->kind == TK_Semicolon) fprintf(f, "\n");
if(t->kind == TK_Keyword) fprintf(f, " ");
if(t[0].kind == TK_Identifier && token_array_iter_peek(&array, 0)->kind == TK_Identifier) fprintf(f, " ");
token_array_iter_peek(&array, 1);
}
arena_end_scratch();
}
int main(){
FILE *f = fopen("generated.c", "w");
assert(f);
String_Map map[] = {
{lit("Type"), lit("Decl")},
{lit("first"), lit("list_decl.first")},
{lit("last"), lit("list_decl.last")},
{lit("remove"), lit("decl_list_remove")},
{lit("push_front"), lit("decl_dll_list_push_front")},
{lit("push"), lit("decl_dll_list_push")},
};
output_template(f, lit("dllqueue.c"), map, buff_cap(map));
fclose(f);
}