/* | |
* Copyright (C) 2006 by Darren Reed. | |
* | |
* See the IPFILTER.LICENCE file for details on licencing. | |
* | |
* $Id$ | |
*/ | |
#include "ipf.h" | |
alist_t * | |
load_file(char *filename) | |
{ | |
alist_t *a, *rtop, *rbot; | |
char *s, line[1024], *t; | |
int linenum, not; | |
FILE *fp; | |
fp = fopen(filename + 7, "r"); | |
if (fp == NULL) { | |
fprintf(stderr, "load_file cannot open '%s'\n", filename); | |
return NULL; | |
} | |
a = NULL; | |
rtop = NULL; | |
rbot = NULL; | |
linenum = 0; | |
while (fgets(line, sizeof(line) - 1, fp)) { | |
line[sizeof(line) - 1] = '\0'; | |
linenum++; | |
/* | |
* Hunt for CR/LF. If no LF, stop processing. | |
*/ | |
s = strchr(line, '\n'); | |
if (s == NULL) { | |
fprintf(stderr, "%d:%s: line too long\n", linenum, filename); | |
fclose(fp); | |
alist_free(rtop); | |
return NULL; | |
} | |
*s = '\0'; | |
s = strchr(line, '\r'); | |
if (s != NULL) | |
*s = '\0'; | |
for (t = line; isspace(*t); t++) | |
; | |
if (*t == '!') { | |
not = 1; | |
t++; | |
} else | |
not = 0; | |
/* | |
* Remove comment markers | |
*/ | |
for (s = t; *s; s++) { | |
if (*s == '#') | |
*s = '\0'; | |
} | |
if (!*t) | |
continue; | |
/* | |
* Trim off tailing white spaces | |
*/ | |
s = strlen(t) + t - 1; | |
while (isspace(*s)) | |
*s-- = '\0'; | |
if (isdigit(*t)) { | |
a = alist_new(4, t); | |
a->al_not = not; | |
if (rbot != NULL) | |
rbot->al_next = a; | |
else | |
rtop = a; | |
rbot = a; | |
} else { | |
fprintf(stderr, "%s: unrecognised content line %d\n", | |
filename, linenum); | |
} | |
} | |
fclose(fp); | |
return rtop; | |
} |