From: Richard Kreckel Date: Wed, 6 Jun 2001 22:15:21 +0000 (+0000) Subject: - Removed cint subdir for good because the new separate package seems to X-Git-Tag: release_0-9-0~12 X-Git-Url: https://www.ginac.de/ginac.git/static/gitweb.css/ginac.git?a=commitdiff_plain;h=22d6261db53be3267c6a6304390ac54d6d553da3;p=ginac.git - Removed cint subdir for good because the new separate package seems to work properly now (after some longish argument with makecint). --- diff --git a/cint/Makefile.am b/cint/Makefile.am deleted file mode 100644 index 914e5ae0..00000000 --- a/cint/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -## Process this file with automake to produce Makefile.in - -bin_PROGRAMS = ginaccint.bin ginaccint -check_PROGRAMS = run_exams -run_exams_SOURCES = run_exams.cpp -ginaccint_SOURCES = ginaccint.cpp -ginaccint_bin_SOURCES = ginaccint.bin.cpp -man_MANS = ginaccint.1 - -ginaccint.bin: ginaccint.bin.cpp - (export CINTSYSDIR=$(CINTSYSDIR); $(MAKE) -f Makefile.makecint PATH=$(PATH):$(CINTSYSDIR)) - -TESTS = exam_paranoia.cpp exam_mansamples.cpp exam_misc.cpp - -EXTRA_DIST = $(man_MANS) $(TESTS) - -# Force targets clean and distclean to call Makecint's own Makefile -makecint_clean: - (if [ -f Makefile.makecint ]; then $(MAKE) -f Makefile.makecint clean; fi) - -clean: makecint_clean - rm -f G__* - -distclean: makecint_clean - rm -f Makefile.makecint diff --git a/cint/exam_mansamples.cpp b/cint/exam_mansamples.cpp deleted file mode 100755 index b38122b5..00000000 --- a/cint/exam_mansamples.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#! ./run_exams --silent -unsigned result = 0; -symbol x("x"), y("y"), z("z"); -{ - ex a = pow(x,2)-x-2; - ex b = pow(x+1,2); - ex s = a/b; - if (!(s.diff(x)+2/pow(1+x,3)*(-2-x+pow(x,2))-(-1+2*x)/pow(1+x,2)).is_zero()) { - ++result; - } - if (!(s.normal()-(-2+x)/(1+x)).is_zero()) { - ++result; - } -} -//GiNaC-cint.function -ex EulerNumber(unsigned n) -{ - symbol xi; - const ex generator = pow(cosh(xi),-1); - return generator.diff(xi,n).subs(xi==0); -} -if (EulerNumber(42) != numeric("-10364622733519612119397957304745185976310201")) { - ++result; -} -ex f = expand((x*y*z-1)*(x*y*z+3)); -ex g = expand((x*y*z-1)*(x*y*z-3)); -if (gcd(f, g) != x*y*z-1) { - ++result; -} -exit(result); diff --git a/cint/exam_misc.cpp b/cint/exam_misc.cpp deleted file mode 100755 index 611ecac7..00000000 --- a/cint/exam_misc.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#! ./run_exams --silent -unsigned result = 0; -/* - * A simple substitution test. If it fails you are really in trouble: - */ -{ - symbol x("x"), y("y"); - ex e, f; - e = pow(x+y,200).expand(); - f = e.subs(x == -y); - if (f != 0) - ++result; -} -/* - * Denny Fliegner's test using vector tests Cint's memory management. - */ -#include -{ - vector a; - ex bigsum = 0; - for (int i=0; i<42; ++i) { - ostringstream buf; - buf << "a" << i << ends; - a.push_back(symbol(buf.str())); - bigsum += a[i]; - } - ex sbtrct = -bigsum + a[0] + a[1]; - if (pow(bigsum,2).expand().subs(a[0]==sbtrct).expand() != pow(a[1],2)) - ++result; -} -exit(result); diff --git a/cint/exam_paranoia.cpp b/cint/exam_paranoia.cpp deleted file mode 100755 index 26dca05e..00000000 --- a/cint/exam_paranoia.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#! ./run_exams --silent -unsigned result = 0; -/* - * Old Cint versions messed up unary and binary operators: - */ -{ - symbol x; - ex a = x-x; - if (!a.is_zero()) { - ++result; - } -} -/* - * Some problems with objects of class relational when cast to bool: - */ -{ - symbol x; - ex a = x; - if (a != a) { - ++result; - } -} -exit(result); diff --git a/cint/ginaccint.1 b/cint/ginaccint.1 deleted file mode 100644 index e9ebd08a..00000000 --- a/cint/ginaccint.1 +++ /dev/null @@ -1,261 +0,0 @@ -.TH ginaccint 1 "January, 2000" "GiNaC" -.SH NAME -GiNaC-cint \- An interactive interface for GiNaC based on the Cint C/C++ interpreter -.SH SYNPOSIS -.B ginaccint -[file ...] -.SH DESCRIPTION -.B ginaccint -is an interactive frontend for the GiNaC symbolic computation -framework. It is a tool that lets you write interactive programs -(scripts) in C++ that directly make use of GiNaC's classes. Thus it -is a more complete replacement for traditional interactive computer -algebra systems than \fBginsh\fP(1) is. Programs may be composed as -scripts and later compiled with the native compiler and linked into -the system. -.SH USAGE -.SS INPUT FORMAT -After startup, GiNaC-cint reads and executes the files given as -command line arguments. If any of these files contains a -.BR .quit -command, GiNaC-cint exits at this point. -Otherwise it displays a prompt signifying that it is ready to -accept your input. All C++ statements are valid as input, extended by -GiNaC's numeric or symbolic expressions. E.g. -.BR fibonacci(numeric(24))/1104; -returns a GiNaC object of class -.BR "ex" , -which in this case represents the numeric 42. Symbols are declared by -statements as -.nf -GiNaC> symbol x("x"), y("y"), z; -.fi -which defines two named symbols and an anonymous one for later usage. -All GiNaC methods and functions are available as they would be coded -in C++. It is not necessary to explicitly invoke a print command as -the last expression is automatically printed: -.nf -GiNaC> pow(x+y,4).expand(); -Out2 = x^4+4*x^3*y+6*x^2*y^2+4*x*y^3+y^4 -.fi -Statements are generally closed either when a closing brace -.RB ( } ) -matches the first opening brace -.RB ( { ) -or a semicolon -.RB ( ; ) -is encountered while there are no open braces. This implies that -an input like -.nf -GiNaC> class A { - > } - > ; -.fi -is misinterpreted to be complete after the closing brace. -Instead you have to write -.nf -GiNaC> class A { - > }; -.fi - -.SS SPECIAL COMMANDS - -Lines starting with a dot mark special GiNaC-cint commands. Instead of -.BR "\fB.cmd\fB" -you can also write -.BR "\fB//GiNaC-cint.cmd\fB" -to be compatible with programs that will be compiled later. -This is mostly useful for the -.BR "\fB.function\fB" -declaration. - -Lines starting with #! (for #!/path/ginaccint) are ignored. - - -.IP "\fB.cint\fR" -Switch to cint's interactive mode. - -.IP "\fB.function\fR" - -Allow a function definition in interactive mode. GiNaC-cint must be -put into a special mode in order to define a function. After that any -function definition in valid C++ syntax may be typed in. It becomes -immediatly available for usage. - -.IP "\fB.help\fB" - -List a short summary of available commands. - -.IP "\fB.quit\fR" -Exit from GiNaC-cint. Same as -.BR ".bye" , -.BR ".exit" , -.BR ".q" , -.BR "bye;" , -.BR "exit; " or -.BR "quit;" . - -.IP "\fB.read filename\fB" - -Read a file from disk and execute it in GiNaC-cint -(recursive call is possible). - -.IP "\fB.redirect [filename]\fB" - -Redirect -.BR "\fBOut\fP\fInum\fP" -output to a file ( -.BR .redirect -alone redirects output to console). - -.IP "\fB.restart\fB" - -Restart GiNaC-cint (does not re-read command line files). - -.IP "\fB.save filename\fB" - -Save the commands you have entered so far in a file. - -.IP "\fB.silent\fB" - -suppress -.BR "\fBOut\fP\fInum\fP" -output (variables are still accessible). - -.IP "\fB.> [filename]\fB" - -same as -.BR "\fB.redirect [filename]\fB" . - -.IP "\fBOut\fP\fInum\fP" -Returns the expression whose output was marked -.BR "\fBOut\fP\fInum\fP" -as a handle. - -.IP "\fBLAST\fP, \fBLLAST, \fP\fBLLLAST\fP" -Return the last, second last and third last expression, -respectively. - -.SH EXAMPLES -.nf -GiNaC> symbol x("x"), y("y"), z("z"); -GiNaC> ex a = pow(x,2)-x-2; -GiNaC> ex b = pow(x+1,2); -GiNaC> ex s = a/b; -GiNaC> s.diff(x); -Out1 = -2*(1+x)^(-3)*(-2-x+x^2)+(-1+2*x)*(1+x)^(-2) -GiNaC> s.normal(); -Out2 = (-2+x)*(1+x)^(-1) -GiNaC> for (int i=2; i<20; i+=2) { - > cout << "B(" << i << ")==" << bernoulli(numeric(i)) << endl; - > } -B(2)==1/6 -B(4)==-1/30 -B(6)==1/42 -B(8)==-1/30 -B(10)==5/66 -B(12)==-691/2730 -B(14)==7/6 -B(16)==-3617/510 -B(18)==43867/798 -GiNaC> .function -next expression can be a function definition -GiNaC> ex EulerNumber(unsigned n) - > { - > symbol xi; - > const ex generator = pow(cosh(xi),-1); - > return generator.diff(xi,n).subs(xi==0); - > } -creating file /tmp/ginac26197caa -GiNaC> EulerNumber(42); -Out3 = -10364622733519612119397957304745185976310201 -GiNaC> ex f = expand((x*y*z-1)*(x*y*z+3)); -GiNaC> ex g = expand((x*y*z-1)*(x*y*z-3)); -GiNaC> cout << "The GCD of " << f << " and " << g << endl - > << " is " << gcd(f, g) << endl - > << " so " << f/g << endl - > << " is " << normal(f/g) << endl; -The GCD of -3+2*x*z*y+x^2*z^2*y^2 and 3-4*x*z*y+x^2*z^2*y^2 - is -1+x*z*y - so (-3+2*x*z*y+x^2*z^2*y^2)*(3-4*x*z*y+x^2*z^2*y^2)^(-1) - is (-3+x*z*y)^(-1)*(3+x*z*y) -GiNaC> .quit -.fi - -.SH BUGS -Cint accepts most of K&R and ANSI C/C++ language construct but not -perfect. In fact, Cint is not aimed to be a 100% ANSI/ISO compliant -C/C++ language processor. It rather is a portable script language -environment which is close enough to the standard C++. See the file -.BR limitati.txt -in your Cint distribution. Please take the time to track down any bug -you encounter as far as possible and contact Masaharu Goto - for Cint-related bugs and - for any bugs in the GiNaC engine. - -Only expressions (class -.BR ex ) -are typed out and available through -.BR "\fBOut\fP\fInum\fP" -and -.BR LAST -after declaring them. This accounts for some funny behaviour, like -.BR fibonacci(numeric(7)) -doesn't print, but -.BR fibonacci(numeric(7))*1 -does, since this is not a naked number but an expression holding -that number. A warning message is printed in this case only for -the first occurence. - -.SH AUTHOR -.TP -The GiNaC Group -.br -Christian Bauer -.br -Alexander Frink -.br -Richard Kreckel -.TP -Agilent Technologies Japan -.br -Masaharu Goto -.SH SEE ALSO -GiNaC Tutorial \- An open framework for symbolic computation within the -C++ programming language -.PP -CLN \- A Class Library for Numbers, Bruno Haible -.PP -\fBginsh\fP(1) -.SH COPYRIGHT -.SS GINAC COPYRIGHT -Copyright \(co 1999-2001 Johannes Gutenberg Universit\(:at Mainz, Germany - -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 2 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, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -.SS CINT COPYRIGHT -Copyright \(co of Cint and associated tools are owned by Agilent -Technologies Japan Company and the author (Masaharu Goto). Source -code, binary executable or library of Cint and associated tools can be -used, modified and distributed with no royalty for any purpose -provided that the copyright notice appear in all copies and that both -that copyright notice and this permission notice appear in supporting -documentation. Registration is recommended for commercial use -(=Selling a software that uses cint as a component). Send e-mail to -the author (MXJ02154@niftyserve.or.jp) with your name, e-mail address, -institute, purpose of using cint and computer platform. If a -modification is made on any of the source or documentation, it has to -be clearly documented and expressed. Agilent Technologies Japan and -the author make no representations about the suitability of this -software for any purpose. diff --git a/cint/ginaccint.bin.cpp b/cint/ginaccint.bin.cpp deleted file mode 100644 index 373fca7a..00000000 --- a/cint/ginaccint.bin.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/* ginaccint.bin.cpp: Binary depends on CINTSYSDIR, better don't call it - * directly. Use the launcher (compiled from ginaccint.cpp) instead. */ - -#include "G__ci.h" /* G__atpause is defined in G__ci.h */ - -#if (!defined(G__CINTVERSION)) || (G__CINTVERSION < 501464) -#error You need at least cint 5.14.64 to compile GiNaC-cint. Download it via http from root.cern.ch/root/Cint.html or via ftp from ftpthep.physik.uni-mainz.de/pub/cint -#endif // (!defined(G__CINTVERSION)) || (G__CINTVERSION < 501464) - -#include -#include -#include -#include -#include -#include "ginac/ginac.h" -#include "config.h" -#include - -using namespace GiNaC; - -extern "C" G__value G__exec_tempfile G__P((char *file)); -extern "C" void G__store_undo_position(void); - -#define PROMPT1 "GiNaC> " -#define PROMPT2 " > " - -#ifdef OBSCURE_CINT_HACK - -#include - -template -std::string ToString(const T & t) -{ - char buf[256]; - ostrstream(buf,sizeof(buf)) << t << ends; - return buf; -} - -basic * ex::last_created_or_assigned_bp = 0; -basic * ex::dummy_bp = 0; -long ex::last_created_or_assigned_exp = 0; - -#endif // def OBSCURE_CINT_HACK - -G__value exec_tempfile(std::string const & command); -char * process_permanentfile(std::string const & command); -void process_tempfile(std::string const & command); -void printversionmessage(std::ostream & os); -void greeting(void); -void helpmessage(void); -std::string preprocess(char const * const line, bool & comment, bool & single_quote, - bool & double_quote, unsigned & open_braces); -void cleanup(void); -void sigterm_handler(int n); -void initialize(void); -void initialize_cint(void); -void restart(void); -bool is_command(std::string const & command, std::string & preprocessed, - std::string const & comparevalue, bool substr=false); -bool readlines(istream * is, std::string & allcommands); -bool readfile(std::string const & filename, std::string & allcommands, bool shutup=false); -void savefile(std::string const & filename, std::string const & allcommands); - -typedef list cplist; -cplist filenames; -bool redirect_output = false; -bool silent = false; - -G__value exec_tempfile(std::string const & command) -{ - G__value retval; - char *tmpfilename = tempnam(NULL,"ginac"); - std::ofstream fout; - fout.open(tmpfilename); - fout << "{" << std::endl << command << std::endl << "}" << std::endl; - fout.close(); - G__store_undo_position(); - retval = G__exec_tempfile(tmpfilename); - G__security_recover(stdout); - remove(tmpfilename); - free(tmpfilename); - return retval; -} - -char * process_permanentfile(std::string const & command) -{ - char *tmpfilename = tempnam(NULL,"ginac"); - if (!silent) - std::cout << "creating file " << tmpfilename << std::endl; - std::ofstream fout; - fout.open(tmpfilename); - fout << command << std::endl; - fout.close(); - G__store_undo_position(); - G__loadfile(tmpfilename); - G__security_recover(stdout); - return tmpfilename; -} - -void process_tempfile(std::string const & command) -{ -#ifdef OBSCURE_CINT_HACK - static G__value ref_symbol = exec_tempfile("symbol ginac_cint_internal_symbol; ginac_cint_internal_symbol;"); - static G__value ref_constant = exec_tempfile("constant ginac_cint_internal_constant; ginac_cint_internal_constant;"); - static G__value ref_function = exec_tempfile("sin(ginac_cint_internal_symbol);"); - static G__value ref_power = exec_tempfile("power(ex(ginac_cint_internal_symbol),ex(ginac_cint_internal_symbol));"); - static G__value ref_numeric = exec_tempfile("numeric ginac_cint_internal_numeric; ginac_cint_internal_numeric;"); - static G__value ref_ex = exec_tempfile("ex ginac_cint_internal_ex; ginac_cint_internal_ex;"); - static bool basic_type_warning_already_displayed = false; -#endif // def OBSCURE_CINT_HACK - - G__value retval = exec_tempfile(command); - -#ifdef OBSCURE_CINT_HACK - - #define TYPES_EQUAL(A,B) (((A).type==(B).type) && ((A).tagnum==(B).tagnum)) - - static unsigned out_count = 0; - if (TYPES_EQUAL(retval,ref_ex)) { - std::string varname = "Out"+ToString(++out_count); - if (retval.obj.i!=ex::last_created_or_assigned_exp) { - // an ex was returned, but this is not the ex which was created last - // => this is not a temporary ex, but one that resides safely in memory - - // std::cout << "warning: using ex from retval (experimental)" << std::endl; - ex::dummy_bp = ((ex *)(void *)(retval.obj.i))->bp; - exec_tempfile("ex "+varname+"(*ex::dummy_bp);"); - } else if (ex::last_created_or_assigned_bp_can_be_converted_to_ex()) { - exec_tempfile("ex "+varname+"(*ex::last_created_or_assigned_bp);"); - } else { - std::cout << "warning: last_created_or_assigned_bp modified 0 or not evaluated or not dynallocated" << std::endl; - } - exec_tempfile(std::string()+"LLLAST=LLAST;\n" - +"LLAST=LAST;\n" - +"LAST="+varname+";\n" - +"if (ginac_cint_internal_redirect_output&&" - +" ginac_cint_internal_fout.good()) {" - +" ginac_cint_internal_fout << \""+varname+" = \" << "+varname+" << endl << endl;" - +"} else {" - +" std::cout << \""+varname+" = \" << "+varname+" << endl << endl;" - +"}"); - } else if (TYPES_EQUAL(retval,ref_symbol)|| - TYPES_EQUAL(retval,ref_constant)|| - TYPES_EQUAL(retval,ref_function)|| - TYPES_EQUAL(retval,ref_power)|| - TYPES_EQUAL(retval,ref_numeric)) { - if (!basic_type_warning_already_displayed) { - std::cout << std::endl - <<"WARNING: The return value of the last expression you entered was a symbol," << std::endl - << "constant, function, power or numeric, which cannot be safely displayed." << std::endl - << "To force the output, cast it explicitly to type 'ex' or use 'cout'," << std::endl - << "for example (assume 'x' is a symbol):" << std::endl - << PROMPT1 "ex(x);" << std::endl - << "OutX = x" << std::endl << std::endl - << PROMPT1 "cout << x << endl;" << std::endl - << "x" << std::endl << std::endl - << "This warning will not be shown again." << std::endl; - basic_type_warning_already_displayed = true; - } - } -#endif // def OBSCURE_CINT_HACK - return; -} - -void printversionmessage(std::ostream & os) -{ - os << "GiNaC-cint (" << PACKAGE << " V" << VERSION - << ", Cint V" << G__CINTVERSION/1000000 - << '.' << G__CINTVERSION/1000%1000 - << '.' << G__CINTVERSION%1000 << ')' << endl; - return; -} - -void greeting(void) -{ - std::cout << "Welcome to "; - printversionmessage(std::cout); - std::cout << " __, _______ GiNaC: (C) 1999-2001 Johannes Gutenberg University Mainz,\n" - << " (__) * | Germany. Cint C/C++ interpreter: (C) 1995-2001 Masaharu\n" - << " ._) i N a C | Goto and Agilent Technologies, Japan. This is free software\n" - << "<-------------' with ABSOLUTELY NO WARRANTY. For details, type `.warranty'\n" - << "Type `.help' for help.\n\n"; - return; -} - -void helpmessage(void) -{ - std::cout << "GiNaC-cint recognizes some special commands which start with a dot:\n\n" - << " .cint switch to cint interactive mode (see cint\n" - << " documentation for further details)\n" - << " .function define the body of a function (necessary due to a\n" - << " cint limitation)\n" - << " .help the text you are currently reading\n" - << " .q, .quit, .exit, .bye quit GiNaC-cint\n" - << " .read filename read a file from disk and execute it in GiNaC-cint\n" - << " (recursive call is possible)\n" - << " .redirect [filename] redirect 'OutXY = ...' output to a file\n" - << " (.redirect alone redirects output back to console)\n" - << " .restart restart GiNaC-cint (does not re-read command line\n" - << " files)\n" - << " .save filename save the commands you have entered so far in a file\n" - << " .silent suppress 'OutXY = ...' output (variables are still\n" - << " accessible)\n" - << " .warranty information on redistribution and warranty\n" - << " .> [filename] same as .redirect [filename]\n\n" - << "Instead of '.cmd' you can also write '//GiNaC-cint.cmd' to be compatible with\n" - << "programs that will be compiled later.\n" - << "Additionally you can exit GiNaC-cint with quit; exit; or bye;\n\n"; - return; -} - -void warrantymessage(void) -{ - std::cout << "GiNaC is free software; you can redistribute it and/or modify it under the\n" - << "the terms of the GNU General Public License as published by the Free Software\n" - << "Foundation; either version 2 of the License, or (at your option) any later\n" - << "version.\n" - << "This program is distributed in the hope that it will be useful, but WITHOUT\n" - << "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n" - << "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n" - << "details.\n" - << "You should have received a copy of the GNU General Public License along with\n" - << "this program. If not, write to the Free Software Foundation, 675 Mass Ave,\n" - << "Cambridge, MA 02139, USA.\n\n"; - std::cout << "Cint and associated tools are copyright by Agilent Technologies Japan Company\n" - << "and Masaharu Goto .\n" - << "Source code, binary executable or library of Cint and associated tools can be\n" - << "used, modified and distributed with no royalty for any purpose provided that\n" - << "the copyright notice appear in all copies and that both that copyright notice\n" - << "and this permission notice appear in supporting documentation.\n" - << "Agilent Technologies Japan and the author make no representations about the\n" - << "suitability of this software for any purpose. It is provided \"AS IS\"\n" - << "without express or implied warranty.\n"; - return; -} - -/** "preprocess" the line entered to be able to decide if the command shall be - * executed directly or more input is needed or this is a special command. - * All whitespace will be removed. All comments will be removed. Open and - * close braces ( { and } ) outside strings will be counted. */ -std::string preprocess(char const * const line, bool & comment, bool & single_quote, - bool & double_quote, unsigned & open_braces) -{ - std::string preprocessed; - int pos = 0; - bool end = false; - bool escape = false; - bool slash = false; - bool asterisk = false; - while ((line[pos]!='\0')&&!end) { - if (escape) { - // last character was a \, ignore this one - escape = false; - } else if (slash) { - // last character was a /, test if * or / - slash = false; - if (line[pos]=='/') { - end = true; - } else if (line[pos]=='*') { - comment = true; - } else { - preprocessed += '/'; - preprocessed += line[pos]; - } - } else if (asterisk) { - // last character was a *, test if / - asterisk = false; - if (line[pos]=='/') { - comment = false; - } else if (line[pos]=='*') { - preprocessed += '*'; - asterisk = true; - } - } else { - switch (line[pos]) { - case ' ': - case '\t': - case '\n': - case '\r': - // whitespace: ignore - break; - case '\\': - // escape character, ignore next - escape = true; - break; - case '"': - if ((!single_quote)&&(!comment)) { - double_quote = !double_quote; - } - break; - case '\'': - if ((!double_quote)&&(!comment)) { - single_quote = !single_quote; - } - break; - case '{': - if ((!single_quote)&&(!double_quote)&&(!comment)) { - ++open_braces; - } - break; - case '}': - if ((!single_quote)&&(!double_quote)&&(!comment)&&(open_braces>0)) { - --open_braces; - } - break; - case '/': - slash = true; - break; - case '*': - asterisk = true; - break; - default: - preprocessed += line[pos]; - } - } - ++pos; - } - - return preprocessed; -} - -void cleanup(void) -{ - for (cplist::iterator it=filenames.begin(); it!=filenames.end(); ++it) { - if (!silent) - std::cout << "removing file " << *it << std::endl; - remove(*it); - free(*it); - } -} - -void sigterm_handler(int n) -{ - G__scratch_all(); - exit(1); -} - -void initialize(void) -{ - atexit(cleanup); - signal(SIGTERM, sigterm_handler); - initialize_cint(); -} - -void initialize_cint(void) -{ - G__init_cint("cint"); /* initialize cint */ - - exec_tempfile("using namespace GiNaC;"); - exec_tempfile("ex LAST,LLAST,LLLAST;\n"); - exec_tempfile("bool ginac_cint_internal_redirect_output = false;\n"); - exec_tempfile("ofstream ginac_cint_internal_fout;\n"); -} - -void restart(void) -{ - std::cout << "Restarting GiNaC-cint." << std::endl; - G__scratch_all(); - initialize_cint(); -} - -void redirect(std::string const & filename, - bool shutup=false) -{ - if (filename=="") { - if (!shutup) - std::cout << "Redirecting output back to console..." << std::endl; - exec_tempfile(std::string() - +"ginac_cint_internal_redirect_output=false;\n" - +"ginac_cint_internal_fout.close();"); - } else { - if (!shutup) - std::cout << "Redirecting output to " << filename << "..." << std::endl; - exec_tempfile(std::string() - +"ginac_cint_internal_redirect_output=true;\n" - +"ginac_cint_internal_fout.open(\""+filename+"\");\n"); - } -} - -/** Sort out command line options and evaluate them. Returns true if it - * succeeds and false otherwise. */ -bool evaloption(const std::string & option) -{ - if (option=="--version") { - printversionmessage(std::cout); - exit(0); - } - if (option=="--help") { - printversionmessage(std::cout); - std::cout << "usage: ginaccint [option] [file ...]\n"; - std::cout << " --help print this help message and exit\n" - << " --silent invoke ginaccint in silent mode\n" - << " --version print GiNaC version and Cint version and exit\n"; - exit(0); - } - if (option=="--silent") { - redirect("/dev/null",true); - silent = true; - return true; - } - return false; -} - -bool is_command(std::string const & command, - std::string & preprocessed, - std::string const & comparevalue, - bool substr) -{ - bool single_quote = false; - bool double_quote = false; - bool comment = false; - unsigned open_braces = 0; - if ((preprocessed=="."+comparevalue)|| - substr&&(preprocessed.substr(0,comparevalue.length()+1)== - "."+comparevalue)) { - return true; - } - if ((command=="//GiNaC-cint."+comparevalue+"\n") || - substr && - (command.substr(0,comparevalue.length()+13)=="//GiNaC-cint."+comparevalue)) { - preprocessed = preprocess(command.substr(12).c_str(),comment, - single_quote,double_quote,open_braces); - return true; - } - return false; -} - -bool readlines(istream * is, - std::string & allcommands) -{ - char const * line; - char prompt[G__ONELINE]; - std::string linebuffer; - - bool quit = false; - bool eof = false; - bool next_command_is_function = false; - bool single_quote = false; - bool double_quote = false; - bool comment = false; - unsigned open_braces = 0; - - while ((!quit)&&(!eof)) { - strcpy(prompt,PROMPT1); - bool end_of_command = false; - std::string command; - std::string preprocessed; - while (!end_of_command) { - if (is==NULL) { - line = G__input(prompt); - } else { - getline(*is,linebuffer); - line = linebuffer.c_str(); - } - command += line; - command += "\n"; - preprocessed += preprocess(line,comment,single_quote,double_quote,open_braces); - if ((open_braces==0)&&(!single_quote)&&(!double_quote)&&(!comment)) { - unsigned l = preprocessed.length(); - if ((l==0)|| - (preprocessed[0]=='#')|| - (preprocessed[0]=='.')|| - (preprocessed[l-1]==';')|| - (preprocessed[l-1]=='}')) { - end_of_command = true; - } - } - strcpy(prompt,PROMPT2); - } - if ((preprocessed=="quit;")|| - (preprocessed=="exit;")|| - (preprocessed=="bye;")|| - (is_command(command,preprocessed,"quit"))|| - (is_command(command,preprocessed,"exit"))|| - (is_command(command,preprocessed,"bye"))|| - (is_command(command,preprocessed,"q"))) { - quit = true; - } else if (is_command(command,preprocessed,"function")) { - if (!silent) - std::cout << "next expression can be a function definition" << std::endl; - next_command_is_function = true; - } else if (is_command(command,preprocessed,"cint")) { - std::cout << std::endl << "switching to cint interactive mode" << std::endl; - std::cout << "'h' for help, 'q' to quit, '{ statements }' or 'p [expression]' to evaluate" << std::endl; - G__pause(); - std::cout << "back from cint" << std::endl; - } else if (is_command(command,preprocessed,"help")) { - helpmessage(); - } else if (is_command(command,preprocessed,"read",true)) { - quit = readfile(preprocessed.substr(5),allcommands); - } else if (is_command(command,preprocessed,"save",true)) { - command = "/* "+command+" */"; // we do not want the .save command itself in saved files - savefile(preprocessed.substr(5),allcommands); - } else if (is_command(command,preprocessed,"restart")) { - restart(); - } else if (is_command(command,preprocessed,"redirect",true)) { - redirect(preprocessed.substr(9)); - } else if (is_command(command,preprocessed,">",true)) { - redirect(preprocessed.substr(2)); - } else if (is_command(command,preprocessed,"silent")) { - if (!silent) { - redirect("/dev/null"); - silent = true; - } else { - redirect(""); - silent = false; - } - } else if (is_command(command,preprocessed,"warranty")) { - warrantymessage(); - /* insert tests for more special commands here */ - } else if (command.substr(0,2)=="#!") { - // ignore lines which indicate that this file is executed as a script - } else { - // std::cout << "now processing: " << command << std::endl; - if (next_command_is_function) { - next_command_is_function = false; - filenames.push_back(process_permanentfile(command)); - } else { - process_tempfile(command); - } - } - if (is!=NULL) { - // test for end of file if reading from a stream - eof = is->eof(); - } else { - // save commands only when reading from keyboard - allcommands += command; - } - - } - return quit; -} - -bool readfile(std::string const & filename, - std::string & allcommands, - bool shutup = false) -{ - if (!shutup) - std::cout << "Reading commands from file " << filename << "." << std::endl; - bool quit = false; - std::ifstream fin; - fin.open(filename.c_str()); - if (fin.good()) - quit = readlines(&fin,allcommands); - else - std::cout << "Cannot open " << filename << " for reading." << std::endl; - fin.close(); - return quit; -} - -void savefile(std::string const & filename, std::string const & allcommands) -{ - std::cout << "Saving commands to file " << filename << "." << std::endl; - std::ofstream fout; - fout.open(filename.c_str()); - if (fout.good()) { - fout << allcommands; - if (!fout.good()) { - std::cout << "Cannot save commands to " << filename << "." << std::endl; - } - } else { - std::cout << "Cannot open " << filename << " for writing." << std::endl; - } - fout.close(); -} - -int main(int argc, char * *argv) -{ - std::string allcommands; - initialize(); - - bool quit = false; - // sort out and evaluate recognized options from the argument list - for (int i=1; i1; - - // greet the user if it makes sense - if (isatty(0) && !silent) - greeting(); - - // evaluate files given as command line arguments - if (argsexist) { - allcommands = "/* Files given as command line arguments:\n"; - --argc; - while (argc && !quit) { - allcommands += std::string(argv[argc])+'\n'; - quit = readfile(argv[argc], allcommands, silent); - --argc; - } - allcommands += "*/\n"; - } - - // evaluate input from command line or script - if (!quit) - readlines(NULL, allcommands); - - return 0; -} diff --git a/cint/ginaccint.cpp b/cint/ginaccint.cpp deleted file mode 100644 index cd875e90..00000000 --- a/cint/ginaccint.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* ginaccint.cpp, a launcher that sets variables to start ginaccint.bin. - * This is necessary because Cint is not libtoolized and so may need to have - * LD_LIBRARY_PATH and CINTSYSDIR set. This cannot be done by a shell-script - * because the #!-mechanism works only once and we want to enable the user to - * write scripts using that mechanism. */ - -#include -#include -#include -#include -#include "launch.h" - -extern char **environ; - -int main(int argc, char * *argv) -{ - // manually "expand" autoconf-style variables - if (exec_prefix=="${prefix}") - exec_prefix = prefix; - if (bindir=="${exec_prefix}/bin") - bindir = exec_prefix + "/bin"; - if (libdir=="${exec_prefix}/lib") - libdir = exec_prefix + "/lib"; - // now we can guess what to start - std::string binprog = bindir + "/ginaccint.bin"; - - // extend LD_LIBRARY_PATH by libdir, so ginaccint.bin really finds libginac - const char * LD_LIBRARY_PATH = getenv("LD_LIBRARY_PATH"); - if (LD_LIBRARY_PATH == NULL) - setenv("LD_LIBRARY_PATH", libdir.c_str(), 1); - else - setenv("LD_LIBRARY_PATH", (std::string(LD_LIBRARY_PATH)+':'+libdir).c_str(), 1); - - // hard-wire CINTSYSDIR, inherited from configure, but only if it has - // been set therein (to allow for system-wide installations of cint) - // and without overriding it if the user has specified it. - if (CINTSYSDIR != "@CINTSYSDIR@") - setenv("CINTSYSDIR", CINTSYSDIR.c_str(), 0); - - // execute the real thing - int error = execve(binprog.c_str(), argv, environ); - - // only gets here on error - std::cerr << argv[0] << ": cannot exec " << binprog << std::endl; - return error; -} diff --git a/cint/launch.h.in b/cint/launch.h.in deleted file mode 100644 index 88c33ff4..00000000 --- a/cint/launch.h.in +++ /dev/null @@ -1,12 +0,0 @@ -/* config.h.in --> config.h (configure) - * ginaccint.bin shouldn't be invoked directly because CINTSYSDIR or other - * variables might not be in place when some user invokes it. Instead, we need - * a little launcher binary. This file should be included by those launchers - * so they know about some variables. */ - -// set some variables inherited from configure -string prefix = "@prefix@"; -string exec_prefix = "@exec_prefix@"; -string bindir = "@bindir@"; -string libdir = "@libdir@"; -string CINTSYSDIR = "@CINTSYSDIR@"; diff --git a/cint/run_exams.cpp b/cint/run_exams.cpp deleted file mode 100644 index add73bc9..00000000 --- a/cint/run_exams.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* run_exams.cpp, a launcher that sets variables to start ginaccint.bin. - * This is necessary because Cint is not libtoolized and so may need to have - * LD_LIBRARY_PATH and CINTSYSDIR set. (This cannot be done by a shell-script - * because the #!-mechanism works only once and we want to enable the user to - * write scripts using that mechanism.) */ - -#include -#include -#include -#include -#include "launch.h" - -extern char **environ; - -int main(int argc, char * *argv) -{ - // what to start - std::string binprog = "./ginaccint.bin"; - - // extend LD_LIBRARY_PATH by ../ginac/.libs, so ginaccint.bin really finds libginac - const char * LD_LIBRARY_PATH = getenv("LD_LIBRARY_PATH"); - if (LD_LIBRARY_PATH == NULL) - setenv("LD_LIBRARY_PATH", "../ginac/.libs", 1); - else - setenv("LD_LIBRARY_PATH", (std::string(LD_LIBRARY_PATH)+':'+"../ginac/.libs").c_str(), 1); - - // hard-wire CINTSYSDIR, inherited from configure, but only if it has - // been set therein (to allow for system-wide installations of cint). - if (CINTSYSDIR != "@CINTSYSDIR@") - setenv("CINTSYSDIR", CINTSYSDIR.c_str(), 1); - - // execute the real thing - int error = execve(binprog.c_str(), argv, environ); - - // only gets here on error - std::cerr << argv[0] << ": cannot exec " << binprog << std::endl; - return error; -}