Annotation of OpenXM/src/kxx/ox_texmacs.c, Revision 1.41
1.41 ! takayama 1: /* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.40 2016/08/24 22:38:12 takayama Exp $ */
1.1 takayama 2:
3: #include <stdio.h>
1.23 takayama 4: #include <stdlib.h>
5: #include <string.h>
1.1 takayama 6: #include <setjmp.h>
7: #include <signal.h>
8: #include "ox_kan.h"
9: #include "serversm.h"
1.33 takayama 10: #include "ox_pathfinder.h"
1.1 takayama 11:
1.37 takayama 12: #if defined(__CYGWIN__) || defined(__MSYS__)
1.1 takayama 13: #define JMP_BUF sigjmp_buf
1.37 takayama 14: #define SETJMP(env) MYSIGSETJMP(env,1)
15: #define LONGJMP(env,p) MYSIGLONGJMP(env,p)
1.1 takayama 16: #else
17: #define JMP_BUF jmp_buf
1.37 takayama 18: #define SETJMP(env) MYSETJMP(env)
19: #define LONGJMP(env,p) MYLONGJMP(env,p)
1.1 takayama 20: #endif
21:
1.3 takayama 22: /*
23: #define DEBUG
24: */
1.7 takayama 25: /* #define DEBUG2 */
1.3 takayama 26:
1.23 takayama 27: /* Type of View part (user interface engine) */
28: #define GENERIC 0 /* DEBUG, xml */
29: #define V_TEXMACS 1
30: #define V_CFEP 2
1.40 takayama 31: #define V_QFEP 3
1.23 takayama 32: int View = V_TEXMACS ;
33:
34: char *Data_begin_v[] = {
35: "<S type=verbatim>",
36: "\002verbatim:",
37: "\002",
1.40 takayama 38: ""
1.23 takayama 39: };
40: char *Data_begin_l[] = {
41: "<S type=latex>",
42: "\002latex:",
1.40 takayama 43: "\002latex:",
44: ""
1.23 takayama 45: };
46: char *Data_begin_p[] = {
47: "<S type=prompt>",
48: "\002prompt:",
1.40 takayama 49: "\002prompt:",
50: ""
1.23 takayama 51: };
52: char *Data_begin_ps[] = {
53: "<S type=postscript>",
54: "\002ps:",
1.40 takayama 55: "\002ps:",
56: ""
1.23 takayama 57: };
58: char *Data_end[] = {
59: "</S>",
60: "\005",
1.40 takayama 61: "\n\005", /* \n is not a part of the protocol. */
62: ""
1.23 takayama 63: };
64:
1.25 takayama 65: /* todo: start_of_input */
1.2 takayama 66:
1.25 takayama 67: char End_of_input[] = {
68: 0x5, /* Use ^E and Return to end the input. */
69: '\n', /* TEXMACS_END_OF_INPUT. 0xd should be used for multiple lines. */
1.40 takayama 70: 0x5, /* CFEP_END_OF_INPUT */
71: 0x5
1.25 takayama 72: };
1.1 takayama 73:
1.5 takayama 74: /* Table for the engine type. */
75: #define ASIR 1
76: #define SM1 2
77: #define K0 3
78:
1.1 takayama 79: extern int Quiet;
80: extern JMP_BUF EnvOfStackMachine;
1.19 takayama 81: extern int Calling_ctrlC_hook;
1.20 takayama 82: extern int RestrictedMode, RestrictedMode_saved;
1.33 takayama 83: int Format=1; /* 1 : latex mode, 2: cfep_png */
1.3 takayama 84: int OutputLimit_for_TeXmacs = (1024*10);
1.1 takayama 85:
1.22 takayama 86:
1.5 takayama 87: int TM_Engine = ASIR ;
88: int TM_asirStarted = 0;
89: int TM_sm1Started = 0;
90: int TM_k0Started = 0;
1.7 takayama 91: int TM_do_not_print = 0;
1.5 takayama 92:
1.15 takayama 93: int Xm_noX = 0;
94: int NoCopyright = 0;
1.25 takayama 95: int Cpp = 0; /* Use cpp before sending to the engine. */
96: int EngineLogToStdout = 0; /* Do not run the ox engine inside xterm. */
1.15 takayama 97:
1.33 takayama 98: char *AsirInitFile = NULL;
1.32 takayama 99:
1.29 takayama 100: char *LanguageResource = NULL;
1.41 ! takayama 101: int TM_quiet = 0;
1.29 takayama 102:
1.1 takayama 103: void ctrlC();
104: struct object KpoString(char *s);
105: char *KSpopString(void);
106:
1.2 takayama 107: static char *readString(FILE *fp,char *prolog, char *eplog);
1.1 takayama 108: static void printv(char *s);
109: static void printl(char *s);
110: static void printp(char *s);
1.17 takayama 111: static void printps(char *s);
1.2 takayama 112: static void printCopyright(char *s);
1.5 takayama 113: static int startEngine(int type,char *msg);
1.17 takayama 114: static int isPS(char *s);
1.22 takayama 115: static int end_of_input(int c);
116: static void setDefaultParameterForCfep();
1.2 takayama 117:
1.27 takayama 118: static void myEncoder(int c);
119: static void myEncoderS(unsigned char *s);
120: static void myEncoderSn(unsigned char *s,int n);
121: static void outputStringToTunnel0(int channel, unsigned char *s, int size, int view);
122: static void outputStringToTunnel(int channel, unsigned char *s, int view);
123:
1.33 takayama 124: static void pngSendFile(char *path);
125: static int pngCheck(void);
126: static void pngNotAvailable(void);
127: static char *pngGetResult();
128:
1.31 takayama 129: static void flushSm1();
130:
1.2 takayama 131: /* tail -f /tmp/debug-texmacs.txt
132: Debug output to understand the timing problem of pipe interface.
133: */
1.3 takayama 134: FILE *Dfp;
1.1 takayama 135:
1.10 takayama 136: main(int argc,char *argv[]) {
1.1 takayama 137: char *s;
138: char *r;
139: char *sys;
1.21 takayama 140: struct object ob = OINIT;
1.3 takayama 141: int irt=0;
1.4 takayama 142: int vmode=1;
1.7 takayama 143: char *openxm_home;
144: char *asir_config;
1.33 takayama 145: char *path;
1.10 takayama 146: int i;
1.1 takayama 147:
1.7 takayama 148:
149:
1.3 takayama 150: #ifdef DEBUG2
151: Dfp = fopen("/tmp/debug-texmacs.txt","w");
152: #endif
1.41 ! takayama 153:
! 154: TM_quiet=0;
! 155: for (i=1; i<argc; i++) {
! 156: if (strcmp(argv[i],"--quiet")==0) {
! 157: TM_quiet=1;
! 158: }
! 159: }
1.36 takayama 160: /* Initialize kanlib (gc is also initialized) */
1.41 ! takayama 161: if (TM_quiet) {
! 162: KSstart_quiet();
! 163: }else{
! 164: KSstart();
! 165: }
1.1 takayama 166: /* Set consts */
167: Quiet = 1;
1.10 takayama 168: for (i=1; i<argc; i++) {
1.22 takayama 169: if (strcmp(argv[i],"--view") == 0) {
170: i++;
171: if (strcmp(argv[i],"texmacs") == 0) {
172: View = V_TEXMACS;
173: }else if (strcmp(argv[i],"cfep")==0) {
174: View = V_CFEP; setDefaultParameterForCfep();
1.40 takayama 175: }else if (strcmp(argv[i],"qfep")==0) {
176: View = V_QFEP; setDefaultParameterForCfep();
1.22 takayama 177: }else{
1.25 takayama 178: View = GENERIC;
1.22 takayama 179: /* printv("Unknown view type.\n"); */
180: }
181: } else if (strcmp(argv[i],"--sm1") == 0) {
182: TM_Engine = SM1;
183: }else if (strcmp(argv[i],"--asir") == 0) {
184: TM_Engine = ASIR;
185: }else if (strcmp(argv[i],"--k0") == 0) {
186: TM_Engine = K0;
1.14 takayama 187: }else if (strcmp(argv[i],"--outputLimit") == 0) {
188: i++;
189: sscanf(argv[i],"%d",&OutputLimit_for_TeXmacs);
1.15 takayama 190: }else if (strcmp(argv[i],"--noLogWindow") == 0) {
1.22 takayama 191: Xm_noX = 1;
1.15 takayama 192: }else if (strcmp(argv[i],"--noCopyright") == 0) {
1.22 takayama 193: NoCopyright = 1;
1.25 takayama 194: }else if (strcmp(argv[i],"--cpp") == 0) {
195: Cpp = 1;
196: }else if (strcmp(argv[i],"--engineLogToStdout") == 0) {
197: EngineLogToStdout = 1;
1.29 takayama 198: }else if (strcmp(argv[i],"--languageResource") == 0) {
199: i++;
200: LanguageResource = (char *)sGC_malloc(strlen(argv[i])+80);
201: sprintf(LanguageResource,
202: " /localizedString.file (%s) def localizedString.load ",argv[i]);
1.32 takayama 203: }else if (strcmp(argv[i],"--asirInitFile") == 0) {
204: i++;
1.33 takayama 205: AsirInitFile = (char *)sGC_malloc(strlen(argv[i])+80);
1.32 takayama 206: sprintf(AsirInitFile,"%s",argv[i]);
1.41 ! takayama 207: }else if (strcmp(argv[i],"--quiet") == 0) {
! 208: /* it is already set. Ignore. */
1.22 takayama 209: }else{
210: /* printv("Unknown option\n"); */
211: }
1.10 takayama 212: }
1.1 takayama 213:
1.23 takayama 214: openxm_home = (char *) getenv("OpenXM_HOME");
215: asir_config = (char *) getenv("ASIR_CONFIG");
216: if (openxm_home == NULL) {
217: printv("Error. The environmental variable OpenXM_HOME is not set.\nStart the texmacs with openxm texmacs or ox_texmacs by openxm ox_texmacs\nBye...");
218: exit(10);
219: }
220:
1.1 takayama 221:
1.3 takayama 222: /* Main loop */
1.23 takayama 223: printf("%s",Data_begin_v[View]);
224: if ((asir_config == NULL) && (View == V_TEXMACS)) {
225: printf("Warning. The environmental variable ASIR_CONFIG is not set.\nStart the texmacs with openxm texmacs or ox_texmacs by openxm ox_texmacs.\nOtherwise, tex translation will not be performed\n");
226:
227: }
228:
1.3 takayama 229: printCopyright("");
230:
1.23 takayama 231:
1.1 takayama 232: /* Load ox engine here */
233: /* engine id should be set to ox.engine */
234: KSexecuteString(" [(parse) (ox.sm1) pushfile] extension ");
1.15 takayama 235: if (Xm_noX) KSexecuteString(" /Xm_noX 1 def ");
1.26 takayama 236: if (EngineLogToStdout) KSexecuteString(" /Xm_engineLogToStdout 1 def ");
1.29 takayama 237: if (LanguageResource != NULL) KSexecuteString(LanguageResource);
1.5 takayama 238: startEngine(TM_Engine," ");
1.1 takayama 239:
1.39 takayama 240: if (mysignal(SIGINT,SIG_IGN) != SIG_IGN) {
241: mysignal(SIGINT,ctrlC);
1.1 takayama 242: }
1.3 takayama 243:
244: irt = 0;
1.1 takayama 245: while(1) {
1.8 takayama 246: /* printp(sys); no prompt */
247: if (SETJMP(EnvOfStackMachine)) {
1.19 takayama 248: if (!Calling_ctrlC_hook) {
1.20 takayama 249: Calling_ctrlC_hook = 1; RestrictedMode = 0;
1.19 takayama 250: KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
1.20 takayama 251: RestrictedMode = RestrictedMode_saved;
1.19 takayama 252: }
253: Calling_ctrlC_hook = 0;
1.39 takayama 254: if (mysignal(SIGINT,SIG_IGN) != SIG_IGN) {
255: mysignal(SIGINT,ctrlC);
1.8 takayama 256: }
257: irt = 1;
258: continue;
259: } else { }
260: if (!irt) {
1.23 takayama 261: printf("%s",Data_end[View]); fflush(stdout);
1.8 takayama 262: }
263: irt = 0;
1.7 takayama 264:
265: /* Reading the input. */
1.8 takayama 266: if (TM_Engine == K0) {
267: s=readString(stdin, " ", " "); /* see test data */
268: }else if (TM_Engine == SM1) {
269: s=readString(stdin, " ", " "); /* see test data */
270: }else{
271: s=readString(stdin, "if (1) { ", " ; }else{ }"); /* see test data */
272: }
1.5 takayama 273:
1.8 takayama 274: if (s == NULL) { irt = 1; continue; }
1.23 takayama 275: if (!irt) printf("%s",Data_begin_v[View]);
1.7 takayama 276: /* Evaluate the input on the engine */
1.27 takayama 277: KSexecuteString(" ox.engine oxclearstack ");
1.1 takayama 278: KSexecuteString(" ox.engine ");
1.7 takayama 279: ob = KpoString(s);
1.8 takayama 280: KSpush(ob);
281: KSexecuteString(" oxsubmit ");
1.31 takayama 282:
283: if (TM_Engine == SM1) flushSm1();
1.8 takayama 284:
1.27 takayama 285: /* Get the result in string for cfep. */
286: if (View != V_TEXMACS) {
287: KSexecuteString(" ox.engine oxgeterrors ");
288: ob = KSpop();
289: if (ob.tag == Sarray) {
290: if (getoaSize(ob) > 0) {
291: ob = getoa(ob,0);
292: KSpush(ob);
293: KSexecuteString(" translateErrorForCfep ");
294: r = KSpopString();
295: outputStringToTunnel(0,(unsigned char *)r,View);
296: }
297: }
298: if (!TM_do_not_print) {
1.33 takayama 299: if (Format == 2) { /* png mode */
300: r = pngGetResult();
301: }else{
302: KSexecuteString(" ox.engine oxpopstring ");
303: r = KSpopString();
304: }
1.27 takayama 305: printv(r);
306: }else{
307: KSexecuteString(" ox.engine 1 oxpops ");
308: KSexecuteString(" ox.engine 0 oxpushcmo ox.engine oxpopcmo ");
309: ob = KSpop();
310: printv("");
311: }
312: continue;
313: }
314: /* Get the result in string for texmacs */
1.33 takayama 315: if ((Format == 1) && (! TM_do_not_print)) {
1.8 takayama 316: /* translate to latex form */
317: KSexecuteString(" ox.engine oxpushcmotag ox.engine oxpopcmo ");
318: ob = KSpop();
319: vmode = 0;
320: /* printf("id=%d\n",ob.tag); bug: matrix return 17 instead of Sinteger
321: or error. */
322: if (ob.tag == Sinteger) {
323: /* printf("cmotag=%d\n",ob.lc.ival);*/
324: if (ob.lc.ival == CMO_ERROR2) {
325: vmode = 1;
326: }
327: if (ob.lc.ival == CMO_STRING) {
328: vmode = 1;
329: }
330: }
331: if (vmode) {
332: KSexecuteString(" ox.engine oxpopstring ");
333: r = KSpopString();
334: }else{
335: KSexecuteString(" ox.engine 1 oxpushcmo ox.engine (print_tex_form) oxexec ");
336: KSexecuteString(" ox.engine oxpopstring ");
337: r = KSpopString();
338: }
1.17 takayama 339: if (isPS(r)) {
340: printps(r);
341: }else{
342: if (vmode) printv(r);
343: else{
344: if (strlen(r) < OutputLimit_for_TeXmacs) {
345: printl(r);
346: } else printv("Output is too large.\n");
347: }
348: }
1.8 takayama 349: }else{
350: if (!TM_do_not_print) {
351: KSexecuteString(" ox.engine oxpopstring ");
352: r = KSpopString();
1.17 takayama 353: printv(r);
1.8 takayama 354: }else{
355: KSexecuteString(" ox.engine 1 oxpops "); /* Discard the result. */
1.12 takayama 356: /* Push and pop dummy data to wait until the computation finishes. */
357: KSexecuteString(" ox.engine 0 oxpushcmo ox.engine oxpopcmo ");
358: ob = KSpop();
1.8 takayama 359: printv("");
360: }
361: }
1.27 takayama 362: /* note that there is continue above. */
1.1 takayama 363: }
364: }
365:
1.33 takayama 366: static char *pngGetResult(void) {
367: struct object ob;
368: int vmode;
369: char *r;
370: char *path;
371:
372: /* translate to latex form */
373: KSexecuteString(" ox.engine oxpushcmotag ox.engine oxpopcmo ");
374: ob = KSpop();
375: vmode = 0;
376: /* printf("id=%d\n",ob.tag); bug: matrix return 17 instead of Sinteger
377: or error. */
378: if (ob.tag == Sinteger) {
379: /* printf("cmotag=%d\n",ob.lc.ival);*/
380: if (ob.lc.ival == CMO_ERROR2) {
381: vmode = 1;
382: }
383: if (ob.lc.ival == CMO_STRING) {
384: vmode = 1;
385: }
386: }
387: if (vmode) {
388: KSexecuteString(" ox.engine oxpopstring ");
389: r = KSpopString();
390: }else{
391: KSexecuteString(" ox.engine 1 oxpushcmo ox.engine (print_png_form2) oxexec ");
392: KSexecuteString(" ox.engine oxpopcmo /tmp_ox_texmacs set tmp_ox_texmacs 0 get ");
393: r = KSpopString(); /* input form */
394: KSexecuteString(" tmp_ox_texmacs 1 get ");
395: path = KSpopString(); /* path name of the png file. */
396: pngSendFile(path);
397: }
398: return r;
399: }
400:
1.1 takayama 401: #define SB_SIZE 1024
1.8 takayama 402: #define INC_BUF if (n >= limit-3) { \
403: tmp = s; \
404: limit *= 2; \
405: s = (char *) sGC_malloc(limit); \
406: if (s == NULL) { \
407: fprintf(stderr,"No more memory.\n"); \
408: exit(10); \
409: } \
410: strcpy(s,tmp); \
411: }
1.2 takayama 412: /* */
413: static char *readString(FILE *fp, char *prolog, char *epilog) {
1.1 takayama 414: int n = 0;
415: static int limit = 0;
416: static char *s;
417: int c;
418: char *tmp;
1.2 takayama 419: int i;
1.3 takayama 420: int m;
421: int start;
1.21 takayama 422: struct object ob = OINIT;
1.1 takayama 423: if (limit == 0) {
1.8 takayama 424: limit = 1024;
425: s = (char *)sGC_malloc(limit);
426: if (s == NULL) {
427: fprintf(stderr,"No more memory.\n");
428: exit(10);
429: }
1.1 takayama 430: }
1.2 takayama 431: s[0] = 0; n = 0; m = 0;
432: for (i=0; i < strlen(prolog); i++) {
1.8 takayama 433: s[n++] = prolog[i]; s[n] = 0;
1.2 takayama 434: INC_BUF ;
435: }
1.3 takayama 436: start = n;
1.1 takayama 437: while ((c = fgetc(fp)) != EOF) {
1.3 takayama 438: #ifdef DEBUG2
1.8 takayama 439: fprintf(Dfp,"[%x] ",c); fflush(Dfp);
1.3 takayama 440: #endif
1.22 takayama 441: if (end_of_input(c)) {
1.18 takayama 442: /* If there remains data in the stream,
1.25 takayama 443: read the remaining data. (for debug) */
1.18 takayama 444: /*
1.8 takayama 445: if (oxSocketSelect0(0,1)) {
446: if (c == '\n') c=' ';
447: s[n++] = c; s[n] = 0; m++;
448: INC_BUF ;
449: continue;
450: }
1.18 takayama 451: */
1.8 takayama 452: break;
453: }
1.18 takayama 454: if ( c == '\v') c=' ';
1.8 takayama 455: s[n++] = c; s[n] = 0; m++;
1.2 takayama 456: INC_BUF ;
457: }
1.5 takayama 458: /* Check the escape sequence */
459: if (strcmp(&(s[start]),"!quit;") == 0) {
1.8 takayama 460: printv("Terminated the process ox_texmacs.\n");
461: exit(0);
1.3 takayama 462: }
1.11 takayama 463: /* Check the escape sequence to change the global env. */
1.5 takayama 464: if (strcmp(&(s[start]),"!verbatim;") == 0) {
1.33 takayama 465: if (View != V_CFEP) printv("Output mode is changed to verbatim mode.");
1.8 takayama 466: Format=0;
467: return NULL;
1.5 takayama 468: }
469: if (strcmp(&(s[start]),"!latex;") == 0) {
1.8 takayama 470: printv("Output mode is changed to latex/verbose.");
471: Format = 1;
472: return NULL;
1.5 takayama 473: }
1.33 takayama 474: if (strcmp(&(s[start]),"!cfep_png;") == 0) {
475: if (pngCheck()) {
476: if (View != V_CFEP) printv("Output mode is changed to cfep_png/verbose.");
477: Format = 2;
478: } else pngNotAvailable();
479: return NULL;
480: }
1.5 takayama 481: if (strcmp(&(s[start]),"!asir;") == 0) {
1.8 takayama 482: Format=1;
483: TM_Engine=ASIR; startEngine(TM_Engine,"Asir");
484: return NULL;
1.5 takayama 485: }
486: if (strcmp(&(s[start]),"!sm1;") == 0) {
1.8 takayama 487: Format=0;
488: TM_Engine=SM1; startEngine(TM_Engine,"sm1");
489: return NULL;
1.5 takayama 490: }
491: if (strcmp(&(s[start]),"!k0;") == 0) {
1.8 takayama 492: Format=0;
493: TM_Engine=K0; startEngine(TM_Engine,"k0");
494: return NULL;
1.5 takayama 495: }
1.13 takayama 496: if (strcmp(&(s[start]),"!reset;") == 0) {
1.23 takayama 497: printf("%s",Data_begin_v[View]);
1.13 takayama 498: KSexecuteString(" ox.engine oxreset ox.engine oxpopcmo ");
499: ob = KSpop();
1.23 takayama 500: printf("%s",Data_end[View]); fflush(stdout);
1.13 takayama 501: return NULL;
502: }
1.11 takayama 503:
1.32 takayama 504: /* remove end$ or end; */
505: if (TM_Engine == ASIR) {
506: for (i=n-1; i>=4; i--) {
507: if ((s[i-4]=='\n') && (s[i-3]=='e') && (s[i-2]=='n') && (s[i-1]=='d') && (s[i]=='$')) {
508: s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break;
509: }
510: if ((s[i-4]=='\n') && (s[i-3]=='e') && (s[i-2]=='n') && (s[i-1]=='d') && (s[i]==';')) {
511: s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break;
512: }
513: }
514: }
515:
1.11 takayama 516: /* Set TM_do_no_print */
517: if (s[n-1] == '$' && TM_Engine == ASIR) {
518: TM_do_not_print = 1; s[n-1] = ' ';
519: } else if (s[n-1] == ';' && TM_Engine == SM1) {
520: TM_do_not_print = 1; s[n-1] = ' ';
521: } else TM_do_not_print = 0;
1.5 takayama 522:
1.2 takayama 523: for (i=0; i < strlen(epilog); i++) {
1.8 takayama 524: s[n++] = epilog[i]; s[n] = 0;
1.2 takayama 525: INC_BUF ;
1.1 takayama 526: }
527: return s;
1.22 takayama 528: }
529:
530: static int end_of_input(int c) {
1.25 takayama 531: if (c == End_of_input[View]) return 1;
532: else return 0;
1.22 takayama 533: }
1.25 takayama 534:
1.22 takayama 535: static void setDefaultParameterForCfep() {
536: Format = 0;
1.1 takayama 537: }
538:
539: static void printv(char *s) {
540: int i;
1.23 takayama 541: printf("%s",Data_begin_v[View]);
1.1 takayama 542: printf("%s",s);
1.23 takayama 543: printf("%s",Data_end[View]);
1.3 takayama 544: #ifdef DEBUG2
545: fprintf(Dfp,"<%s>",s); fflush(Dfp);
546: #endif
1.1 takayama 547: fflush(NULL);
548: }
549: static void printl(char *s) {
1.23 takayama 550: printf("%s",Data_begin_l[View]);
1.4 takayama 551: printf(" $ %s $ ",s);
1.23 takayama 552: printf("%s",Data_end[View]);
1.17 takayama 553: fflush(NULL);
554: }
555: static int isPS(char *s) {
556: if (s[0] != '%') return 0;
557: if (s[1] != '%') return 0;
558: if (s[2] != '!') return 0;
559: if (s[3] != 'P') return 0;
560: if (s[4] != 'S') return 0;
561: return 1;
562: }
563: static void printps(char *s) {
1.23 takayama 564: printf("%s",Data_begin_ps[View]);
1.17 takayama 565: printf("%s",s);
1.23 takayama 566: printf("%s",Data_end[View]);
1.1 takayama 567: fflush(NULL);
568: }
569: static void printp(char *s) {
1.23 takayama 570: printf("%s",Data_begin_p[View]);
571: printf("%s",Data_end[View]);
1.2 takayama 572: printf("%s] ",s);
573: fflush(NULL);
574: }
575: static void printCopyright(char *s) {
1.23 takayama 576: printf("%s",Data_begin_v[View]);
1.15 takayama 577: if (! NoCopyright) {
1.24 takayama 578: printf("OpenXM engine (ox engine) interface with TeXmacs protocol.\n2004 (C) openxm.org");
579: printf(" under the BSD license. !asir; !sm1; !k0; !verbatim; !quit;\n");
1.15 takayama 580: printf("Type in !reset; when the engine gets confused. ");
581: printf("%s",s);
582: }
1.23 takayama 583: printf("%s",Data_end[View]);
1.5 takayama 584: fflush(NULL);
585: }
586:
1.31 takayama 587: static void flushSm1() {
588: KSexecuteString(" oxsm1.ccc ( [(flush)] extension pop ) oxsubmit ");
589: }
1.5 takayama 590: static int startEngine(int type,char *msg) {
1.21 takayama 591: struct object ob = OINIT;
1.23 takayama 592: printf("%s",Data_begin_v[View]);
1.5 takayama 593: if (type == SM1) {
594: if (!TM_sm1Started) KSexecuteString(" sm1connectr ");
1.8 takayama 595: KSexecuteString(" /ox.engine oxsm1.ccc def ");
1.10 takayama 596: /* Initialize the setting of sm1. */
597: KSexecuteString(" oxsm1.ccc ( [(cmoLispLike) 0] extension ) oxsubmit ");
598: KSexecuteString(" oxsm1.ccc ( ox_server_mode ) oxsubmit ");
1.31 takayama 599: KSexecuteString(" oxsm1.ccc ( ( ) message (------------- Message from sm1 ----------------)message ) oxsubmit ");
600: flushSm1();
1.8 takayama 601: TM_sm1Started = 1;
1.10 takayama 602: /* Welcome message. BUG. Copyright should be returned by a function. */
1.15 takayama 603: if (! NoCopyright) {
604: printf("Kan/StackMachine1 1991 April --- 2004.\n");
605: printf("This software may be freely distributed as is with no warranty expressed. \n");
606: printf("See OpenXM/Copyright/Copyright.generic\n");
607: printf("Info: http://www.math.kobe-u.ac.jp/KAN, kan@math.kobe-u.ac.jp.\n");
608: printf("0 usages to show a list of functions. \n(keyword) usages to see a short description\n");
609: }
1.30 takayama 610: printf("%s\n",msg); fflush(NULL);
1.5 takayama 611: }else if (type == K0) {
612: if (!TM_k0Started) KSexecuteString(" k0connectr ");
1.8 takayama 613: KSexecuteString(" /ox.engine oxk0.ccc def ");
614: TM_k0Started = 1;
615: printf("%s\n",msg);
1.5 takayama 616: }else{
617: if (!TM_asirStarted) KSexecuteString(" asirconnectr ");
1.8 takayama 618: KSexecuteString(" /ox.engine oxasir.ccc def ");
619: TM_asirStarted = 1;
620: printf("%s\n",msg);
1.24 takayama 621: if ((!NoCopyright) && ((char *)getenv("ASIR_CONFIG") != NULL)) {
1.15 takayama 622: KSexecuteString(" oxasir.ccc (copyright()+asir_contrib_copyright();) oxsubmit oxasir.ccc oxpopstring ");
1.24 takayama 623: ob = KSpop();
624: if (ob.tag == Sdollar) {
625: printf("%s",ob.lc.str);
626: }
627: }else if ((!NoCopyright) && ((char *)getenv("ASIR_CONFIG") == NULL)) {
628: KSexecuteString(" oxasir.ccc (copyright();) oxsubmit oxasir.ccc oxpopstring ");
1.15 takayama 629: ob = KSpop();
630: if (ob.tag == Sdollar) {
631: printf("%s",ob.lc.str);
632: }
1.8 takayama 633: }
1.7 takayama 634: /* Initialize the setting of asir. */
1.32 takayama 635: if (AsirInitFile) { /* cf. asir-contrib/packages/src/cfep-init.rr */
636: unsigned char *ss;
1.36 takayama 637: ss = (unsigned char *)sGC_malloc(strlen(AsirInitFile)+256);
1.33 takayama 638: sprintf((char *)ss," oxasir.ccc (load(\"%s\");) oxsubmit oxasir.ccc oxgeterrors length 0 gt { (Error in loading asirInitFile) message} { } ifelse ",AsirInitFile);
1.32 takayama 639: /* printf("Loading --asirInitFile %s\n",AsirInitFile); */
640: KSexecuteString(ss);
641: }
1.35 ohara 642: KSexecuteString(" oxasir.ccc (if(1) { Xm_server_mode = 1; Xm_helpdir = \"help-en\"; } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");
1.7 takayama 643: KSexecuteString(" oxasir.ccc (if(1) { ctrl(\"message\",0); } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");
644: /* bug; if ctrl is written with Xm_helpdir = ... without oxpopcmo, then it does
645: not work. */
1.9 takayama 646: KSexecuteString(" oxasir.ccc (print(\"----------- Messages from asir ------------------------------\")$ ) oxsubmit oxasir.ccc oxpopcmo ");
1.5 takayama 647: }
1.23 takayama 648: printf("%s",Data_end[View]);
1.1 takayama 649: fflush(NULL);
650: }
1.2 takayama 651:
652: /* test data
653:
654: 1. print("hello"); print("afo");
655:
656: 1+2;
657:
658: 2. def foo(N) { for (I=0; I<10; I++) { --> error
659:
660: 3+5;
661:
662: 4. print("hello"); shift+return print("afo");
663:
664: */
1.27 takayama 665:
666: static void myEncoder(int c) {
667: putchar(0xf8 | (0x3 & (c >> 6)));
668: putchar(0xf0 | (0x7 & (c >> 3)));
669: putchar(0xf0 | (0x7 & c));
670: }
671: static void myEncoderS(unsigned char *s) {
672: int i,n;
1.33 takayama 673: n = strlen((char *)s);
1.27 takayama 674: for (i = 0; i<n ; i++) myEncoder(s[i]);
675: }
676: static void myEncoderSn(unsigned char *s,int n) {
677: int i;
678: for (i = 0; i<n ; i++) myEncoder(s[i]);
679: }
680: static void outputStringToTunnel0(int channel, unsigned char *s, int n,int view) {
681: unsigned char ts[128];
682: int i;
683: if (view == GENERIC) {
684: printf("{%d<%d ",channel,n+1);
685: for (i=0; i<n; i++) putchar(s[i]);
686: printf("%c>}",0);
687: }else if (view == V_CFEP) {
1.33 takayama 688: sprintf((char *)ts,"{%d<%d ",channel,n+1);
1.27 takayama 689: myEncoderS(ts);
690: myEncoderSn(s,n); myEncoder(0);
1.33 takayama 691: myEncoderS((unsigned char *)">}");
1.27 takayama 692: }
693: fflush(stdout);
694: }
1.28 takayama 695: #define LINE_FEED 0xc /* ^L */
1.27 takayama 696: static void outputStringToTunnel(int channel, unsigned char *s, int view) {
697: int start, i;
698: start = i = 0;
699: while (s[i] != 0) {
1.28 takayama 700: if (s[i] == LINE_FEED) {
701: outputStringToTunnel0(channel,&(s[start]),i-start,view);
1.27 takayama 702: start = i+1;
703: }
704: i++;
705: }
706: }
707:
1.2 takayama 708:
1.33 takayama 709: static void pngSendFile(char *path) {
710: char s[1024];
711: if (strlen(path) > 1000) return;
712: sprintf(s,"showFile,%s",path);
713: outputStringToTunnel0(10,(unsigned char *)s,strlen(s),View);
714: printf("\n");
715: fflush(NULL);
716: }
717: static int pngCheck(void) {
718: static int checked = 0;
719: static int ans = 0;
720: if (checked) return ans;
721: checked = 1;
722: if (!getCommandPath("latex")) return 0;
1.34 takayama 723: if (!getCommandPath("dvipng")) return 0;
1.33 takayama 724: ans = 1; return 1;
725: }
726: static void pngNotAvailable(void) {
727: char *s = "notAvailable";
728: outputStringToTunnel0(10,(unsigned char *)s,strlen(s),View);
729: fflush(NULL);
730: }
1.2 takayama 731:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>