summaryrefslogtreecommitdiffstats
path: root/grammar/rainerscript.c
diff options
context:
space:
mode:
Diffstat (limited to 'grammar/rainerscript.c')
-rw-r--r--grammar/rainerscript.c21
1 files changed, 13 insertions, 8 deletions
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);
}
}