[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.34

version 1.28, 2006/02/02 07:07:22 version 1.34, 2006/03/22 00:52:55
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.33 2006/03/06 08:55:31 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__)
 #define JMP_BUF sigjmp_buf  #define JMP_BUF sigjmp_buf
Line 72  extern int Quiet;
Line 73  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 88  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 113  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 134  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 160  main(int argc,char *argv[]) {
Line 173  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 190  main(int argc,char *argv[]) {
Line 212  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 (signal(SIGINT,SIG_IGN) != SIG_IGN) {
Line 234  main(int argc,char *argv[]) {
Line 257  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 274  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 290  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 341  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 440  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 449  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 479  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 562  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 575  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 585  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 610  static int startEngine(int type,char *msg) {
       }        }
     }      }
     /* Initialize the setting of asir. */      /* Initialize the setting of asir. */
       if (AsirInitFile) {  /* cf. asir-contrib/packages/src/cfep-init.rr */
             unsigned char *ss;
             ss = (unsigned char *)GC_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-eg\";  } else { ; } ;) oxsubmit oxasir.ccc oxpopcmo ");      KSexecuteString(" oxasir.ccc (if(1) {  Xm_server_mode = 1; Xm_helpdir = \"help-eg\";  } 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
Line 554  static void myEncoder(int c) {
Line 648  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 663  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 684  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.34

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