=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/ox_texmacs.c,v retrieving revision 1.12 retrieving revision 1.19 diff -u -p -r1.12 -r1.19 --- OpenXM/src/kxx/ox_texmacs.c 2004/03/03 12:27:31 1.12 +++ OpenXM/src/kxx/ox_texmacs.c 2004/09/05 00:51:18 1.19 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.11 2004/03/03 09:44:39 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.18 2004/03/25 01:37:14 takayama Exp $ */ #include #include @@ -25,11 +25,13 @@ #define DATA_BEGIN_V "" /* "\002verbatim:" */ #define DATA_BEGIN_L "" /* "\002latex:" */ #define DATA_BEGIN_P "" /* "\002channel:prompt " */ +#define DATA_BEGIN_PS "" /* "\002ps: " */ #define DATA_END "" /* "\005" */ #else #define DATA_BEGIN_V "\002verbatim:" #define DATA_BEGIN_L "\002latex:" #define DATA_BEGIN_P "\002prompt:" +#define DATA_BEGIN_PS "\002ps:" #define DATA_END "\005" #endif @@ -45,6 +47,7 @@ extern int Quiet; extern JMP_BUF EnvOfStackMachine; +extern int Calling_ctrlC_hook; int Format=1; /* 1 : latex mode */ int OutputLimit_for_TeXmacs = (1024*10); @@ -54,6 +57,9 @@ int TM_sm1Started = 0; int TM_k0Started = 0; int TM_do_not_print = 0; +int Xm_noX = 0; +int NoCopyright = 0; + void ctrlC(); struct object KpoString(char *s); char *KSpopString(void); @@ -62,8 +68,10 @@ static char *readString(FILE *fp,char *prolog, char *e static void printv(char *s); static void printl(char *s); static void printp(char *s); +static void printps(char *s); static void printCopyright(char *s); static int startEngine(int type,char *msg); +static int isPS(char *s); /* tail -f /tmp/debug-texmacs.txt Debug output to understand the timing problem of pipe interface. @@ -102,6 +110,13 @@ main(int argc,char *argv[]) { TM_Engine = ASIR; }else if (strcmp(argv[i],"--k0") == 0) { TM_Engine = K0; + }else if (strcmp(argv[i],"--outputLimit") == 0) { + i++; + sscanf(argv[i],"%d",&OutputLimit_for_TeXmacs); + }else if (strcmp(argv[i],"--noLogWindow") == 0) { + Xm_noX = 1; + }else if (strcmp(argv[i],"--noCopyright") == 0) { + NoCopyright = 1; }else{ /* printv("Unknown option\n"); */ } @@ -117,6 +132,7 @@ main(int argc,char *argv[]) { /* Load ox engine here */ /* engine id should be set to ox.engine */ KSexecuteString(" [(parse) (ox.sm1) pushfile] extension "); + if (Xm_noX) KSexecuteString(" /Xm_noX 1 def "); startEngine(TM_Engine," "); if (signal(SIGINT,SIG_IGN) != SIG_IGN) { @@ -127,7 +143,11 @@ main(int argc,char *argv[]) { while(1) { /* printp(sys); no prompt */ if (SETJMP(EnvOfStackMachine)) { - KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + if (!Calling_ctrlC_hook) { + Calling_ctrlC_hook = 1; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + } + Calling_ctrlC_hook = 0; if (signal(SIGINT,SIG_IGN) != SIG_IGN) { signal(SIGINT,ctrlC); } @@ -181,15 +201,21 @@ main(int argc,char *argv[]) { KSexecuteString(" ox.engine oxpopstring "); r = KSpopString(); } - if (strlen(r) < OutputLimit_for_TeXmacs) { - if (vmode) printv(r); else printl(r); - } else printv("Output is too large.\n"); + if (isPS(r)) { + printps(r); + }else{ + if (vmode) printv(r); + else{ + if (strlen(r) < OutputLimit_for_TeXmacs) { + printl(r); + } else printv("Output is too large.\n"); + } + } }else{ if (!TM_do_not_print) { KSexecuteString(" ox.engine oxpopstring "); r = KSpopString(); - if (strlen(r) < OutputLimit_for_TeXmacs) printv(r); - else printv("Output is too large.\n"); + printv(r); }else{ KSexecuteString(" ox.engine 1 oxpops "); /* Discard the result. */ /* Push and pop dummy data to wait until the computation finishes. */ @@ -222,6 +248,7 @@ static char *readString(FILE *fp, char *prolog, char * int i; int m; int start; + struct object ob; if (limit == 0) { limit = 1024; s = (char *)sGC_malloc(limit); @@ -241,17 +268,19 @@ static char *readString(FILE *fp, char *prolog, char * fprintf(Dfp,"[%x] ",c); fflush(Dfp); #endif if (c == END_OF_INPUT) { + /* If there remains data in the stream, + read the remaining data. */ + /* if (oxSocketSelect0(0,1)) { - /* If there remains data in the stream, - read the remaining data. */ if (c == '\n') c=' '; s[n++] = c; s[n] = 0; m++; INC_BUF ; continue; } + */ break; } - if (c == '\n') c=' '; + if ( c == '\v') c=' '; s[n++] = c; s[n] = 0; m++; INC_BUF ; } @@ -286,6 +315,13 @@ static char *readString(FILE *fp, char *prolog, char * TM_Engine=K0; startEngine(TM_Engine,"k0"); return NULL; } + if (strcmp(&(s[start]),"!reset;") == 0) { + printf("%s",DATA_BEGIN_V); + KSexecuteString(" ox.engine oxreset ox.engine oxpopcmo "); + ob = KSpop(); + printf("%s",DATA_END); fflush(stdout); + return NULL; + } /* Set TM_do_no_print */ if (s[n-1] == '$' && TM_Engine == ASIR) { @@ -317,6 +353,20 @@ static void printl(char *s) { printf("%s",DATA_END); fflush(NULL); } +static int isPS(char *s) { + if (s[0] != '%') return 0; + if (s[1] != '%') return 0; + if (s[2] != '!') return 0; + if (s[3] != 'P') return 0; + if (s[4] != 'S') return 0; + return 1; +} +static void printps(char *s) { + printf("%s",DATA_BEGIN_PS); + printf("%s",s); + printf("%s",DATA_END); + fflush(NULL); +} static void printp(char *s) { printf("%s",DATA_BEGIN_P); printf("%s",DATA_END); @@ -325,9 +375,12 @@ static void printp(char *s) { } static void printCopyright(char *s) { printf("%s",DATA_BEGIN_V); - printf("OpenXM engine (ox engine) interface for TeXmacs\n2004 (C) openxm.org"); - printf(" under the BSD licence. !asir; !sm1; !k0; !verbatim;"); - printf("%s",s); + if (! NoCopyright) { + printf("OpenXM engine (ox engine) interface for TeXmacs\n2004 (C) openxm.org"); + printf(" under the BSD license. !asir; !sm1; !k0; !verbatim;\n"); + printf("Type in !reset; when the engine gets confused. "); + printf("%s",s); + } printf("%s",DATA_END); fflush(NULL); } @@ -344,11 +397,13 @@ static int startEngine(int type,char *msg) { KSexecuteString(" oxsm1.ccc ( ( ) message (------------- Message from sm1 ----------------)message ) oxsubmit "); TM_sm1Started = 1; /* Welcome message. BUG. Copyright should be returned by a function. */ - printf("Kan/StackMachine1 1991 April --- 2004.\n"); - printf("This software may be freely distributed as is with no warranty expressed. \n"); - printf("See OpenXM/Copyright/Copyright.generic\n"); - printf("Info: http://www.math.kobe-u.ac.jp/KAN, kan@math.kobe-u.ac.jp.\n"); - printf("0 usages to show a list of functions. \n(keyword) usages to see a short description\n"); + if (! NoCopyright) { + printf("Kan/StackMachine1 1991 April --- 2004.\n"); + printf("This software may be freely distributed as is with no warranty expressed. \n"); + printf("See OpenXM/Copyright/Copyright.generic\n"); + printf("Info: http://www.math.kobe-u.ac.jp/KAN, kan@math.kobe-u.ac.jp.\n"); + printf("0 usages to show a list of functions. \n(keyword) usages to see a short description\n"); + } printf("%s\n",msg); }else if (type == K0) { if (!TM_k0Started) KSexecuteString(" k0connectr "); @@ -360,10 +415,12 @@ static int startEngine(int type,char *msg) { KSexecuteString(" /ox.engine oxasir.ccc def "); TM_asirStarted = 1; printf("%s\n",msg); - KSexecuteString(" oxasir.ccc (copyright()+asir_contrib_copyright();) oxsubmit oxasir.ccc oxpopstring "); - ob = KSpop(); - if (ob.tag == Sdollar) { - printf("%s",ob.lc.str); + if ( ! NoCopyright) { + KSexecuteString(" oxasir.ccc (copyright()+asir_contrib_copyright();) oxsubmit oxasir.ccc oxpopstring "); + ob = KSpop(); + if (ob.tag == Sdollar) { + printf("%s",ob.lc.str); + } } /* Initialize the setting of asir. */ KSexecuteString(" oxasir.ccc (if(1) { Xm_server_mode = 1; Xm_helpdir = \"help-eg\"; } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");