--- capa/capa51/pProj/capaFormula.y 1999/09/28 21:26:21 1.1.1.1 +++ capa/capa51/pProj/capaFormula.y 2000/08/23 16:55:12 1.7 @@ -1,7 +1,29 @@ +/* formula parser + Copyright (C) 1992-2000 Michigan State University + + The CAPA system is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The CAPA system is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with the CAPA system; see the file COPYING. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + As a special exception, you have permission to link this program + with the TtH/TtM library and distribute executables, as long as you + follow the requirements of the GNU GPL in regard to all of the + software in the executable aside from TtH/TtM. +*/ /* ====================================================== */ /* capaFormula.y created by Isaac Tsai @ Feb 1999 */ -/* copyrighted by Isaac Tsai 1999 */ /* TODO: checking user inputs 2/27/99 IT */ /* ====================================================== */ %{ @@ -12,6 +34,10 @@ #include "capaParser.h" /* _symbol structure def */ #include "capaCommon.h" #include "capaFunction.h" +#ifdef YYSTYPE +#undef YYSTYPE +#endif +#define YYSTYPE Symbol_p #include "capaToken.h" #ifdef __hpux @@ -36,16 +62,12 @@ #define IDIV_op 5 #define NOT_DEFINED_op 9 -#ifdef YYSTYPE -#undef YYSTYPE -#endif -#define YYSTYPE Symbol_p /* =============================================================== */ extern int Func_idx; extern Symbol FuncStack[MAX_FUNC_NEST]; - +void fml_error(char *msg); double FormulaVal; int FormulaParseOK=1; @@ -126,6 +148,7 @@ basic_item : F_ID F_LPAR F_RPAR $$ = do_function(tmp, $3->s_argc, $3->s_argp); capa_mfree(FuncStack[Func_idx].s_name); free_arglist($3->s_argp); + $3->s_argp=NULL; } } | V_ID { FMLDBUG_PR3("[V %s = %.16g] ",$1->s_name, $1->s_real); @@ -194,6 +217,9 @@ f_symbol_pow(ap,bp) Symbol *ap; Symbol * case S_CONSTANT: default: error = 1; break; } + if ((!(((double)((int)b)) == b)) && (a < 0.0)) { + error = 1; + } if (!error) { cp = (Symbol *)capa_malloc(sizeof(Symbol),1); cp->s_type = R_CONSTANT;