--- capa/capa51/pProj/capaFormula.y 2000/06/30 21:36:16 1.3 +++ capa/capa51/pProj/capaFormula.y 2000/10/06 20:54:45 1.8 @@ -2,23 +2,28 @@ 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 Library General Public License as + 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 - Library General Public License for more details. + General Public License for more details. - You should have received a copy of the GNU Library General Public + 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. */ + 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 */ /* ====================================================== */ %{ @@ -100,6 +105,20 @@ f_expr : block block : block F_PLUS term { $$ = symbols_op($1, $3, ADD_op); } | block F_MINUS term { $$ = symbols_op($1, $3, SUB_op); } + | F_MINUS term { $$ = $2; + switch($2->s_type) { + case I_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1); + $$->s_type = I_CONSTANT; + case I_CONSTANT: $$->s_int = - $2->s_int; break; + case R_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1); + $$->s_type = R_CONSTANT; + case R_CONSTANT: $$->s_real = (-1.0)*($2->s_real); + break; + case S_VAR: + case S_CONSTANT: break; + default: break; + } + } | term { $$ = $1; } | F_ERROR { FormulaParseOK = 0; FMLDBUG_PR1("[F_ERROR]\n"); return 0;} | error { FormulaParseOK = 0; FMLDBUG_PR1("[ERROR]\n"); return 0; } @@ -143,25 +162,12 @@ 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); $$ = $1; } - | F_MINUS basic_item { $$ = $2; - switch($2->s_type) { - case I_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1); - $$->s_type = I_CONSTANT; - case I_CONSTANT: $$->s_int = - $2->s_int; break; - case R_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1); - $$->s_type = R_CONSTANT; - case R_CONSTANT: $$->s_real = (-1.0)*($2->s_real); - break; - case S_VAR: - case S_CONSTANT: break; - default: break; - } - } | F_PLUS basic_item { $$ = $2; } | F_NUMBER { FMLDBUG_PR2("[F %.16g] ",$1->s_real); $$ = $1; @@ -211,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;