// -*- mode:C++ ; compile-command: "g++ -I.. -I../include -g -c casce.cc" -*-
#include "first.h"
/*
* Copyright (C) 2000 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"
#ifdef HAVE_LIBREADLINE
#include
#include
#endif // HAVE_LIBREADLINE
using namespace std;
#include
#include
#include
#include
#include
#include
//#include // For reading arguments from file
#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"
using namespace giac;
#ifdef HAVE_LIBREADLINE
static char *line_read = (char *)NULL;
/* Read a string, and return a pointer to it. Returns NULL on EOF. */
char *
rl_gets (int count)
{
/* If the buffer has already been allocated, return the memory
to the free pool. */
if (line_read)
{
free (line_read);
line_read = (char *)NULL;
}
/* Get a line from the user. */
string prompt(giac::print_INT_(count)+">> ");
line_read = readline ((char *)prompt.c_str());
/* If the line has any text in it, save it on the history. */
if (line_read && *line_read)
add_history (line_read);
return (line_read);
}
#endif // HAVE_LIBREADLINE
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 xdvi_view_2d_plot(){
double horiz_unit=giac::horiz_latex/(giac::gnuplot_xmax-giac::gnuplot_xmin);
double vert_unit=giac::vert_latex/(giac::gnuplot_ymax-giac::gnuplot_ymin);
double unit=horiz_unit;
if (horiz_unit>vert_unit)
unit=vert_unit;
int i=giac::history_out(0).size();
giac::graph2tex("casgraph.tex",giac::vecteur(giac::history_out(0).begin()+giac::erase_pos(i),giac::history_out(0).begin()+i),giac::gnuplot_xmin,giac::gnuplot_xmax,giac::gnuplot_ymin,giac::gnuplot_ymax,unit);
system_no_deprecation("latex casgraph.tex >& casgraph.___ && xdvi casgraph &") ;
}
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;
// Calling sequence should be
// ARGV 0=cas.exe 1=start_directory 2=language_number 3=session_name
// 4=xcas_history_level number,
// If ARGC==5, remove all levels after xcas_history_level, no output
// If ARGC==6, ARGV[5]=string to parse and eval, will replace level
// Use -1 as history_level for addition
// Output in Out.txt of all levels starting from replaced level
// If ARGC>6, all history levels after ARGV[4] will be destroyed
// and replaced by evaluation of ARGV[5..ARGC-1]
// Output in Out.txt of all levels starting from replaced level
// Examples
// remove the file xcas.ar
// cas.exe / 1 xcas.ar -1 "a:=1+1;" (create level 0)
// cas.exe / 1 xcas.ar -1 "a+1;" (create level 1)
// cas.exe / 1 xcas.ar 0 "a:=1+2;" (replace level 0 by 1+2,
// recompute level 1, output level 0 and 1)
// cas.exe / 1 xcas.ar 1 (remove all levels after level 1, no output)
// cas.exe / 1 xcas.ar 1 "b:=a+2" "c:=b/2" (2 new levels created,
// output both levels)
// If ARGC==2, ARGV[1] is the start directory for casce.exe,
// If ARGC==1 or 2, the file Cas.txt is read as before, output
// written to Out.txt, but unlike before the session is archived and
// unarchived with the name xcas.ar.
if (ARGC<2 || ARGC==3){
signal(SIGINT,giac::ctrl_c_signal_handler);
giac::child_id=1;
string session_name="xcas.ar";
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]),0);
if (ARGC>=4)
session_name=ARGV[3];
if (ARGC>=5)
session_level=atoi(ARGV[4]);
if (ARGC==5 || ARGC>6){
// Unarchive session and remove all levels after session_level
unarchive_session(session_name,-1,0,contextptr);
int s=min(history_in(contextptr).size(),history_out(contextptr).size());
if (session_level>=0 && session_level6){
// Session is unarchived, history levels have been removed
// Evaluate starting from ARGV[5]
ofstream out("Out.txt");
for (int i=5;i