X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=cint%2Fginaccint.cpp;h=515835c14c02f57002a0747963dbc564abd038f5;hp=27c643f715a5558e12ffe524fac1d1ae3579425e;hb=1e8bbe7edb203ebfbfb169b7d3f84354fce2a2d0;hpb=6a9911249d7121c57ba279c77a2e5c4b24212354 diff --git a/cint/ginaccint.cpp b/cint/ginaccint.cpp index 27c643f7..515835c1 100644 --- a/cint/ginaccint.cpp +++ b/cint/ginaccint.cpp @@ -1,242 +1,43 @@ -#include "G__ci.h" /* G__atpause is defined in G__ci.h */ -#include -#include -#include -#include -#include -#include -#include - -extern "C" G__value G__exec_tempfile G__P((char *file)); -extern "C" void G__store_undo_position(void); - -#ifdef OBSCURE_CINT_HACK - -#include - -template -string ToString(T const & t) -{ - char buf[256]; - ostrstream(buf,sizeof(buf)) << t << ends; - return buf; -} - -basic * ex::last_created_or_assigned_bp=0; -bool ex::last_created_or_assigned_bp_modified=false; - -#endif // def OBSCURE_CINT_HACK - -typedef list cplist; - -cplist filenames; - -void cleanup(void) -{ - for (cplist::iterator it=filenames.begin(); it!=filenames.end(); ++it) { - cout << "removing file " << *it << endl; - remove(*it); - free(*it); - } -} - -void sigterm_handler(int n) -{ - exit(1); -} - -bool is_whitespace_char(char c) -{ - return ((c==' ')||(c=='\t')||(c=='\n')||(c=='\r')); -} - -char first_non_whitespace_char(char const * s) -{ - int l=strlen(s); - int pos=0; - while ((pos=0)&&is_whitespace_char(s[pos])) pos--; - return s[pos]; -} - -string strip_whitespace(string const & s) -{ - string s2; - int l=s.length(); - for (int pos=0; pos\n"); - exec_tempfile("ex LAST,LLAST,LLLAST;\n"); - - bool quit=false; - bool next_command_is_function=false; - while (!quit) { - strcpy(prompt,"GiNaCcint> "); - int open_braces=0; - bool end_of_command=false; - string command; - while (!end_of_command) { - line=G__input(prompt); - - int pos = 0; - bool double_quote=false; - bool single_quote=false; - while(line[pos]!='\0') { - switch(line[pos]) { - case '"': - if (!single_quote) double_quote = !double_quote; - break; - case '\'': - if (!double_quote) single_quote = !single_quote; - break; - case '{': - if ((!single_quote)&&(!double_quote)) open_braces++; - break; - case '}': - if ((!single_quote)&&(!double_quote)) open_braces--; - break; - } - pos++; - } - command += line; - command += '\n'; - if (open_braces==0) { - if ((first_non_whitespace_char(command.c_str())=='#')|| - (first_non_whitespace_char(command.c_str())=='.')|| - (last_non_whitespace_char(command.c_str())==';')|| - (last_non_whitespace_char(command.c_str())=='}')) { - end_of_command=true; - } - } - strcpy(prompt," (more) > "); - } - string stripped_command=strip_whitespace(command); - if ((stripped_command=="quit;")|| - (stripped_command=="exit;")|| - (stripped_command=="bye;")|| - (stripped_command==".q")|| - (stripped_command==".quit")|| - (stripped_command==".exit")|| - (stripped_command==".bye")) { - quit=true; - } else if (stripped_command==".function") { - cout << "next expression can be a function definition" << endl; - next_command_is_function=true; - } else if (stripped_command==".cint") { - cout << endl << "switching to cint interactive mode" << endl; - cout << "'h' for help, 'q' to quit, '{ statements }' or 'p [expression]' to evaluate" << endl; - G__pause(); - cout << "back from cint" << endl; - } else if (command[0]=='.') { - cout << "special command (TBD): " << command << endl; - } else { - // cout << "now processing: " << command << endl; - if (next_command_is_function) { - next_command_is_function=false; - filenames.push_back(process_permanentfile(command)); - } else { - process_tempfile(command); - } - } - } - - return 0; +#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, if it is not set + 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; } - - - - - - -