// -*- mode:C++ ; compile-command: "g++ -I.. -I../include -g xcasce.cc -o xcasce -lgiac -lgmp" -*- #include "first.h" /* * Copyright (C) 2005 B. Parisse, Institut Fourier, 38402 St Martin d'Heres * * This program 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 3 of the License, or * (at your option) any later version. * * This program 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 this program. If not, see */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "global.h" using namespace std; #include #include #include #include #include #include #include #include #include //#include // For reading arguments from file #include #include #include #include "gen.h" #include "index.h" #include "sym2poly.h" #include "derive.h" #include "intg.h" #include "tex.h" #include "lin.h" #include "solve.h" #include "modpoly.h" #include "usual.h" #include "sym2poly.h" #include "moyal.h" #include "ifactor.h" #include "gauss.h" #include "isom.h" #include "plot.h" #include "prog.h" #include "rpn.h" #include "pari.h" #include "help.h" #include "plot.h" #include "input_lexer.h" #include "global.h" using namespace giac; namespace giac { void child_signal_handler(int signum); // void child_plot_done(int signum); extern volatile bool signal_child; } void flush_stdout(){ usleep(2000); fflush (stdout); } void flush_stderr(){ usleep(2000); fflush (stderr); } bool has_graph_output(const giac::gen & g){ return (g.type==giac::_SYMB) && (g._SYMBptr->sommet==giac::at_graph2tex || equalposcomp(giac::implicittex_plot_sommets,g._SYMBptr->sommet)); } void check_browser_help(const giac::gen & g){ if (g.is_symb_of_sommet(giac::at_findhelp)){ giac::gen f=g._SYMBptr->feuille; string s; if (f.type==giac::_SYMB) f=f._SYMBptr->sommet; if (f.type==giac::_FUNC) s=f._FUNCptr->ptr->s; giac::html_vtt=giac::html_help(giac::html_mtt,s); if (!giac::html_vtt.empty()) giac::system_browser_command(giac::html_vtt.front()); } } int main(int ARGC, char *ARGV[]){ //cerr << giac::remove_filename(ARGV[0]) << endl; #ifdef HAVE_LIBGSL gsl_set_error_handler_off(); #endif giac::secure_run=false; giac::gnuplot_ymin=-2.4; giac::gnuplot_ymax=2.1; signal(SIGINT,giac::ctrl_c_signal_handler); giac::child_id=1; ofstream logfile("log.txt"); context contexte; contexte.globalptr->logptr=&logfile; context * contextptr =0; logfile << "Called by " << ARGC << " "; for (int i=0;i=3){ chdir(ARGV[1]); giac::language=atoi(ARGV[2]); logfile << "Directory " << ARGV[1] << " language " << ARGV[2] << endl; } else chdir(giac::remove_filename(ARGV[0]).c_str()); logfile.flush(); FILE * stream = fopen("gnuplot.txt","w"); fputc(' ',stream); fflush(stream); fclose(stream); sigset_t mask, oldmask; sigemptyset (&mask); sigaddset (&mask, SIGUSR1); signal(SIGUSR1,giac::child_signal_handler); // signal(SIGUSR2,giac::child_plot_done); gen args; // Enter endless loop, use SIGUSR1 for processing commands for (;;){ /* Wait for a signal to arrive. */ sigprocmask (SIG_BLOCK, &mask, &oldmask); signal_child=false; // #ifndef WIN32 while (!signal_child) sigsuspend (&oldmask); sigprocmask (SIG_UNBLOCK, &mask, NULL); // #endif // read and evaluate input ifstream in("Cas.txt"); ofstream out("Out.txt"); pid_t caller; in >> caller; logfile << "Caller process id " << caller << endl; logfile.flush(); giac::vecteur args,l; giac::readargs_from_stream(in,args,l); logfile << "Read " << args << endl; logfile.flush(); clock_t start, end; int s=args.size(); for (int i=0;i " << tmp << char(10) << char(13) ; logfile.flush(); history_in(0).push_back(args[i]); history_out(0).push_back(tmp); // out << "// Time " << double(end-start)/CLOCKS_PER_SEC << char(10) << char(13) << char(10) << char(13) ; } out.close(); in.close(); // send signal to caller kill(caller,SIGUSR1); } return 0; }