// testrp4.cpp // Copyright (c) Menno Rubingh 2016. Web: [http://rubinghsoftware.de] // // MR Mar 2016. // // Test of the RPInterpreter class. // //--- // Uses: // rpinterpreter.h -- RPInterpreter. // rpinterpreter.a -- Static library containing RPInterpreter implementation. // // //--- // Build: // g++ -Wall -ggdb -o testrp4 testrp4.cpp rpinterpreter.a -lm // #include "rpinterpreter.h" //RPInterpreter. #include <stdio.h> #include <fenv.h> //feclearexcept(), fetestexcept(). //------------------------------------------------------------------------------------- // MAIN: // - Read RP expression string from cmd line; // - Evaluate the expression on variables with hardcoded input values; // - After evaluation, print all variable values. //------------------------------------------------------------------------------------- void usage() { fprintf( stderr, "Usage: testrp4 'RPEXPRESSION'\n" "Note: Put RPEXPRESSION between single quotes to prevent shell expansion.\n" ); fprintf( stderr, "\n%s\n", RPInterpreter::helptxt() ); } int main( int argc, char ** argv ) { if ( argc < 2 ) { usage(); return -1; } char const * arg_expr = argv[1]; printf( "expr = [%s]\n", arg_expr ); // Parse the expression. RPInterpreter rp; if ( ! rp.scanFromString( arg_expr ) ) { return -1; } rp.dump( stdout ); // Evaluate the expression, on variables with hardcoded initial values. // All variables left at initial value zero, except 'a', 'b', 'c'. rp.putVar( 'a', 0.2 ); rp.putVar( 'b', 1.3 ); rp.putVar( 'c', 2.5 ); feclearexcept( FE_ALL_EXCEPT ); rp.evaluate(); if ( fetestexcept( FE_INVALID ) ) { printf( "Runtime DomainError\n" ); } // Print all the variables (compactly, in three columns). int NCOL = 3; int NROW = (26+2)/NCOL; for ( int kRow = 0; kRow < NROW; kRow++ ) { for ( int kCol = 0; kCol < NCOL; kCol++ ) { char c = 'a' + kCol*NROW + kRow; printf( " | " ); if ( c <= 'z' ) { double val; bool f = rp.getVar( c, &val ); printf( "%c = %10g%s", c, val, ( f ? " " : "(EDOM)" ) ); // 012345 012345 } } printf( "\n" ); } return 0; }