Added variables
This commit is contained in:
53
src/parse.c
53
src/parse.c
@@ -1,4 +1,5 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <parse.h>
|
#include <parse.h>
|
||||||
#include <vector.h>
|
#include <vector.h>
|
||||||
@@ -21,7 +22,6 @@ static int expandfile(struct expandfile *ret, char *filename, int level);
|
|||||||
static struct string *getstring(FILE *file, char end);
|
static struct string *getstring(FILE *file, char end);
|
||||||
|
|
||||||
int parsefile(char *template, FILE *out) {
|
int parsefile(char *template, FILE *out) {
|
||||||
int i;
|
|
||||||
struct expandfile *expanded;
|
struct expandfile *expanded;
|
||||||
expanded = malloc(sizeof *expanded);
|
expanded = malloc(sizeof *expanded);
|
||||||
if (expanded == NULL)
|
if (expanded == NULL)
|
||||||
@@ -34,12 +34,55 @@ int parsefile(char *template, FILE *out) {
|
|||||||
goto error3;
|
goto error3;
|
||||||
if (expandfile(expanded, template, 0))
|
if (expandfile(expanded, template, 0))
|
||||||
goto error4;
|
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;
|
return 0;
|
||||||
error4:
|
error4:
|
||||||
for (i = 0; i < expanded->vars->len; ++i) {
|
{
|
||||||
freestring(getvector(expanded->vars, struct var, i).var);
|
int i;
|
||||||
freestring(getvector(expanded->vars, struct var, i).value);
|
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);
|
freevector(expanded->vars);
|
||||||
error3:
|
error3:
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ struct string *newstring() {
|
|||||||
if (ret == NULL)
|
if (ret == NULL)
|
||||||
goto error1;
|
goto error1;
|
||||||
ret->len = 0;
|
ret->len = 0;
|
||||||
ret->alloc = 5;
|
ret->alloc = 200;
|
||||||
/* TODO: Change this to a far reasonable number */
|
|
||||||
ret->data = malloc(ret->alloc);
|
ret->data = malloc(ret->alloc);
|
||||||
if (ret->data == NULL)
|
if (ret->data == NULL)
|
||||||
goto error2;
|
goto error2;
|
||||||
|
|||||||
Reference in New Issue
Block a user