diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-02-16 17:11:38 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-02-16 17:11:38 -0800 |
| commit | 7410d984ae270528ea4f3f16d3473acf807ef92c (patch) | |
| tree | b98ceaab29da9d791392007ad1c8e99d82e7210a /src | |
| parent | a2063489b84cbc47bd51aee761b3c5dd35e0195f (diff) | |
preprocessor works now, added some helper methods and a few more frees
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse.c | 41 | ||||
| -rw-r--r-- | src/parse.h | 2 | ||||
| -rw-r--r-- | src/precedent.c | 28 |
3 files changed, 40 insertions, 31 deletions
diff --git a/src/parse.c b/src/parse.c index 27ee417..c7f5e5b 100644 --- a/src/parse.c +++ b/src/parse.c @@ -5,6 +5,19 @@ #include "parse.h" #include "hashtable.h" +sym_t* init_sym(prov_t province, litType_t litType, void* name) { + sym_t* symbol = malloc(sizeof(sym_t)); + symbol->province = province; + symbol->litType = litType; + symbol->name = name; + symbol->argCount = 0; + return symbol; +} +void destroy_sym(sym_t* symbol) { + free(symbol->name); + free(symbol->args); + free(symbol); +} int symtoi(sym_t* symbol) { return *((int*)symbol->name); } @@ -56,25 +69,21 @@ symset_t* parse_symbols(char** str) { symbolName[i] = **str; if (**str == ',' || **str == ';') { (*str)++; - sym_t* symbol = malloc(sizeof(sym_t)); - symbol->province = LITERAL; - symbol->argCount = 0; symbolName[i] = '\0'; + sym_t* symbol; /* TODO: float */ /* string */ if (isalpha(symbolName[0])) { //symbolName = realloc(symbolName, i * sizeof(char)); - symbol->name = symbolName; - symbol->litType = STRING; + symbol = init_sym(LITERAL, STRING, symbolName); } /* int */ else { int v = atoi(symbolName); int* vp = malloc(sizeof(int)); *vp = v; - symbol->name = (void*)vp; free(symbolName); - symbol->litType = INT; + symbol = init_sym(LITERAL, INT, vp); } symset_add_symbol(symbolSet, symbol); break; @@ -82,14 +91,15 @@ symset_t* parse_symbols(char** str) { else if (**str == '(') { (*str)++; symbolName[i] = '\0'; - sym_t* symbol = malloc(sizeof(sym_t)); - symbol->province = KEY_REF; - symbol->argCount = 0; + sym_t* symbol; if (i > 1) { - symbol->name = symbolName; + symbol = init_sym(KEY_REF, NO_TYPE, symbolName); } else { - symbol->name = "root"; + free(symbolName); + char* memName = malloc(5 * sizeof(char)); + strcpy(memName, "root"); + symbol = init_sym(KEY_REF, NO_TYPE, memName); } symset_t* symbols = parse_symbols(str); for (int s = 0; s < symbols->count; s++) { @@ -107,10 +117,9 @@ sym_t* parse_symbol_final(char* str) { char** strp = malloc(sizeof(char**)); *strp = str; symset_t* finalSymset = parse_symbols(strp); - sym_t* root = malloc(sizeof(sym_t)); - root->name = "root"; - root->province = KEY_REF; - root->argCount = 0; + char* memName = malloc(5 * sizeof(char)); + strcpy(memName, "root"); + sym_t* root = init_sym(KEY_REF, NO_TYPE, memName); for (int s = 0; s < finalSymset->count; s++) { symbol_add_arg(root, finalSymset->symbols[s]); } diff --git a/src/parse.h b/src/parse.h index 27ce444..59c27b7 100644 --- a/src/parse.h +++ b/src/parse.h @@ -28,6 +28,8 @@ typedef struct SymbolSet { int count; } symset_t; +sym_t* init_sym(prov_t province, litType_t litType, void* name); +void destroy_sym(sym_t* symbol); int symtoi(sym_t* symbol); float symtof(sym_t* symbol); char* symtos(sym_t* symbol); diff --git a/src/precedent.c b/src/precedent.c index 81555b9..8be2ad3 100644 --- a/src/precedent.c +++ b/src/precedent.c @@ -39,7 +39,11 @@ int main(int argc, char** argv) { char* baseDir = malloc((strlen(dirName) + 2) * sizeof(char)); strcpy(baseDir, dirName); strcat(baseDir, "/"); - sym_t* finalSymbol = parse_symbol_final(read_file(path)); + char* finalContent = preprocess(read_file(path), baseDir); + sym_t* finalSymbol = parse_symbol_final(finalContent); + free(pathCpy); + free(baseDir); + free(finalContent); if (visual) { printf("--BEGIN VISUALIZATION--\n"); write_symbol_visual(finalSymbol, 0); @@ -47,13 +51,13 @@ int main(int argc, char** argv) { } init_eval(); eval(finalSymbol); - free(dirName); - free(pathCpy); - free(baseDir); return 0; } char* read_file(char* path) { FILE* file = fopen(path, "r"); + if (file == NULL) { + printf("file %s does not exist\n", path); + } fseek(file, 0, SEEK_END); unsigned long int length = ftell(file); fseek(file, 0, SEEK_SET); @@ -63,18 +67,16 @@ char* read_file(char* path) { out[length] = '\0'; return out; } -/* wtf */ char* preprocess(char* str, char* baseDir) { - char* final = str; while (1) { int i = 0; while (str[i] != '@') { i++; if (str[i] == '\0') { - printf("%s\n", final); - return final; + return str; } } + str[i] = ' '; i++; char* includeName = malloc(20 * sizeof(char)); int f = 0; @@ -84,21 +86,17 @@ char* preprocess(char* str, char* baseDir) { i++; f++; } - final = str; includeName[f] = '\0'; char* path = malloc((strlen(baseDir) + strlen(includeName) + 1) * sizeof(char)); strcpy(path, baseDir); strcat(path, includeName); char* toInclude = preprocess(read_file(path), baseDir); - char* newStr = malloc((strlen(toInclude) + strlen(final) + 1) * sizeof(char)); + char* newStr = malloc((strlen(toInclude) + strlen(str) + 1) * sizeof(char)); strcpy(newStr, toInclude); - strcat(newStr, final); - /* + strcat(newStr, str); + str = newStr; free(includeName); free(path); - free(str); free(toInclude); - */ - final = newStr; } } |
