summaryrefslogtreecommitdiffstats
path: root/grammar/rainerscript.c
diff options
context:
space:
mode:
Diffstat (limited to 'grammar/rainerscript.c')
-rw-r--r--grammar/rainerscript.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 558ec78f..d0a97f06 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1862,6 +1862,89 @@ cnfstmtNewLegaAct(char *actline)
done: return cnfstmt;
}
+
+/* (recursively) optimize an expression */
+void
+cnfexprOptimize(struct cnfexpr *expr)
+{
+ struct var r, l; /* memory for subexpression results */
+ es_str_t *estr_r, *estr_l;
+ int convok_r, convok_l;
+ int bMustFree, bMustFree2;
+ long long n_r, n_l;
+
+ dbgprintf("optimize expr %p, type '%c'(%u)\n", expr, expr->nodetype, expr->nodetype);
+ switch(expr->nodetype) {
+ case '&':
+ break;
+ case '+':
+ break;
+ case '-':
+ break;
+ case '*':
+ break;
+ case '/':
+ break;
+ case '%':
+ break;
+ default:DBGPRINTF("expr optimizer error: unknown nodetype %u['%c']\n",
+ (unsigned) expr->nodetype, (char) expr->nodetype);
+ break;
+ }
+
+}
+
+/* (recursively) optimize a statement */
+void
+cnfstmtOptimize(struct cnfstmt *root)
+{
+ struct cnfstmt *stmt, *prevstmt;
+
+ prevstmt = NULL;
+ for(stmt = root ; stmt != NULL ; stmt = stmt->next) {
+dbgprintf("RRRR: stmtOptimize: stmt %p, nodetype %u\n", stmt, stmt->nodetype);
+ switch(stmt->nodetype) {
+ case S_NOP:
+ /* unchain NOPs, first NOP remains (TODO?) */
+ if(prevstmt != NULL) {
+ DBGPRINTF("removing NOP\n");
+ prevstmt->next = stmt->next;
+#warning remove memleak, destruct
+ }
+ break;
+ case S_IF:
+ cnfexprOptimize(stmt->d.s_if.expr);
+ if(stmt->d.s_if.t_then != NULL) {
+ cnfstmtOptimize(stmt->d.s_if.t_then);
+ }
+ if(stmt->d.s_if.t_else != NULL) {
+ cnfstmtOptimize(stmt->d.s_if.t_else);
+ }
+ break;
+ case S_PRIFILT:
+ cnfstmtOptimize(stmt->d.s_prifilt.t_then);
+ break;
+ case S_PROPFILT:
+ cnfstmtOptimize(stmt->d.s_propfilt.t_then);
+ break;
+ case S_SET:
+ cnfexprOptimize(stmt->d.s_set.expr);
+ break;
+ case S_STOP:
+ case S_UNSET:
+ case S_ACT:
+ /* nothing to do */
+ break;
+ default:
+ dbgprintf("error: unknown stmt type %u during optimizer run\n",
+ (unsigned) stmt->nodetype);
+ break;
+ }
+ prevstmt = stmt;
+ }
+}
+
+
struct cnffparamlst *
cnffparamlstNew(struct cnfexpr *expr, struct cnffparamlst *next)
{