From f8e7c7e3656085bee11b1667f32828dfb4e3df06 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 5 Jul 2011 12:33:48 +0200 Subject: milestone: some plumbing for rsyslog/stand alone parsing --- grammar/grammar.y | 13 +++++---- grammar/lexer.l | 4 +-- grammar/parserif.h | 8 +++--- grammar/testdriver.c | 30 +++++++++++++++++++++ grammar/utils.c | 76 ++++++++++++++++++++++++++-------------------------- 5 files changed, 83 insertions(+), 48 deletions(-) (limited to 'grammar') diff --git a/grammar/grammar.y b/grammar/grammar.y index 76881fd1..43e0289a 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -17,6 +17,7 @@ #include #include #include "utils.h" +#include "parserif.h" #define YYDEBUG 1 extern int yylineno; @@ -103,13 +104,13 @@ extern int yyerror(char*); * one by one. */ conf: /* empty (to end recursion) */ - | conf obj { printf("global:config: "); + | conf obj { dbgprintf("global:config: "); cnfobjPrint($2); cnfobjDestruct($2); } - | conf rule { printf("global:rule processed\n"); + | conf rule { dbgprintf("global:rule processed\n"); cnfrulePrint($2); } - | conf cfsysline { printf("global:cfsysline: %s\n", $2); } - | conf BSD_TAG_SELECTOR { printf("global:BSD tag '%s'\n", $2); } - | conf BSD_HOST_SELECTOR { printf("global:BSD host '%s'\n", $2); } + | conf cfsysline { dbgprintf("global:cfsysline: %s\n", $2); } + | conf BSD_TAG_SELECTOR { dbgprintf("global:BSD tag '%s'\n", $2); } + | conf BSD_HOST_SELECTOR { dbgprintf("global:BSD host '%s'\n", $2); } obj: BEGINOBJ nvlst ENDOBJ { $$ = cnfobjNew($1, $2); } | BEGIN_ACTION nvlst ENDOBJ { $$ = cnfobjNew(CNFOBJ_ACTION, $2); } @@ -162,8 +163,10 @@ fparams: expr { $$ = cnffparamlstNew($1, NULL); } | expr ',' fparams { $$ = cnffparamlstNew($1, $3); } %% +/* int yyerror(char *s) { printf("parse failure on or before line %d: %s\n", yylineno, s); return 0; } +*/ diff --git a/grammar/lexer.l b/grammar/lexer.l index 2411be6f..ba432b2e 100644 --- a/grammar/lexer.l +++ b/grammar/lexer.l @@ -65,7 +65,7 @@ int cnfSetLexFile(char *fname); /* somehow, I need these prototype even though the headers are * included. I guess that's some autotools magic I don't understand... */ -char *strdup(char*); +//char *strdup(char*); int fileno(FILE *stream); %} @@ -209,7 +209,7 @@ cnfSetLexFile(char *fname) if(currbs != NULL) currbs->lineno = yylineno; bs->prev = currbs; - bs->fn = strdup(fname); + bs->fn = strdup(fname == NULL ? "stdin" : fname); bs->bs = yy_scan_buffer((char*)es_getBufAddr(str), es_strlen(str)); currbs = bs; currfn = bs->fn; diff --git a/grammar/parserif.h b/grammar/parserif.h index e22b7d34..b6986dd8 100644 --- a/grammar/parserif.h +++ b/grammar/parserif.h @@ -1,6 +1,8 @@ #ifndef PARSERIF_H_DEFINED #define PARSERIF_H_DEFINED -extern int cnfSetLexFile(char*); -extern int yyparse(); -extern int yydebug; +int cnfSetLexFile(char*); +int yyparse(); +int yydebug; +void dbgprintf(char *fmt, ...) __attribute__((format(printf, 1, 2))); +void parser_errmsg(char *fmt, ...) __attribute__((format(printf, 1, 2))); #endif diff --git a/grammar/testdriver.c b/grammar/testdriver.c index e1623829..915b5942 100644 --- a/grammar/testdriver.c +++ b/grammar/testdriver.c @@ -24,9 +24,39 @@ #include "config.h" #include #include +#include #include #include "parserif.h" +extern int yylineno; + +void +parser_errmsg(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + printf("error on or before line %d: ", yylineno); + vprintf(fmt, ap); + printf("\n"); + va_end(ap); +} + +int +yyerror(char *s) +{ + parser_errmsg("%s", s); + return 0; +} + +void +dbgprintf(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vfprintf(stdout, fmt, ap); + va_end(ap); +} + void cstrPrint(char *text, es_str_t *estr) { diff --git a/grammar/utils.c b/grammar/utils.c index d9bf67aa..0812fa6b 100644 --- a/grammar/utils.c +++ b/grammar/utils.c @@ -90,11 +90,11 @@ void nvlstPrint(struct nvlst *lst) { char *name, *value; - printf("nvlst %p:\n", lst); + dbgprintf("nvlst %p:\n", lst); while(lst != NULL) { name = es_str2cstr(lst->name, NULL); value = es_str2cstr(lst->value, NULL); - printf("\tname: '%s', value '%s'\n", name, value); + dbgprintf("\tname: '%s', value '%s'\n", name, value); free(name); free(value); lst = lst->next; @@ -126,7 +126,7 @@ cnfobjDestruct(struct cnfobj *o) void cnfobjPrint(struct cnfobj *o) { - printf("obj: '%s'\n", cnfobjType2str(o->objType)); + dbgprintf("obj: '%s'\n", cnfobjType2str(o->objType)); nvlstPrint(o->nvlst); } @@ -206,7 +206,7 @@ cnfactlstReverse(struct cnfactlst *actlst) prev = NULL; while(actlst != NULL) { - //printf("reversing: %s\n", actlst->data.legActLine); + //dbgprintf("reversing: %s\n", actlst->data.legActLine); curr = actlst; actlst = actlst->next; curr->syslines = cnfcfsyslinelstReverse(curr->syslines); @@ -222,17 +222,17 @@ cnfactlstPrint(struct cnfactlst *actlst) struct cnfcfsyslinelst *cflst; while(actlst != NULL) { - printf("aclst %p: ", actlst); + dbgprintf("aclst %p: ", actlst); if(actlst->actType == CNFACT_V2) { - printf("V2 action type: "); + dbgprintf("V2 action type: "); nvlstPrint(actlst->data.lst); } else { - printf("legacy action line: '%s'\n", + dbgprintf("legacy action line: '%s'\n", actlst->data.legActLine); } for( cflst = actlst->syslines ; cflst != NULL ; cflst = cflst->next) { - printf("action:cfsysline: '%s'\n", cflst->line); + dbgprintf("action:cfsysline: '%s'\n", cflst->line); } actlst = actlst->next; } @@ -266,7 +266,7 @@ static inline long long exprret2Number(struct exprret *r) { if(r->datatype == 'S') { - printf("toNumber CONVERSION MISSING\n"); abort(); + dbgprintf("toNumber CONVERSION MISSING\n"); abort(); } return r->d.n; } @@ -278,7 +278,7 @@ static inline es_str_t * exprret2String(struct exprret *r) { if(r->datatype == 'N') { - printf("toString CONVERSION MISSING\n"); abort(); + dbgprintf("toString CONVERSION MISSING\n"); abort(); } return r->d.estr; } @@ -304,7 +304,7 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret) { struct exprret r, l; /* memory for subexpression results */ - //printf("eval expr %p, type '%c'(%u)\n", expr, expr->nodetype, expr->nodetype); + //dbgprintf("eval expr %p, type '%c'(%u)\n", expr, expr->nodetype, expr->nodetype); switch(expr->nodetype) { case CMP_EQ: COMP_NUM_BINOP(==); @@ -382,7 +382,7 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret) default: ret->datatype = 'N'; ret->d.n = 0ll; - printf("eval error: unknown nodetype %u\n", + dbgprintf("eval error: unknown nodetype %u\n", (unsigned) expr->nodetype); break; } @@ -393,108 +393,108 @@ doIndent(int indent) { int i; for(i = 0 ; i < indent ; ++i) - printf(" "); + dbgprintf(" "); } void cnfexprPrint(struct cnfexpr *expr, int indent) { struct cnffparamlst *param; - //printf("expr %p, indent %d, type '%c'\n", expr, indent, expr->nodetype); + //dbgprintf("expr %p, indent %d, type '%c'\n", expr, indent, expr->nodetype); switch(expr->nodetype) { case CMP_EQ: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("==\n"); + dbgprintf("==\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_NE: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("!=\n"); + dbgprintf("!=\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_LE: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("<=\n"); + dbgprintf("<=\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_GE: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf(">=\n"); + dbgprintf(">=\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_LT: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("<\n"); + dbgprintf("<\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_GT: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf(">\n"); + dbgprintf(">\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_CONTAINS: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("CONTAINS\n"); + dbgprintf("CONTAINS\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_CONTAINSI: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("CONTAINS_I\n"); + dbgprintf("CONTAINS_I\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_STARTSWITH: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("STARTSWITH\n"); + dbgprintf("STARTSWITH\n"); cnfexprPrint(expr->r, indent+1); break; case CMP_STARTSWITHI: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("STARTSWITH_I\n"); + dbgprintf("STARTSWITH_I\n"); cnfexprPrint(expr->r, indent+1); break; case OR: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("OR\n"); + dbgprintf("OR\n"); cnfexprPrint(expr->r, indent+1); break; case AND: cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("AND\n"); + dbgprintf("AND\n"); cnfexprPrint(expr->r, indent+1); break; case NOT: doIndent(indent); - printf("NOT\n"); + dbgprintf("NOT\n"); cnfexprPrint(expr->r, indent+1); break; case 'S': doIndent(indent); cstrPrint("string '", ((struct cnfstringval*)expr)->estr); - printf("'\n"); + dbgprintf("'\n"); break; case 'N': doIndent(indent); - printf("%lld\n", ((struct cnfnumval*)expr)->val); + dbgprintf("%lld\n", ((struct cnfnumval*)expr)->val); break; case 'V': doIndent(indent); - printf("var '%s'\n", ((struct cnfvar*)expr)->name); + dbgprintf("var '%s'\n", ((struct cnfvar*)expr)->name); break; case 'F': doIndent(indent); cstrPrint("function '", ((struct cnffunc*)expr)->fname); - printf("'\n"); + dbgprintf("'\n"); for( param = ((struct cnffunc*)expr)->paramlst ; param != NULL ; param = param->next) { @@ -510,11 +510,11 @@ cnfexprPrint(struct cnfexpr *expr, int indent) if(expr->l != NULL) cnfexprPrint(expr->l, indent+1); doIndent(indent); - printf("%c\n", (char) expr->nodetype); + dbgprintf("%c\n", (char) expr->nodetype); cnfexprPrint(expr->r, indent+1); break; default: - printf("error: unknown nodetype %u\n", + dbgprintf("error: unknown nodetype %u\n", (unsigned) expr->nodetype); break; } @@ -568,22 +568,22 @@ cnfruleNew(enum cnfFiltType filttype, struct cnfactlst *actlst) void cnfrulePrint(struct cnfrule *rule) { - printf("------ start rule %p:\n", rule); - printf("%s: ", cnfFiltType2str(rule->filttype)); + dbgprintf("------ start rule %p:\n", rule); + dbgprintf("%s: ", cnfFiltType2str(rule->filttype)); switch(rule->filttype) { case CNFFILT_NONE: break; case CNFFILT_PRI: case CNFFILT_PROP: - printf("%s\n", rule->filt.s); + dbgprintf("%s\n", rule->filt.s); break; case CNFFILT_SCRIPT: - printf("\n"); + dbgprintf("\n"); cnfexprPrint(rule->filt.expr, 0); break; } cnfactlstPrint(rule->actlst); - printf("------ end rule %p\n", rule); + dbgprintf("------ end rule %p\n", rule); } struct cnffparamlst * -- cgit