diff options
Diffstat (limited to 'grammar/utils.c')
-rw-r--r-- | grammar/utils.c | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/grammar/utils.c b/grammar/utils.c index 28e1a04a..c26a856c 100644 --- a/grammar/utils.c +++ b/grammar/utils.c @@ -8,11 +8,9 @@ void readConfFile(FILE *fp, es_str_t **str) { - int c; char ln[10240]; int len, i; int start; /* start index of to be submitted text */ - char *fgetsRet; int bContLine = 0; *str = es_newStr(4096); @@ -177,7 +175,7 @@ cnfcfsyslinelstReverse(struct cnfcfsyslinelst *lst) struct cnfcfsyslinelst *curr, *prev; if(lst == NULL) - return; + return NULL; prev = lst; lst = lst->next; prev->next = NULL; @@ -231,6 +229,75 @@ cnfactlstPrint(struct cnfactlst *actlst) printf("----------\n"); } +struct cnfexpr* +cnfexprNew(int nodetype, struct cnfexpr *l, struct cnfexpr *r) +{ + struct cnfexpr *expr; + if((expr = malloc(sizeof(struct cnfexpr))) != NULL) { + expr->nodetype = nodetype; + expr->l = l; + expr->r = r; + } + return expr; +} + + +inline static void +doIndent(indent) +{ + int i; + for(i = 0 ; i < indent ; ++i) + printf(" "); +} +void +cnfexprPrint(struct cnfexpr *expr, int indent) +{ + //printf("expr %p, indent %d, type '%c'\n", expr, indent, expr->nodetype); + switch(expr->nodetype) { + case 'N': + doIndent(indent); + printf("%lld\n", ((struct cnfnumval*)expr)->val); + break; + case '+': + case '-': + case '*': + case '/': + case '%': + case 'M': + if(expr->l != NULL) + cnfexprPrint(expr->l, indent+1); + doIndent(indent); + printf("%c\n", (char) expr->nodetype); + cnfexprPrint(expr->r, indent+1); + break; + default: + printf("error: unknown nodetype\n"); + break; + } +} + +struct cnfnumval* +cnfnumvalNew(long long val) +{ + struct cnfnumval *numval; + if((numval = malloc(sizeof(struct cnfnumval))) != NULL) { + numval->nodetype = 'N'; + numval->val = val; + } + return numval; +} + +struct cnfstringval* +cnfstringvalNew(es_str_t *estr) +{ + struct cnfstringval *strval; + if((strval = malloc(sizeof(struct cnfstringval))) != NULL) { + strval->nodetype = 'S'; + strval->estr = estr; + } + return strval; +} + /* debug helper */ void cstrPrint(char *text, es_str_t *estr) |