diff options
Diffstat (limited to 'grammar')
-rw-r--r-- | grammar/Makefile.am | 8 | ||||
-rw-r--r-- | grammar/rainerscript.c | 21 |
2 files changed, 17 insertions, 12 deletions
diff --git a/grammar/Makefile.am b/grammar/Makefile.am index 5911f443..d231bb46 100644 --- a/grammar/Makefile.am +++ b/grammar/Makefile.am @@ -13,7 +13,7 @@ libgrammar_la_SOURCES = \ grammar.h libgrammar_la_CPPFLAGS = $(RSRT_CFLAGS) -testdriver_SOURCES = testdriver.c libgrammar.la -testdriver_CPPFLAGS = $(RSRT_CFLAGS) -testdriver_LDADD = libgrammar.la -testdriver_LDFLAGS = -lestr +#testdriver_SOURCES = testdriver.c libgrammar.la +#testdriver_CPPFLAGS = $(RSRT_CFLAGS) +#testdriver_LDADD = libgrammar.la +#testdriver_LDFLAGS = -lestr diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index d1d64e6e..a5cc10c2 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -623,14 +623,13 @@ cnfactlstAddSysline(struct cnfactlst* actlst, char *line) struct cnfcfsyslinelst *cflst; if((cflst = malloc(sizeof(struct cnfcfsyslinelst))) != NULL) { - cflst->next = NULL; cflst->line = line; if(actlst->syslines == NULL) { - actlst->syslines = cflst; + cflst->next = NULL; } else { cflst->next = actlst->syslines; - actlst->syslines = cflst; } + actlst->syslines = cflst; } return actlst; } @@ -743,9 +742,11 @@ var2Number(struct var *r, int *bSuccess) if(r->datatype == 'S') { n = es_str2num(r->d.estr, bSuccess); } else { - *bSuccess = 1; + n = r->d.n; + if(bSuccess) + *bSuccess = 1; } - return r->d.n; + return n; } /* ensure that retval is a string; if string is no number, @@ -1128,8 +1129,9 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr) ret->d.n = 1ll; else ret->d.n = 0ll; + if(r.datatype == 'S') es_deleteStr(r.d.estr); } - FREE_BOTH_RET; + if(l.datatype == 'S') es_deleteStr(l.d.estr); break; case AND: cnfexprEval(expr->l, &l, usrptr); @@ -1140,10 +1142,11 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr) ret->d.n = 1ll; else ret->d.n = 0ll; + if(r.datatype == 'S') es_deleteStr(r.d.estr); } else { ret->d.n = 0ll; } - FREE_BOTH_RET; + if(l.datatype == 'S') es_deleteStr(l.d.estr); break; case NOT: cnfexprEval(expr->r, &r, usrptr); @@ -1408,6 +1411,9 @@ cnfrulePrint(struct cnfrule *rule) dbgprintf("------ end rule %p\n", rule); } +/* note: the sysline itself was already freed during processing + * and as such MUST NOT be freed again! + */ void cnfcfsyslinelstDestruct(struct cnfcfsyslinelst *cfslst) { @@ -1415,7 +1421,6 @@ cnfcfsyslinelstDestruct(struct cnfcfsyslinelst *cfslst) while(cfslst != NULL) { toDel = cfslst; cfslst = cfslst->next; - free(toDel->line); free(toDel); } } |