Removed POSIX specific code, got variable values
This commit is contained in:
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@ SRC = $(wildcard src/*.c)
|
|||||||
OBJ = $(subst .c,.o,$(subst src,work,$(SRC)))
|
OBJ = $(subst .c,.o,$(subst src,work,$(SRC)))
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
CFLAGS := -O2 -pipe -Wall -Wpedantic -Wshadow -ansi
|
CFLAGS := -O2 -pipe -Wall -Wpedantic -Wshadow -ansi
|
||||||
CFLAGS += -Isrc/include/ -D_POSIX_C_SOURCE=2
|
CFLAGS += -Isrc/include/
|
||||||
INSTALLDIR := /usr/bin/
|
INSTALLDIR := /usr/bin/
|
||||||
OUT = ncdg
|
OUT = ncdg
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#define ESCAPE_CHAR '%'
|
#define ESCAPE_CHAR '%'
|
||||||
#define INCLUDE_CHAR '@'
|
#define INCLUDE_CHAR '@'
|
||||||
#define VAR_CHAR '='
|
#define VAR_CHAR '>'
|
||||||
|
#define SET_CHAR '='
|
||||||
|
|
||||||
#define MAX_INCLUDE_DEPTH 10
|
#define MAX_INCLUDE_DEPTH 10
|
||||||
|
|||||||
19
src/include/vector.h
Normal file
19
src/include/vector.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef HAVE_VECTOR
|
||||||
|
#define HAVE_VECTOR
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
struct vector {
|
||||||
|
void *data;
|
||||||
|
size_t len;
|
||||||
|
size_t alloc;
|
||||||
|
size_t membersize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct vector *newvectorsize(size_t membersize);
|
||||||
|
#define newvector(type) newvectorsize(sizeof(type))
|
||||||
|
#define getvector(vector, type, ind) (((type *) (vector)->data)[ind])
|
||||||
|
int addvector(struct vector *vector, void *item);
|
||||||
|
void freevector(struct vector *vector);
|
||||||
|
|
||||||
|
#endif
|
||||||
68
src/parse.c
68
src/parse.c
@@ -1,23 +1,56 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <parse.h>
|
#include <parse.h>
|
||||||
#include <string.h>
|
#include <vector.h>
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
static int expandfile(struct string *expanded, char *filename, int level);
|
struct var {
|
||||||
|
struct string *var;
|
||||||
|
struct string *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct expandfile {
|
||||||
|
struct string *data;
|
||||||
|
struct vector *vars;
|
||||||
|
/* This is a vector of struct var */
|
||||||
|
};
|
||||||
|
|
||||||
|
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) {
|
||||||
struct string *expanded;
|
int i;
|
||||||
expanded = newstring();
|
struct expandfile *expanded;
|
||||||
|
expanded = malloc(sizeof *expanded);
|
||||||
if (expanded == NULL)
|
if (expanded == NULL)
|
||||||
return 1;
|
goto error1;
|
||||||
|
expanded->data = newstring();
|
||||||
|
if (expanded->data == NULL)
|
||||||
|
goto error2;
|
||||||
|
expanded->vars = newvector(struct var);
|
||||||
|
if (expanded->vars == NULL)
|
||||||
|
goto error3;
|
||||||
if (expandfile(expanded, template, 0))
|
if (expandfile(expanded, template, 0))
|
||||||
return 1;
|
goto error4;
|
||||||
fwrite(expanded->data, 1, expanded->len, stdout);
|
fwrite(expanded->data->data, 1, expanded->data->len, out);
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
freevector(expanded->vars);
|
||||||
|
error3:
|
||||||
|
freestring(expanded->data);
|
||||||
|
error2:
|
||||||
|
free(expanded);
|
||||||
|
error1:
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int expandfile(struct string *expanded, char *filename, int level) {
|
static int expandfile(struct expandfile *ret, char *filename, int level) {
|
||||||
FILE *file;
|
FILE *file;
|
||||||
int c, linenum;
|
int c, linenum;
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
@@ -39,28 +72,37 @@ static int expandfile(struct string *expanded, char *filename, int level) {
|
|||||||
c = fgetc(file);
|
c = fgetc(file);
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case ESCAPE_CHAR:
|
case ESCAPE_CHAR:
|
||||||
if (appendchar(expanded, ESCAPE_CHAR))
|
if (appendchar(ret->data, ESCAPE_CHAR))
|
||||||
|
goto error;
|
||||||
|
if (appendchar(ret->data, ESCAPE_CHAR))
|
||||||
goto error;
|
goto error;
|
||||||
break;
|
break;
|
||||||
case VAR_CHAR:
|
case VAR_CHAR:
|
||||||
if (appendchar(expanded, ESCAPE_CHAR))
|
if (appendchar(ret->data, ESCAPE_CHAR))
|
||||||
goto error;
|
goto error;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
goto error;
|
goto error;
|
||||||
if (appendchar(expanded, c))
|
if (appendchar(ret->data, c))
|
||||||
goto error;
|
goto error;
|
||||||
if (c == ESCAPE_CHAR)
|
if (c == ESCAPE_CHAR)
|
||||||
break;
|
break;
|
||||||
c = fgetc(file);
|
c = fgetc(file);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SET_CHAR: {
|
||||||
|
struct var var;
|
||||||
|
var.var = getstring(file, ' ');
|
||||||
|
var.value = getstring(file, ESCAPE_CHAR);
|
||||||
|
addvector(ret->vars, &var);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case INCLUDE_CHAR: {
|
case INCLUDE_CHAR: {
|
||||||
struct string *inclname;
|
struct string *inclname;
|
||||||
inclname = getstring(file, ESCAPE_CHAR);
|
inclname = getstring(file, ESCAPE_CHAR);
|
||||||
if (inclname == NULL)
|
if (inclname == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
if (expandfile(expanded, inclname->data,
|
if (expandfile(ret, inclname->data,
|
||||||
level + 1))
|
level + 1))
|
||||||
return 1;
|
return 1;
|
||||||
freestring(inclname);
|
freestring(inclname);
|
||||||
@@ -78,7 +120,7 @@ static int expandfile(struct string *expanded, char *filename, int level) {
|
|||||||
case EOF:
|
case EOF:
|
||||||
goto end;
|
goto end;
|
||||||
default: casedefault:
|
default: casedefault:
|
||||||
if (appendchar(expanded, c))
|
if (appendchar(ret->data, c))
|
||||||
goto error;
|
goto error;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <strings.h>
|
||||||
|
|
||||||
struct string *newstring() {
|
struct string *newstring() {
|
||||||
struct string *ret;
|
struct string *ret;
|
||||||
@@ -25,9 +25,7 @@ int appendchar(struct string *string, char c) {
|
|||||||
if (string->len >= string->alloc) {
|
if (string->len >= string->alloc) {
|
||||||
char *newdata;
|
char *newdata;
|
||||||
size_t newalloc;
|
size_t newalloc;
|
||||||
newalloc = string->alloc;
|
newalloc = string->alloc * 2;
|
||||||
while (string->len >= newalloc)
|
|
||||||
newalloc *= 2;
|
|
||||||
newdata = realloc(string->data, newalloc);
|
newdata = realloc(string->data, newalloc);
|
||||||
if (newdata == NULL)
|
if (newdata == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
42
src/vector.c
Normal file
42
src/vector.c
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <vector.h>
|
||||||
|
|
||||||
|
struct vector *newvectorsize(size_t membersize) {
|
||||||
|
struct vector *ret;
|
||||||
|
ret = malloc(sizeof *ret);
|
||||||
|
if (ret == NULL)
|
||||||
|
return NULL;
|
||||||
|
ret->alloc = 20;
|
||||||
|
ret->membersize = membersize;
|
||||||
|
ret->data = malloc(ret->alloc * ret->membersize);
|
||||||
|
if (ret->data == NULL) {
|
||||||
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret->len = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int addvector(struct vector *vector, void *item) {
|
||||||
|
if (vector->len >= vector->alloc) {
|
||||||
|
void *newdata;
|
||||||
|
size_t newalloc;
|
||||||
|
newalloc = vector->alloc * 2;
|
||||||
|
newdata = realloc(vector->data, newalloc * vector->alloc);
|
||||||
|
if (newdata == NULL)
|
||||||
|
return 1;
|
||||||
|
vector->data = newdata;
|
||||||
|
vector->alloc = newalloc;
|
||||||
|
}
|
||||||
|
memcpy((char *) vector->data + vector->len * vector->membersize, item,
|
||||||
|
vector->membersize);
|
||||||
|
++vector->len;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void freevector(struct vector *vector) {
|
||||||
|
free(vector->data);
|
||||||
|
free(vector);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user