#define _CRT_SECURE_NO_WARNINGS #include #include #include "lang.h" #include "os.h" #include "memory.h" #include "common.c" #include "memory.c" #include "scratch.c" #include "os_win32.c" #include "new_lex.c" //----------------------------------------------------------------------------- // 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, 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)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); }