diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2011-06-30 16:38:25 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2011-06-30 16:38:25 +0200 |
commit | 1eeeb6f603326234f1d17a16d3c55f8458f7177b (patch) | |
tree | b8c901b9943fb552aef1950d864b7836adc2f964 /grammar/utils.c | |
parent | a924cfe6c2da54829f4729d6d56f8a1cc402475e (diff) | |
download | rsyslog-1eeeb6f603326234f1d17a16d3c55f8458f7177b.tar.gz rsyslog-1eeeb6f603326234f1d17a16d3c55f8458f7177b.tar.bz2 rsyslog-1eeeb6f603326234f1d17a16d3c55f8458f7177b.zip |
first try towards a flex/bison based config parser
Diffstat (limited to 'grammar/utils.c')
-rw-r--r-- | grammar/utils.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/grammar/utils.c b/grammar/utils.c new file mode 100644 index 00000000..f9c50bc9 --- /dev/null +++ b/grammar/utils.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "libestr.h" + +void +readConfFile(FILE *fp, es_str_t **str) +{ + int c; + char ln[10240]; + int len, i; + int start; /* start index of to be submitted text */ + char *fgetsRet; + int bContLine = 0; + + *str = es_newStr(4096); + + while(fgets(ln, sizeof(ln), fp) != NULL) { + len = strlen(ln); + /* if we are continuation line, we need to drop leading WS */ + if(bContLine) { + for(start = 0 ; start < len && isspace(ln[start]) ; ++start) + /* JUST SCAN */; + } else { + start = 0; + } + for(i = len - 1 ; i >= start && isspace(ln[i]) ; --i) + /* JUST SCAN */; + if(i >= 0) { + if(ln[i] == '\\') { + --i; + bContLine = 1; + } else { + bContLine = 0; + } + /* add relevant data to buffer */ + es_addBuf(str, ln+start, i+1 - start); + if(!bContLine) + es_addChar(str, '\n'); + } + } + /* indicate end of buffer to flex */ + es_addChar(str, '\0'); + es_addChar(str, '\0'); +} |