diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2012-09-04 12:00:01 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2012-09-04 12:00:01 +0200 |
commit | 68b9fe72b89ff47efdbed8fea4185bac84279a51 (patch) | |
tree | c3335f0e23037b240d4dabbf3b424f54e2253aef | |
parent | aa8c79794e00c42ef3b89753f38cef511abb90b3 (diff) | |
download | rsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.tar.gz rsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.tar.bz2 rsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.zip |
new ruleengine: script block correctly built
-rw-r--r-- | grammar/grammar.y | 22 | ||||
-rw-r--r-- | grammar/lexer.l | 2 | ||||
-rw-r--r-- | grammar/rainerscript.c | 102 | ||||
-rw-r--r-- | grammar/rainerscript.h | 4 |
4 files changed, 83 insertions, 47 deletions
diff --git a/grammar/grammar.y b/grammar/grammar.y index 6a5256d5..6e1fd913 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -145,8 +145,8 @@ nvlst: { $$ = NULL; } | nvlst nv { $2->next = $1; $$ = $2; } nv: NAME '=' VALUE { $$ = nvlstNew($1, $3); } script: stmt { $$ = $1; dbgprintf("RRRR: root stmt\n"); } - | script stmt { $2->next = $1; $$ = $2; dbgprintf("RRRR: stmt in list\n"); } -stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst\n"); } + | script stmt { $$ = scriptAddStmt($1, $2); dbgprintf("RRRR: stmt in list:\n");cnfstmtPrint($2, 0);dbgprintf("\n"); } +stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst %p\n", $1); } | STOP { $$ = cnfstmtNew(S_STOP); dbgprintf("RRRR: have STOP\n"); } | IF expr THEN block { $$ = cnfstmtNew(S_IF); @@ -160,20 +160,24 @@ stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst\n"); } $$->d.cond.t_else = $6; dbgprintf("RRRR: have s_if \n"); } | PRIFILT block { $$ = cnfstmtNew(S_PRIFILT); - $$->d.cond.printable = $1; + $$->printable = $1; $$->d.cond.expr = $1; $$->d.cond.t_then = $2; - dbgprintf("RRRR: have s_prifilt\n"); } + dbgprintf("RRRR: have s_prifilt %p\n", $2);cnfstmtPrint($2, 0);dbgprintf("\n"); } | PROPFILT block { $$ = cnfstmtNew(S_PROPFILT); $$->d.cond.expr = $1; $$->d.cond.t_then = $2; dbgprintf("RRRR: have s_propfilt\n"); } -block: stmt { $$ = $1; dbgprintf("RRRR: have block:stmt\n"); } +block: stmt { $$ = $1; dbgprintf("RRRR: have block:stmt %p\n", $1); } | '{' script '}' { $$ = $2; dbgprintf("RRRR: have block:script\n"); } -actlst: s_act { $$ = $1; dbgprintf("RRRR: have s_act\n"); } - | actlst '&' s_act { $3->next = $1; $$ = $3; dbgprintf("RRRR: have actlst actlst:s_act\n"); } -s_act: BEGIN_ACTION nvlst ENDOBJ { $$ = cnfstmtNew(S_ACT); dbgprintf("RRRR: action object\n"); } - | LEGACY_ACTION { $$ = cnfstmtNew(S_ACT); dbgprintf("RRRR: legacy action\n"); } +actlst: s_act { $$ = $1; dbgprintf("RRRR: have s_act, %p\n", $1); } + | actlst '&' s_act { $$ = scriptAddStmt($1, $3); dbgprintf("RRRR: have actlst actlst:s_act\n"); } +s_act: BEGIN_ACTION nvlst ENDOBJ { $$ = cnfstmtNew(S_ACT); + $$->printable="action()"; + dbgprintf("RRRR: action object\n"); } + | LEGACY_ACTION { $$ = cnfstmtNew(S_ACT); + $$->printable = $1; + dbgprintf("RRRR: legacy action\n"); } /* rule: PRIFILT actlst { $$ = cnfruleNew(CNFFILT_PRI, $2); $$->filt.s = $1; } | PROPFILT actlst { $$ = cnfruleNew(CNFFILT_PROP, $2); $$->filt.s = $1; } diff --git a/grammar/lexer.l b/grammar/lexer.l index d603c449..a56df4f8 100644 --- a/grammar/lexer.l +++ b/grammar/lexer.l @@ -165,7 +165,7 @@ int fileno(FILE *stream); "action"[ \n\t]*"(" { dbgprintf("RRRR: lexer: %s\n", yytext); BEGIN INOBJ; return BEGIN_ACTION; } ^[ \t]*:\$?[a-z\-]+[ ]*,[ ]*!?[a-z]+[ ]*,[ ]*\".*\" { yylval.s = strdup(yytext); return PROPFILT; } -^[ \t]*[\*a-z][,\*a-z]*[0-7]*\.[,!=;\.\*a-z0-7]+ { yylval.s = strdup(yytext); return PRIFILT; } +^[ \t]*[\*a-z][,\*a-z]*[0-7]*\.[,!=;\.\*a-z0-7]+ { yylval.s = strdup(rmLeadingSpace(yytext)); return PRIFILT; } "~" | "*" | \-\/[^*][^\n]* | diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index 2d5bbd9b..b127b906 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -130,6 +130,25 @@ objlstAdd(struct objlst *root, struct cnfobj *o) return root; } +/* add stmt to current script, always return root stmt pointer */ +struct cnfstmt* +scriptAddStmt(struct cnfstmt *root, struct cnfstmt *s) +{ + struct cnfstmt *l; +dbgprintf("RRRR: scriptAddStmt(%p, %p): ", root, s); + + if(root == NULL) { + root = s; +dbgprintf("root set to %p\n", s); + } else { /* find last, linear search ok, as only during config phase */ + for(l = root ; l->next != NULL ; l = l->next) + ; + l->next = s; +dbgprintf("%p->next = %p\n", l, s); + } + return root; +} + void objlstDestruct(struct objlst *lst) { @@ -1498,45 +1517,47 @@ cnfexprPrint(struct cnfexpr *expr, int indent) } } void -cnfstmtPrint(struct cnfstmt *stmt, int indent) +cnfstmtPrint(struct cnfstmt *root, int indent) { + struct cnfstmt *stmt; //dbgprintf("stmt %p, indent %d, type '%c'\n", expr, indent, expr->nodetype); - switch(stmt->nodetype) { - case S_STOP: - doIndent(indent); dbgprintf("STOP\n"); - break; - case S_ACT: - doIndent(indent); dbgprintf("ACTION %p\n", stmt->d.act); - break; - case S_IF: - doIndent(indent); dbgprintf("IF\n"); - cnfexprPrint(stmt->d.cond.expr, indent+1); - doIndent(indent); dbgprintf("THEN\n"); - cnfstmtPrint(stmt->d.cond.t_then, indent+1); - if(stmt->d.cond.t_else != NULL) { - doIndent(indent); dbgprintf("ELSE\n"); - cnfstmtPrint(stmt->d.cond.t_else, indent+1); + for(stmt = root ; stmt != NULL ; stmt = stmt->next) { + switch(stmt->nodetype) { + case S_STOP: + doIndent(indent); dbgprintf("STOP\n"); + break; + case S_ACT: + doIndent(indent); dbgprintf("ACTION %p (%s)\n", stmt->d.act, stmt->printable); + break; + case S_IF: + doIndent(indent); dbgprintf("IF\n"); + cnfexprPrint(stmt->d.cond.expr, indent+1); + doIndent(indent); dbgprintf("THEN\n"); + cnfstmtPrint(stmt->d.cond.t_then, indent+1); + if(stmt->d.cond.t_else != NULL) { + doIndent(indent); dbgprintf("ELSE\n"); + cnfstmtPrint(stmt->d.cond.t_else, indent+1); + } + doIndent(indent); dbgprintf("END IF\n"); + break; + case S_PRIFILT: + doIndent(indent); dbgprintf("PRIFILT '%s'\n", stmt->printable); + //cnfexprPrint(stmt->d.cond.expr, indent+1); + cnfstmtPrint(stmt->d.cond.t_then, indent+1); + doIndent(indent); dbgprintf("END PRIFILT\n"); + break; + case S_PROPFILT: + doIndent(indent); dbgprintf("PROPFILT\n"); + cnfexprPrint(stmt->d.cond.expr, indent+1); + doIndent(indent); dbgprintf("THEN\n"); + cnfstmtPrint(stmt->d.cond.t_then, indent+1); + doIndent(indent); dbgprintf("END PROPFILT\n"); + break; + default: + dbgprintf("error: unknown stmt type %u\n", + (unsigned) stmt->nodetype); + break; } - doIndent(indent); dbgprintf("END IF\n"); - break; - case S_PRIFILT: - doIndent(indent); dbgprintf("PRIFILT '%s'\n", stmt->d.cond.printable); - //cnfexprPrint(stmt->d.cond.expr, indent+1); - doIndent(indent); dbgprintf("THEN\n"); - cnfstmtPrint(stmt->d.cond.t_then, indent+1); - doIndent(indent); dbgprintf("END PRIFILT\n"); - break; - case S_PROPFILT: - doIndent(indent); dbgprintf("PROPFILT\n"); - cnfexprPrint(stmt->d.cond.expr, indent+1); - doIndent(indent); dbgprintf("THEN\n"); - cnfstmtPrint(stmt->d.cond.t_then, indent+1); - doIndent(indent); dbgprintf("END PROPFILT\n"); - break; - default: - dbgprintf("error: unknown stmt type %u\n", - (unsigned) stmt->nodetype); - break; } } @@ -1873,6 +1894,15 @@ cstrPrint(char *text, es_str_t *estr) free(str); } +char * +rmLeadingSpace(char *s) +{ + char *p; + for(p = s ; *p && isspace(*p) ; ++p) + ; + return(p); +} + /* init must be called once before any parsing of the script files start */ rsRetVal initRainerscript(void) diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h index 1fe7f1b9..2d4d9271 100644 --- a/grammar/rainerscript.h +++ b/grammar/rainerscript.h @@ -157,10 +157,10 @@ struct cnfrule { struct cnfstmt { /* base statement, for simple types */ unsigned nodetype; struct cnfstmt *next; + uchar *printable; /* printable text for debugging */ union { struct { struct cnfexpr *expr; - uchar *printable; /* printable expr for debugging */ struct cnfstmt *t_then; struct cnfstmt *t_else; } cond; @@ -296,6 +296,8 @@ void cnfparamvalsDestruct(struct cnfparamvals *paramvals, struct cnfparamblk *bl void cnfcfsyslinelstDestruct(struct cnfcfsyslinelst *cfslst); struct cnfstmt * cnfstmtNew(unsigned s_type); void cnfstmtPrint(struct cnfstmt *stmt, int indent); +struct cnfstmt* scriptAddStmt(struct cnfstmt *root, struct cnfstmt *s); +char *rmLeadingSpace(char *s); rsRetVal initRainerscript(void); /* debug helper */ |