X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=cint%2Fginaccint.bin.cpp;h=23cb38bd3b502802ad0d1aa69e6dccae2970ff91;hp=52f3ef4881dbd4ed7110fc5c9e1080ea12f56287;hb=d44ad7a1e65cfb2a8ca56382609cc22b2e6e07c4;hpb=97af29c12bb3074cfb4e674d71000f0712c51ba2;ds=sidebyside diff --git a/cint/ginaccint.bin.cpp b/cint/ginaccint.bin.cpp index 52f3ef48..23cb38bd 100644 --- a/cint/ginaccint.bin.cpp +++ b/cint/ginaccint.bin.cpp @@ -24,6 +24,8 @@ string ToString(const T & t) } 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 @@ -54,14 +56,16 @@ char first_non_whitespace_char(char const * s) { int l = strlen(s); int pos = 0; - while ((pos=0) && is_whitespace_char(s[pos])) pos--; + while ((pos>=0) && is_whitespace_char(s[pos])) + pos--; return s[pos]; } @@ -84,7 +88,7 @@ G__value exec_tempfile(string const & command) fout << "{" << endl << command << endl << "}" << endl; fout.close(); G__store_undo_position(); - retval=G__exec_tempfile(tmpfilename); + retval = G__exec_tempfile(tmpfilename); G__security_recover(stdout); remove(tmpfilename); free(tmpfilename); @@ -122,19 +126,26 @@ void process_tempfile(string const & command) static unsigned out_count = 0; if (TYPES_EQUAL(retval,ref_ex)) { - if (ex::last_created_or_assigned_bp_can_be_converted_to_ex()) { - string varname = "Out"+ToString(++out_count); + 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 + + // cout << "warning: using ex from retval (experimental)" << 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()) { //string varfill; //for (int i=4-int(log10(out_count)); i>0; --i) // varfill += ' '; - exec_tempfile("ex "+varname+"(*ex::last_created_or_assigned_bp);\n" - +"LLLAST=LLAST;\n" - +"LLAST=LAST;\n" - +"LAST="+varname+";\n" - +"cout << \""+varname+" = \" << "+varname+" << endl << endl;"); + exec_tempfile("ex "+varname+"(*ex::last_created_or_assigned_bp);"); } else { cout << "warning: last_created_or_assigned_bp modified 0 or not evaluated or not dynallocated" << endl; } + exec_tempfile(string()+"LLLAST=LLAST;\n" + +"LLAST=LAST;\n" + +"LAST="+varname+";\n" + +"cout << \""+varname+" = \" << "+varname+" << endl << endl;"); } #endif // def OBSCURE_CINT_HACK } @@ -147,7 +158,8 @@ void greeting(void) << " __, _______ requested, at this moment, for commercial use. Send e-mail to" << endl << " (__) * | . The registration is free." << endl << " ._) i N a C | The GiNaC framework is Copyright by Johannes Gutenberg Univ.," << endl - << "<-------------' Germany and licensed under the terms and conditions of the GPL." << endl << endl; + << "<-------------' Germany and licensed under the terms and conditions of the GPL." << endl + << endl; } int main(void) @@ -155,7 +167,8 @@ int main(void) char *line; char prompt[G__ONELINE]; - greeting(); + if (isatty(0)) + greeting(); atexit(cleanup); signal(SIGTERM,sigterm_handler); @@ -170,14 +183,14 @@ int main(void) while (!quit) { strcpy(prompt,"GiNaC> "); int open_braces = 0; - bool end_of_command=false; + 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; + bool double_quote = false; + bool single_quote = false; while(line[pos]!='\0') { switch(line[pos]) { case '"':