[BACK]Return to ox_texmacs.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

Diff for /OpenXM/src/kxx/ox_texmacs.c between version 1.28 and 1.40

version 1.28, 2006/02/02 07:07:22 version 1.40, 2016/08/24 22:38:12
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.27 2006/02/01 04:16:54 takayama Exp $ */  /* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.39 2016/03/31 05:27:34 takayama Exp $ */
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 7 
Line 7 
 #include <signal.h>  #include <signal.h>
 #include "ox_kan.h"  #include "ox_kan.h"
 #include "serversm.h"  #include "serversm.h"
   #include "ox_pathfinder.h"
   
 #if defined(__CYGWIN__)  #if defined(__CYGWIN__) || defined(__MSYS__)
 #define JMP_BUF sigjmp_buf  #define JMP_BUF sigjmp_buf
 #define SETJMP(env)  sigsetjmp(env,1)  #define SETJMP(env)  MYSIGSETJMP(env,1)
 #define LONGJMP(env,p)  siglongjmp(env,p)  #define LONGJMP(env,p)  MYSIGLONGJMP(env,p)
 #else  #else
 #define JMP_BUF jmp_buf  #define JMP_BUF jmp_buf
 #define SETJMP(env)  setjmp(env)  #define SETJMP(env)  MYSETJMP(env)
 #define LONGJMP(env,p)  longjmp(env,p)  #define LONGJMP(env,p)  MYLONGJMP(env,p)
 #endif  #endif
   
 /*  /*
Line 27 
Line 28 
 #define  GENERIC      0   /* DEBUG, xml */  #define  GENERIC      0   /* DEBUG, xml */
 #define  V_TEXMACS    1  #define  V_TEXMACS    1
 #define  V_CFEP       2  #define  V_CFEP       2
   #define  V_QFEP       3
 int View       = V_TEXMACS ;  int View       = V_TEXMACS ;
   
 char *Data_begin_v[] = {  char *Data_begin_v[] = {
   "<S type=verbatim>",    "<S type=verbatim>",
   "\002verbatim:",    "\002verbatim:",
   "\002",    "\002",
     ""
 };  };
 char *Data_begin_l[] = {  char *Data_begin_l[] = {
   "<S type=latex>",    "<S type=latex>",
   "\002latex:",    "\002latex:",
   "\002latex:"    "\002latex:",
     ""
 };  };
 char *Data_begin_p[] = {  char *Data_begin_p[] = {
   "<S type=prompt>",    "<S type=prompt>",
   "\002prompt:",    "\002prompt:",
   "\002prompt:"    "\002prompt:",
     ""
 };  };
 char *Data_begin_ps[] = {  char *Data_begin_ps[] = {
   "<S type=postscript>",    "<S type=postscript>",
   "\002ps:",    "\002ps:",
   "\002ps:"    "\002ps:",
     ""
 };  };
 char *Data_end[] = {  char *Data_end[] = {
   "</S>",    "</S>",
   "\005",    "\005",
   "\n\005"    /* \n is not a part of the protocol. */    "\n\005",    /* \n is not a part of the protocol. */
     ""
 };  };
   
 /* todo:  start_of_input */  /* todo:  start_of_input */
