From 1df548ce06d0de285f83a82f9c7f58c0815979c6 Mon Sep 17 00:00:00 2001 From: Nate Choe Date: Mon, 6 Jun 2022 12:31:19 -0500 Subject: [PATCH] Added variables --- src/parse.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++----- src/strings.c | 3 +-- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/parse.c b/src/parse.c index 893f74f..8b07d2c 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -21,7 +22,6 @@ static int expandfile(struct expandfile *ret, char *filename, int level); static struct string *getstring(FILE *file, char end); int parsefile(char *template, FILE *out) { - int i; struct expandfile *expanded; expanded = malloc(sizeof *expanded); if (expanded == NULL) @@ -34,12 +34,55 @@ int parsefile(char *template, FILE *out) { goto error3; if (expandfile(expanded, template, 0)) goto error4; - fwrite(expanded->data->data, 1, expanded->data->len, out); + { + long i; + for (i = 0; i < expanded->data->len; ++i) { + if (expanded->data->data[i] == ESCAPE_CHAR) { + switch (expanded->data->data[++i]) { + case ESCAPE_CHAR: + fputc(ESCAPE_CHAR, out); + break; + case VAR_CHAR: { + long start; + int j; + struct string *data; + struct vector *vars; + char *varname; + data = expanded->data; + start = ++i; + while (data->data[i] != ESCAPE_CHAR && + i < data->len) + ++i; + data->data[i] = '\0'; + varname = data->data + start; + vars = expanded->vars; + for (j = 0; j < vars->len; ++j) { + struct var var; + var = getvector(vars, + struct var, j); + if (strcmp(var.var->data, + varname) == 0) { + fputs(var.value->data, + out); + } + } + } + } + } + else + fputc(expanded->data->data[i], out); + } + } return 0; error4: - for (i = 0; i < expanded->vars->len; ++i) { - freestring(getvector(expanded->vars, struct var, i).var); - freestring(getvector(expanded->vars, struct var, i).value); + { + int i; + for (i = 0; i < expanded->vars->len; ++i) { + struct var var; + var = getvector(expanded->vars, struct var, i); + freestring(var.var); + freestring(var.value); + } } freevector(expanded->vars); error3: diff --git a/src/strings.c b/src/strings.c index e18a520..5b16d21 100644 --- a/src/strings.c +++ b/src/strings.c @@ -9,8 +9,7 @@ struct string *newstring() { if (ret == NULL) goto error1; ret->len = 0; - ret->alloc = 5; - /* TODO: Change this to a far reasonable number */ + ret->alloc = 200; ret->data = malloc(ret->alloc); if (ret->data == NULL) goto error2;