diff --git a/pub/src/curve.cpp b/pub/src/curve.cpp index 3c7108502d88cd9e3293031bca3e378603974002..6477ce93ecc382857552d14ae983cb2496436df9 100644 --- a/pub/src/curve.cpp +++ b/pub/src/curve.cpp @@ -107,9 +107,28 @@ ask_again: " c: external curve evaluation command (hc for help)\n"\ " ci: external command followed by interpolation (hci for help)\n"; goto ask_again; + } else if ( expr=="hc" ) { + cout << + "the external curve evaluation command must:\n"\ + "- read from stdin a whitespace separated list of:\n"\ + " - 1*int: the number of parameters M\n"\ + " - M*double: the parameters\n"\ + " - 1*int: the number of data points N\n"\ + " - N*double: the data points\n"\ + "- write to stdout a whitespace separated list of:\n"\ + " - N*double: the curve values\n"; + // "for examples, see /usr/local/share/frida/demo-curve-c" + } else if ( expr=="hci" ) { + cout << + "the external curve evaluation command must:\n"\ + "- read from stdin a whitespace separated list of:\n"\ + " - 1*int: the number of parameters M\n"\ + " - M*double: the parameters\n"\ + "- write to stdout a whitespace separated list of:\n"\ + " - 1*int: the number of data pairs N\n"\ + " - N*2*double: a sequence of data pairs: x0 y0 x1 y1 x2 y2 ...\n"; } else if ( expr=="c" ) { evaMode = COlc::_SCR; - throw "not yet implemented"; expr = sask( "Curve evaluation command ?" ); np = iask( "Number of parameters ?" ); } else if ( expr=="ci" ) { @@ -149,7 +168,28 @@ void COlc::curve_val_vec( vector<double>* ret, const vector<double>& vt, throw "BUG: tree_curve_val did not get vectorial result"; *ret = val.v; } - } else if ( evaMode==_SCR_INTP ) { + } else if ( evaMode==_SCR || evaMode==_SCR_INTP ) { + + string par_fifo = string("/tmp/par-") + getenv( "LOGNAME" ); + + mystd::system( "rm -f "+par_fifo ); + if (mkfifo( par_fifo.c_str(), 0666 )) + throw "SYSTEM ERROR cannot make fifo " + par_fifo + + " needed for external curve call"; + +/* + mystd::system( "gnuplot -title " + strg(iPlot) + " -noraise" + + " < " + par_fifo + " &" ); + + // we use open instead of fopen or ofstream, + // because we need non-blocking mode. + if (!(gp_fifo = open(par_fifo.c_str(), O_WRONLY))) + throw "SYSTEM ERROR cannot open fifo " + par_fifo + + ": will not be able to print"; + fcntl(gp_fifo,F_SETFL,O_NONBLOCK); + + gp_write( string("set terminal x11") ); +*/ FILE *F; if( !(F = fopen("/ram/pars", "w")) ) throw "BUG: cannot write system call pars"; diff --git a/pub/src/dualplot.cpp b/pub/src/dualplot.cpp index 94169823c7670c1825556a1fcf88bf04100bce4d..82dddf04aa5a1a6c6583a9be283c5fbde38753b9 100644 --- a/pub/src/dualplot.cpp +++ b/pub/src/dualplot.cpp @@ -32,7 +32,7 @@ CPlot::CPlot( uint _iPlot, bool _logx, bool _logy ) : mystd::system( "rm -f "+fn_fifo ); if (mkfifo( fn_fifo.c_str(), 0666 )) - throw "SEVERE SYSTEM ERROR cannot make fifo " + fn_fifo + + throw "SYSTEM ERROR cannot make fifo " + fn_fifo + ": will not be able to print"; mystd::system( "gnuplot -title " + strg(iPlot) + " -noraise" + @@ -41,7 +41,7 @@ CPlot::CPlot( uint _iPlot, bool _logx, bool _logy ) : // we use open instead of fopen or ofstream, // because we need non-blocking mode. if (!(gp_fifo = open(fn_fifo.c_str(), O_WRONLY))) - throw "SEVERE SYSTEM ERROR cannot open fifo " + fn_fifo + + throw "SYSTEM ERROR cannot open fifo " + fn_fifo + ": will not be able to print"; fcntl(gp_fifo,F_SETFL,O_NONBLOCK);