Line 60  char *Data_end[] = {
Line 67  char *Data_end[] = {
 char End_of_input[] = {  char End_of_input[] = {
   0x5,              /* Use ^E and Return to end the input. */    0x5,              /* Use ^E and Return to end the input. */
   '\n',  /* TEXMACS_END_OF_INPUT. 0xd should be used for multiple lines. */    '\n',  /* TEXMACS_END_OF_INPUT. 0xd should be used for multiple lines. */
   0x5    /* CFEP_END_OF_INPUT    */    0x5,    /* CFEP_END_OF_INPUT    */
     0x5
 };  };
   
 /* Table for the engine type. */  /* Table for the engine type. */
Line 72  extern int Quiet;
Line 80  extern int Quiet;
 extern JMP_BUF EnvOfStackMachine;  extern JMP_BUF EnvOfStackMachine;
 extern int Calling_ctrlC_hook;  extern int Calling_ctrlC_hook;
 extern int RestrictedMode, RestrictedMode_saved;  extern int RestrictedMode, RestrictedMode_saved;
 int Format=1;  /* 1 : latex mode */  int Format=1;  /* 1 : latex mode, 2: cfep_png */
 int OutputLimit_for_TeXmacs = (1024*10);  int OutputLimit_for_TeXmacs = (1024*10);
   
   
Line 87  int NoCopyright = 0;
Line 95  int NoCopyright = 0;
 int Cpp = 0;                 /* Use cpp before sending to the engine. */  int Cpp = 0;                 /* Use cpp before sending to the engine. */
 int EngineLogToStdout = 0;   /* Do not run the ox engine inside xterm. */  int EngineLogToStdout = 0;   /* Do not run the ox engine inside xterm. */
   
   char *AsirInitFile = NULL;
   
   char *LanguageResource = NULL;
   
 void ctrlC();  void ctrlC();
 struct object KpoString(char *s);  struct object KpoString(char *s);
 char *KSpopString(void);  char *KSpopString(void);
Line 108  static void myEncoderSn(unsigned char *s,int n);
Line 120  static void myEncoderSn(unsigned char *s,int n);
 static void outputStringToTunnel0(int channel, unsigned char *s, int size, int view);  static void outputStringToTunnel0(int channel, unsigned char *s, int size, int view);
 static void outputStringToTunnel(int channel, unsigned char *s,  int view);  static void outputStringToTunnel(int channel, unsigned char *s,  int view);
   
   static void pngSendFile(char *path);
   static int pngCheck(void);
   static void pngNotAvailable(void);
   static char *pngGetResult();
   
   static void flushSm1();
   
 /* tail -f /tmp/debug-texmacs.txt  /* tail -f /tmp/debug-texmacs.txt
    Debug output to understand the timing problem of pipe interface.     Debug output to understand the timing problem of pipe interface.
 */  */
Line 122  main(int argc,char *argv[]) {
Line 141  main(int argc,char *argv[]) {
   int vmode=1;    int vmode=1;
   char *openxm_home;    char *openxm_home;
   char *asir_config;    char *asir_config;
     char *path;
   int i;    int i;
   
   
Line 130  main(int argc,char *argv[]) {
Line 150  main(int argc,char *argv[]) {
   Dfp = fopen("/tmp/debug-texmacs.txt","w");    Dfp = fopen("/tmp/debug-texmacs.txt","w");
 #endif  #endif
   
     /* Initialize kanlib (gc is also initialized) */
     KSstart();
   
   /* Set consts */    /* Set consts */
   Quiet = 1;    Quiet = 1;
   for (i=1; i<argc; i++) {    for (i=1; i<argc; i++) {
Line 139  main(int argc,char *argv[]) {
Line 162  main(int argc,char *argv[]) {
         View = V_TEXMACS;          View = V_TEXMACS;
       }else if (strcmp(argv[i],"cfep")==0) {        }else if (strcmp(argv[i],"cfep")==0) {
         View = V_CFEP; setDefaultParameterForCfep();          View = V_CFEP; setDefaultParameterForCfep();
         }else if (strcmp(argv[i],"qfep")==0) {
           View = V_QFEP; setDefaultParameterForCfep();
       }else{        }else{
         View = GENERIC;          View = GENERIC;
         /* printv("Unknown view type.\n"); */          /* printv("Unknown view type.\n"); */
Line 160  main(int argc,char *argv[]) {
Line 185  main(int argc,char *argv[]) {
       Cpp = 1;        Cpp = 1;
     }else if (strcmp(argv[i],"--engineLogToStdout") == 0) {      }else if (strcmp(argv[i],"--engineLogToStdout") == 0) {
       EngineLogToStdout = 1;        EngineLogToStdout = 1;
       }else if (strcmp(argv[i],"--languageResource") == 0) {
         i++;
         LanguageResource = (char *)sGC_malloc(strlen(argv[i])+80);
         sprintf(LanguageResource,
                             " /localizedString.file (%s) def localizedString.load ",argv[i]);
       }else if (strcmp(argv[i],"--asirInitFile") == 0) {
         i++;
         AsirInitFile = (char *)sGC_malloc(strlen(argv[i])+80);
         sprintf(AsirInitFile,"%s",argv[i]);
     }else{      }else{
       /* printv("Unknown option\n"); */        /* printv("Unknown option\n"); */
     }      }
Line 172  main(int argc,char *argv[]) {
Line 206  main(int argc,char *argv[]) {
     exit(10);      exit(10);
   }    }
   
   /* Initialize kanlib (gc is also initialized) */  
   KSstart();  
   
   /* Main loop */    /* Main loop */
   printf("%s",Data_begin_v[View]);    printf("%s",Data_begin_v[View]);
Line 190  main(int argc,char *argv[]) {
Line 222  main(int argc,char *argv[]) {
   KSexecuteString(" [(parse) (ox.sm1) pushfile] extension ");    KSexecuteString(" [(parse) (ox.sm1) pushfile] extension ");
   if (Xm_noX) KSexecuteString(" /Xm_noX 1 def ");    if (Xm_noX) KSexecuteString(" /Xm_noX 1 def ");
   if (EngineLogToStdout) KSexecuteString(" /Xm_engineLogToStdout 1 def ");    if (EngineLogToStdout) KSexecuteString(" /Xm_engineLogToStdout 1 def ");
     if (LanguageResource != NULL) KSexecuteString(LanguageResource);
   startEngine(TM_Engine," ");    startEngine(TM_Engine," ");
   
   if (signal(SIGINT,SIG_IGN) != SIG_IGN) {    if (mysignal(SIGINT,SIG_IGN) != SIG_IGN) {
     signal(SIGINT,ctrlC);      mysignal(SIGINT,ctrlC);
   }    }
   
   irt = 0;    irt = 0;
Line 206  main(int argc,char *argv[]) {
Line 239  main(int argc,char *argv[]) {
         RestrictedMode = RestrictedMode_saved;          RestrictedMode = RestrictedMode_saved;
       }        }
       Calling_ctrlC_hook = 0;        Calling_ctrlC_hook = 0;
       if (signal(SIGINT,SIG_IGN) != SIG_IGN) {        if (mysignal(SIGINT,SIG_IGN) != SIG_IGN) {
         signal(SIGINT,ctrlC);          mysignal(SIGINT,ctrlC);
       }        }
       irt = 1;        irt = 1;
       continue;        continue;
Line 234  main(int argc,char *argv[]) {
Line 267  main(int argc,char *argv[]) {
     ob = KpoString(s);      ob = KpoString(s);
     KSpush(ob);      KSpush(ob);
     KSexecuteString(" oxsubmit ");      KSexecuteString(" oxsubmit ");
   
           if (TM_Engine == SM1) flushSm1();
   
     /* Get the result in string for cfep. */      /* Get the result in string for cfep. */
     if (View != V_TEXMACS) {      if (View != V_TEXMACS) {
Line 249  main(int argc,char *argv[]) {
Line 284  main(int argc,char *argv[]) {
         }          }
       }        }
       if (!TM_do_not_print) {        if (!TM_do_not_print) {
         KSexecuteString(" ox.engine oxpopstring ");          if (Format == 2) { /* png mode */
         r = KSpopString();            r = pngGetResult();
           }else{
             KSexecuteString(" ox.engine oxpopstring ");
             r = KSpopString();
           }
         printv(r);          printv(r);
       }else{        }else{
         KSexecuteString(" ox.engine 1 oxpops ");          KSexecuteString(" ox.engine 1 oxpops ");
Line 261  main(int argc,char *argv[]) {
Line 300  main(int argc,char *argv[]) {
       continue;        continue;
     }      }
     /* Get the result in string for texmacs  */      /* Get the result in string for texmacs  */
     if (Format == 1 && (! TM_do_not_print)) {      if ((Format == 1) && (! TM_do_not_print)) {
       /* translate to latex form */        /* translate to latex form */
       KSexecuteString(" ox.engine oxpushcmotag ox.engine oxpopcmo ");        KSexecuteString(" ox.engine oxpushcmotag ox.engine oxpopcmo ");
       ob = KSpop();        ob = KSpop();
Line 312  main(int argc,char *argv[]) {
Line 351  main(int argc,char *argv[]) {
   }    }
 }  }
   
   static char *pngGetResult(void) {
     struct object ob;
     int vmode;
     char *r;
     char *path;
   
     /* translate to latex form */
     KSexecuteString(" ox.engine oxpushcmotag ox.engine oxpopcmo ");
     ob = KSpop();
     vmode = 0;
     /* printf("id=%d\n",ob.tag); bug: matrix return 17 instead of Sinteger
        or error. */
     if (ob.tag == Sinteger) {
       /* printf("cmotag=%d\n",ob.lc.ival);*/
       if (ob.lc.ival == CMO_ERROR2) {
         vmode = 1;
       }
       if (ob.lc.ival == CMO_STRING) {
         vmode = 1;
       }
     }
     if (vmode) {
       KSexecuteString(" ox.engine oxpopstring ");
       r = KSpopString();
     }else{
       KSexecuteString(" ox.engine 1 oxpushcmo ox.engine (print_png_form2) oxexec  ");
       KSexecuteString(" ox.engine oxpopcmo /tmp_ox_texmacs set tmp_ox_texmacs 0 get ");
       r = KSpopString();  /* input form */
       KSexecuteString(" tmp_ox_texmacs 1 get ");
       path = KSpopString(); /* path name of the png file. */
       pngSendFile(path);
     }
     return r;
   }
   
 #define SB_SIZE 1024  #define SB_SIZE 1024
 #define INC_BUF     if (n >= limit-3) { \  #define INC_BUF     if (n >= limit-3) { \
       tmp = s; \        tmp = s; \
Line 376  static char *readString(FILE *fp, char *prolog, char *
Line 450  static char *readString(FILE *fp, char *prolog, char *
   }    }
   /* Check the escape sequence to change the global env. */    /* Check the escape sequence to change the global env. */
   if (strcmp(&(s[start]),"!verbatim;") == 0) {    if (strcmp(&(s[start]),"!verbatim;") == 0) {
     printv("Output mode is changed to verbatim mode.");      if (View != V_CFEP) printv("Output mode is changed to verbatim mode.");
     Format=0;      Format=0;
     return NULL;      return NULL;
   }    }
Line 385  static char *readString(FILE *fp, char *prolog, char *
Line 459  static char *readString(FILE *fp, char *prolog, char *
     Format = 1;      Format = 1;
     return NULL;      return NULL;
   }    }
     if (strcmp(&(s[start]),"!cfep_png;") == 0) {
           if (pngCheck()) {
             if (View != V_CFEP) printv("Output mode is changed to cfep_png/verbose.");
         Format = 2;
       } else pngNotAvailable();
       return NULL;
     }
   if (strcmp(&(s[start]),"!asir;") == 0) {    if (strcmp(&(s[start]),"!asir;") == 0) {
     Format=1;      Format=1;
     TM_Engine=ASIR; startEngine(TM_Engine,"Asir");      TM_Engine=ASIR; startEngine(TM_Engine,"Asir");
Line 408  static char *readString(FILE *fp, char *prolog, char *
Line 489  static char *readString(FILE *fp, char *prolog, char *
     return NULL;      return NULL;
   }    }
   
     /* remove end$ or end; */
     if (TM_Engine == ASIR) {
       for (i=n-1; i>=4; i--) {
             if ((s[i-4]=='\n') && (s[i-3]=='e') && (s[i-2]=='n') && (s[i-1]=='d') && (s[i]=='$')) {
           s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break;
         }
             if ((s[i-4]=='\n') && (s[i-3]=='e') && (s[i-2]=='n') && (s[i-1]=='d') && (s[i]==';')) {
           s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break;
         }
       }
     }
   
   /* Set TM_do_no_print */    /* Set TM_do_no_print */
   if (s[n-1] == '$' && TM_Engine == ASIR) {    if (s[n-1] == '$' && TM_Engine == ASIR) {
         TM_do_not_print = 1; s[n-1] = ' ';          TM_do_not_print = 1; s[n-1] = ' ';
Line 479  static void printCopyright(char *s) {
Line 572  static void printCopyright(char *s) {
   fflush(NULL);    fflush(NULL);
 }  }
   
   static void flushSm1() {
     KSexecuteString(" oxsm1.ccc ( [(flush)] extension pop ) oxsubmit ");
   }
 static int startEngine(int type,char *msg) {  static int startEngine(int type,char *msg) {
   struct object ob = OINIT;    struct object ob = OINIT;
   printf("%s",Data_begin_v[View]);    printf("%s",Data_begin_v[View]);
Line 489  static int startEngine(int type,char *msg) {
Line 585  static int startEngine(int type,char *msg) {
     KSexecuteString("  oxsm1.ccc ( [(cmoLispLike) 0] extension ) oxsubmit ");      KSexecuteString("  oxsm1.ccc ( [(cmoLispLike) 0] extension ) oxsubmit ");
     KSexecuteString("  oxsm1.ccc ( ox_server_mode ) oxsubmit ");      KSexecuteString("  oxsm1.ccc ( ox_server_mode ) oxsubmit ");
     KSexecuteString("  oxsm1.ccc ( ( ) message (------------- Message from sm1 ----------------)message ) oxsubmit ");      KSexecuteString("  oxsm1.ccc ( ( ) message (------------- Message from sm1 ----------------)message ) oxsubmit ");
           flushSm1();
     TM_sm1Started = 1;      TM_sm1Started = 1;
         /* Welcome message.  BUG. Copyright should be returned by a function. */          /* Welcome message.  BUG. Copyright should be returned by a function. */
     if (! NoCopyright) {      if (! NoCopyright) {
Line 498  static int startEngine(int type,char *msg) {
Line 595  static int startEngine(int type,char *msg) {
       printf("Info: http://www.math.kobe-u.ac.jp/KAN, kan@math.kobe-u.ac.jp.\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("0 usages to show a list of functions. \n(keyword) usages to see a short description\n");
     }      }
     printf("%s\n",msg);      printf("%s\n",msg); fflush(NULL);
   }else if (type == K0) {    }else if (type == K0) {
     if (!TM_k0Started) KSexecuteString(" k0connectr ");      if (!TM_k0Started) KSexecuteString(" k0connectr ");
     KSexecuteString(" /ox.engine oxk0.ccc def ");      KSexecuteString(" /ox.engine oxk0.ccc def ");
Line 523  static int startEngine(int type,char *msg) {
Line 620  static int startEngine(int type,char *msg) {
       }        }
     }      }
     /* Initialize the setting of asir. */      /* Initialize the setting of asir. */
     KSexecuteString(" oxasir.ccc (if(1) {  Xm_server_mode = 1; Xm_helpdir = \"help-eg\";  } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");      if (AsirInitFile) {  /* cf. asir-contrib/packages/src/cfep-init.rr */
             unsigned char *ss;
             ss = (unsigned char *)sGC_malloc(strlen(AsirInitFile)+256);
             sprintf((char *)ss," oxasir.ccc (load(\"%s\");) oxsubmit oxasir.ccc oxgeterrors length 0 gt { (Error in loading asirInitFile) message} { } ifelse ",AsirInitFile);
             /* printf("Loading --asirInitFile %s\n",AsirInitFile); */
             KSexecuteString(ss);
       }
       KSexecuteString(" oxasir.ccc (if(1) {  Xm_server_mode = 1; Xm_helpdir = \"help-en\";  } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");
     KSexecuteString(" oxasir.ccc (if(1) {  ctrl(\"message\",0);  } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");      KSexecuteString(" oxasir.ccc (if(1) {  ctrl(\"message\",0);  } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");
     /* bug; if ctrl is written with Xm_helpdir = ... without oxpopcmo, then it does      /* bug; if ctrl is written with Xm_helpdir = ... without oxpopcmo, then it does
        not work. */         not work. */
Line 554  static void myEncoder(int c) {
Line 658  static void myEncoder(int c) {
 }  }
 static void myEncoderS(unsigned char *s) {  static void myEncoderS(unsigned char *s) {
   int i,n;    int i,n;
   n = strlen(s);    n = strlen((char *)s);
   for (i = 0; i<n ; i++) myEncoder(s[i]);    for (i = 0; i<n ; i++) myEncoder(s[i]);
 }  }
 static void myEncoderSn(unsigned char *s,int n) {  static void myEncoderSn(unsigned char *s,int n) {
Line 569  static void outputStringToTunnel0(int channel, unsigne
Line 673  static void outputStringToTunnel0(int channel, unsigne
     for (i=0; i<n; i++) putchar(s[i]);      for (i=0; i<n; i++) putchar(s[i]);
     printf("%c>}",0);      printf("%c>}",0);
   }else if (view == V_CFEP) {    }else if (view == V_CFEP) {
     sprintf(ts,"{%d<%d ",channel,n+1);      sprintf((char *)ts,"{%d<%d ",channel,n+1);
     myEncoderS(ts);      myEncoderS(ts);
     myEncoderSn(s,n); myEncoder(0);      myEncoderSn(s,n); myEncoder(0);
     myEncoderS(">}");      myEncoderS((unsigned char *)">}");
   }    }
   fflush(stdout);    fflush(stdout);
 }  }
Line 590  static void outputStringToTunnel(int channel, unsigned
Line 694  static void outputStringToTunnel(int channel, unsigned
 }  }
   
   
   static void pngSendFile(char *path) {
     char s[1024];
     if (strlen(path) > 1000) return;
     sprintf(s,"showFile,%s",path);
     outputStringToTunnel0(10,(unsigned char *)s,strlen(s),View);
     printf("\n");
     fflush(NULL);
   }
   static int pngCheck(void) {
     static int checked = 0;
     static int ans = 0;
     if (checked) return ans;
     checked = 1;
     if (!getCommandPath("latex")) return 0;
     if (!getCommandPath("dvipng")) return 0;
     ans = 1;  return 1;
   }
   static void pngNotAvailable(void) {
     char *s = "notAvailable";
     outputStringToTunnel0(10,(unsigned char *)s,strlen(s),View);
     fflush(NULL);
   }
   

Legend:
Removed from v.1.28  
changed lines
  Added in v.1.40

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>