a44421a79fb36cc2036fe116b97ea3bc9590cd0c braney Fri Dec 2 09:34:39 2011 -0800 removed rcsid (#295) diff --git src/lib/intExp.c src/lib/intExp.c index 82a2c52..67c3d2c 100644 --- src/lib/intExp.c +++ src/lib/intExp.c @@ -1,154 +1,153 @@ /* Below is the worlds sleaziest little numerical expression * evaluator. Used to do only ints, now does doubles as well. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "kxTok.h" -static char const rcsid[] = "$Id: intExp.c,v 1.6 2003/05/06 07:33:43 kate Exp $"; static struct kxTok *tok; #define nextTok() (tok = tok->next) #ifdef DEBUG static void nextTok() /* Advance to next token. */ { if (tok == NULL) printf("(null)"); else { printf("'%s' -> ", tok->string); if (tok->next == NULL) printf("(null)\n"); else printf("'%s'\n", tok->next->string); } tok = tok->next; } #endif /* DEBUG */ static double expression(); /* Forward declaration of main expression handler. */ static double number() /* Return number. */ { double val; if (tok == NULL) errAbort("Parse error in numerical expression"); if (!isdigit(tok->string[0])) errAbort("Expecting number, got %s", tok->string); val = atof(tok->string); nextTok(); return val; } static double atom() /* Return parenthetical expression or number. */ { double val; if (tok->type == kxtOpenParen) { nextTok(); val = expression(); if (tok->type == kxtCloseParen) { nextTok(); return val; } else { errAbort("Unmatched parenthesis"); return 0; } } else return number(); } static double uMinus() /* Unary minus. */ { double val; if (tok->type == kxtSub) { nextTok(); val = -atom(); return val; } else return atom(); } static double mulDiv() /* Multiplication or division. */ { double val = uMinus(); for (;;) { if (tok->type == kxtMul) { nextTok(); val *= uMinus(); } else if (tok->type == kxtDiv) { nextTok(); val /= uMinus(); } else break; } return val; } static double addSub() /* Addition or subtraction. */ { double val; val = mulDiv(); for (;;) { if (tok->type == kxtAdd) { nextTok(); val += mulDiv(); } else if (tok->type == kxtSub) { nextTok(); val -= mulDiv(); } else break; } return val; } static double expression() /* Wraps around lowest level of expression. */ { return addSub(); } double doubleExp(char *text) /* Convert text to double expression and evaluate. */ { double val; struct kxTok *tokList = tok = kxTokenize(text, FALSE); val = expression(); slFreeList(&tokList); return val; } int intExp(char *text) /* Convert text to int expression and evaluate. */ { return round(doubleExp(text)); }