=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/ox_texmacs.c,v retrieving revision 1.16 retrieving revision 1.21 diff -u -p -r1.16 -r1.21 --- OpenXM/src/kxx/ox_texmacs.c 2004/03/09 07:10:46 1.16 +++ OpenXM/src/kxx/ox_texmacs.c 2005/06/16 05:07:24 1.21 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.15 2004/03/09 02:53:05 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.20 2004/09/17 02:42:58 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,8 @@ extern int Quiet; extern JMP_BUF EnvOfStackMachine; +extern int Calling_ctrlC_hook; +extern int RestrictedMode, RestrictedMode_saved; int Format=1; /* 1 : latex mode */ int OutputLimit_for_TeXmacs = (1024*10); @@ -65,8 +69,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. @@ -77,7 +83,7 @@ main(int argc,char *argv[]) { char *s; char *r; char *sys; - struct object ob; + struct object ob = OINIT; int irt=0; int vmode=1; char *openxm_home; @@ -138,7 +144,12 @@ 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; RestrictedMode = 0; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; + } + Calling_ctrlC_hook = 0; if (signal(SIGINT,SIG_IGN) != SIG_IGN) { signal(SIGINT,ctrlC); } @@ -192,15 +203,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. */ @@ -233,7 +250,7 @@ static char *readString(FILE *fp, char *prolog, char * int i; int m; int start; - struct object ob; + struct object ob = OINIT; if (limit == 0) { limit = 1024; s = (char *)sGC_malloc(limit); @@ -253,17 +270,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 ; } @@ -336,6 +355,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); @@ -355,7 +388,7 @@ static void printCopyright(char *s) { } static int startEngine(int type,char *msg) { - struct object ob; + struct object ob = OINIT; printf("%s",DATA_BEGIN_V); if (type == SM1) { if (!TM_sm1Started) KSexecuteString(" sm1connectr ");