[Plib-cvs] plib/src/psl pslCodeGen.cxx,1.19,1.20 pslCompiler.cxx,1.19,1.20 pslCompiler.h,1.21,1.22 p
Brought to you by:
sjbaker
From: Steve B. <sj...@us...> - 2002-09-14 05:32:19
|
Update of /cvsroot/plib/plib/src/psl In directory usw-pr-cvs1:/tmp/cvs-serv30751/plib/src/psl Modified Files: pslCodeGen.cxx pslCompiler.cxx pslCompiler.h pslContext.cxx pslDump.cxx pslOpcodes.h Log Message: Added missing '%=' assignment operator. Added error checks for '/= 0' or '%= 0' or floating point '%='. Index: pslCodeGen.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCodeGen.cxx,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- pslCodeGen.cxx 14 Sep 2002 04:45:54 -0000 1.19 +++ pslCodeGen.cxx 14 Sep 2002 05:32:16 -0000 1.20 @@ -170,6 +170,15 @@ } +void pslCompiler::pushModAssignment ( const char *c ) +{ + int a = getVarSymbol ( c ) ; + + pushCodeByte ( OPCODE_POP_MOD_VARIABLE ) ; + pushCodeByte ( a ) ; +} + + void pslCompiler::pushDivAssignment ( const char *c ) { int a = getVarSymbol ( c ) ; Index: pslCompiler.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCompiler.cxx,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- pslCompiler.cxx 14 Sep 2002 04:45:55 -0000 1.19 +++ pslCompiler.cxx 14 Sep 2002 05:32:16 -0000 1.20 @@ -491,15 +491,11 @@ getToken ( c ) ; - if ( strcmp ( c, "=" ) != 0 && - strcmp ( c, "+=" ) != 0 && - strcmp ( c, "-=" ) != 0 && - strcmp ( c, "/=" ) != 0 && - strcmp ( c, "*=" ) != 0 && - strcmp ( c, "&=" ) != 0 && - strcmp ( c, "|=" ) != 0 && - strcmp ( c, "^=" ) != 0 && - strcmp ( c, "<<=" ) != 0 && + if ( strcmp ( c, "=" ) != 0 && strcmp ( c, "+=" ) != 0 && + strcmp ( c, "-=" ) != 0 && strcmp ( c, "/=" ) != 0 && + strcmp ( c, "*=" ) != 0 && strcmp ( c, "%=" ) != 0 && + strcmp ( c, "&=" ) != 0 && strcmp ( c, "|=" ) != 0 && + strcmp ( c, "^=" ) != 0 && strcmp ( c, "<<=" ) != 0 && strcmp ( c, ">>=" ) != 0 ) { ungetToken ( c ) ; @@ -514,6 +510,7 @@ if ( strcmp ( c, "+=" ) == 0 ) pushAddAssignment ( var ) ; else if ( strcmp ( c, "-=" ) == 0 ) pushSubAssignment ( var ) ; else if ( strcmp ( c, "*=" ) == 0 ) pushMulAssignment ( var ) ; else + if ( strcmp ( c, "%=" ) == 0 ) pushModAssignment ( var ) ; else if ( strcmp ( c, "/=" ) == 0 ) pushDivAssignment ( var ) ; else if ( strcmp ( c, "&=" ) == 0 ) pushAndAssignment ( var ) ; else if ( strcmp ( c, "|=" ) == 0 ) pushOrAssignment ( var ) ; else Index: pslCompiler.h =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCompiler.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- pslCompiler.h 14 Sep 2002 04:45:55 -0000 1.21 +++ pslCompiler.h 14 Sep 2002 05:32:16 -0000 1.22 @@ -121,6 +121,7 @@ void pushAddAssignment ( const char *s ) ; void pushSubAssignment ( const char *s ) ; void pushMulAssignment ( const char *s ) ; + void pushModAssignment ( const char *s ) ; void pushDivAssignment ( const char *s ) ; void pushAndAssignment ( const char *s ) ; void pushOrAssignment ( const char *s ) ; Index: pslContext.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslContext.cxx,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- pslContext.cxx 14 Sep 2002 04:45:55 -0000 1.10 +++ pslContext.cxx 14 Sep 2002 05:32:16 -0000 1.11 @@ -506,14 +506,46 @@ return PSL_PROGRAM_CONTINUE ; + case OPCODE_POP_MOD_VARIABLE : + { + pslVariable *v = & ( variable [ code[++pc] ] ) ; + pslValue *vv = & stack[--sp] ; + + if ( v -> getType () == PSL_INT ) + { + if ( vv -> getInt () != 0 ) + v -> set ( v -> getInt() % vv->getInt()) ; + else + warning ( "Integer Modulo by Zero!" ) ; + } + else + warning ( "Floating Point Modulo!" ) ; + + pc++ ; + } + return PSL_PROGRAM_CONTINUE ; + + + case OPCODE_POP_DIV_VARIABLE : { pslVariable *v = & ( variable [ code[++pc] ] ) ; + pslValue *vv = & stack[--sp] ; if ( v -> getType () == PSL_INT ) - v -> set ( v -> getInt() / stack[--sp].getInt()) ; + { + if ( vv -> getInt () != 0 ) + v -> set ( v -> getInt() / vv->getInt()) ; + else + warning ( "Integer Divide by Zero!" ) ; + } else - v -> set ( v -> getFloat() / stack[--sp].getFloat()) ; + { + if ( vv -> getFloat () != 0.0f ) + v -> set ( v -> getFloat() / vv->getFloat()) ; + else + warning ( "Floating Point Divide by Zero!" ) ; + } pc++ ; } return PSL_PROGRAM_CONTINUE ; Index: pslDump.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslDump.cxx,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- pslDump.cxx 14 Sep 2002 04:45:55 -0000 1.16 +++ pslDump.cxx 14 Sep 2002 05:32:16 -0000 1.17 @@ -103,6 +103,7 @@ { "POP_ADD_VARIABLE", OPCODE_POP_ADD_VARIABLE, 1 }, { "POP_SUB_VARIABLE", OPCODE_POP_SUB_VARIABLE, 1 }, { "POP_MUL_VARIABLE", OPCODE_POP_MUL_VARIABLE, 1 }, + { "POP_MOD_VARIABLE", OPCODE_POP_MOD_VARIABLE, 1 }, { "POP_DIV_VARIABLE", OPCODE_POP_DIV_VARIABLE, 1 }, { "POP_AND_VARIABLE", OPCODE_POP_AND_VARIABLE, 1 }, { "POP_OR_VARIABLE" , OPCODE_POP_OR_VARIABLE , 1 }, Index: pslOpcodes.h =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslOpcodes.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- pslOpcodes.h 14 Sep 2002 04:45:55 -0000 1.8 +++ pslOpcodes.h 14 Sep 2002 05:32:16 -0000 1.9 @@ -71,10 +71,11 @@ #define OPCODE_POP_ADD_VARIABLE 0x30 #define OPCODE_POP_SUB_VARIABLE 0x31 #define OPCODE_POP_MUL_VARIABLE 0x32 -#define OPCODE_POP_DIV_VARIABLE 0x33 -#define OPCODE_POP_AND_VARIABLE 0x34 -#define OPCODE_POP_OR_VARIABLE 0x35 -#define OPCODE_POP_XOR_VARIABLE 0x36 -#define OPCODE_POP_SHL_VARIABLE 0x37 -#define OPCODE_POP_SHR_VARIABLE 0x38 +#define OPCODE_POP_MOD_VARIABLE 0x33 +#define OPCODE_POP_DIV_VARIABLE 0x34 +#define OPCODE_POP_AND_VARIABLE 0x35 +#define OPCODE_POP_OR_VARIABLE 0x36 +#define OPCODE_POP_XOR_VARIABLE 0x37 +#define OPCODE_POP_SHL_VARIABLE 0x38 +#define OPCODE_POP_SHR_VARIABLE 0x39 |