version 1.38, 2015/10/10 11:29:46 |
version 1.46, 2019/09/25 06:29:10 |
|
|
/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.37 2015/10/08 11:49:38 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kxx/ox_texmacs.c,v 1.45 2019/05/24 02:25:12 takayama Exp $ */ |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
|
/* |
/* |
#define DEBUG |
#define DEBUG |
*/ |
*/ |
/* #define DEBUG2 */ |
|
|
|
|
#define DEBUG2 |
|
|
|
|
/* Type of View part (user interface engine) */ |
/* Type of View part (user interface engine) */ |
#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 |
|
#define V_SAGE 4 |
|
#define V_JUPYTER 5 |
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. */ |
|
"", |
|
"", /* SAGE */ |
|
"\n" |
}; |
}; |
|
|
/* todo: start_of_input */ |
/* todo: start_of_input */ |
Line 61 char *Data_end[] = { |
|
Line 81 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, |
|
'\n', /* SAGE cf. __init__ */ |
|
'\n' |
}; |
}; |
|
|
|
/* Note! if you give more than 10 Views, increase the number 10 below. |
|
See the option --prompt which should be given after --view is set. |
|
*/ |
|
char *Prompt[10]={ |
|
"generic>", /* generic */ |
|
"", /* texmacs */ |
|
"", /* cfep */ |
|
"", /* qfep */ |
|
"\nasir>", /* SAGE */ |
|
"\nPEXPECT_PROMPT>" |
|
}; |
|
|
|
|
/* Table for the engine type. */ |
/* Table for the engine type. */ |
#define ASIR 1 |
#define ASIR 1 |
#define SM1 2 |
#define SM1 2 |
Line 91 int EngineLogToStdout = 0; /* Do not run the ox engi |
|
Line 127 int EngineLogToStdout = 0; /* Do not run the ox engi |
|
char *AsirInitFile = NULL; |
char *AsirInitFile = NULL; |
|
|
char *LanguageResource = NULL; |
char *LanguageResource = NULL; |
|
int TM_quiet = 0; |
|
|
void ctrlC(); |
void ctrlC(); |
struct object KpoString(char *s); |
struct object KpoString(char *s); |
Line 106 static int startEngine(int type,char *msg); |
|
Line 143 static int startEngine(int type,char *msg); |
|
static int isPS(char *s); |
static int isPS(char *s); |
static int end_of_input(int c); |
static int end_of_input(int c); |
static void setDefaultParameterForCfep(); |
static void setDefaultParameterForCfep(); |
|
static void setDefaultParameterForSage(); |
|
static void setDefaultParameterForJupyter(); |
|
|
static void myEncoder(int c); |
static void myEncoder(int c); |
static void myEncoderS(unsigned char *s); |
static void myEncoderS(unsigned char *s); |
Line 119 static void pngNotAvailable(void); |
|
Line 158 static void pngNotAvailable(void); |
|
static char *pngGetResult(); |
static char *pngGetResult(); |
|
|
static void flushSm1(); |
static void flushSm1(); |
|
static int is_substr_of(char a[],char s[]); |
|
static void hexout(FILE *fp,char s[]); |
|
static int mystrncmp(char a[],char s[]); |
|
|
|
|
/* 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 142 main(int argc,char *argv[]) { |
|
Line 185 main(int argc,char *argv[]) { |
|
#ifdef DEBUG2 |
#ifdef DEBUG2 |
Dfp = fopen("/tmp/debug-texmacs.txt","w"); |
Dfp = fopen("/tmp/debug-texmacs.txt","w"); |
#endif |
#endif |
|
|
/* Initialize kanlib (gc is also initialized) */ |
|
KSstart(); |
|
|
|
|
TM_quiet=0; |
|
for (i=1; i<argc; i++) { |
|
if (strcmp(argv[i],"--quiet")==0) { |
|
TM_quiet=1; |
|
} |
|
} |
|
/* Initialize kanlib (gc is also initialized) */ |
|
if (TM_quiet) { |
|
KSstart_quiet(); |
|
}else{ |
|
KSstart(); |
|
} |
/* Set consts */ |
/* Set consts */ |
Quiet = 1; |
Quiet = 1; |
for (i=1; i<argc; i++) { |
for (i=1; i<argc; i++) { |
Line 155 main(int argc,char *argv[]) { |
|
Line 207 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 if (strcmp(argv[i],"sage")==0) { |
|
View = V_SAGE; setDefaultParameterForSage(); |
|
}else if (strcmp(argv[i],"jupyter")==0) { |
|
View = V_JUPYTER; setDefaultParameterForJupyter(); |
}else{ |
}else{ |
View = GENERIC; |
View = GENERIC; |
/* printv("Unknown view type.\n"); */ |
/* printv("Unknown view type.\n"); */ |
Line 185 main(int argc,char *argv[]) { |
|
Line 243 main(int argc,char *argv[]) { |
|
i++; |
i++; |
AsirInitFile = (char *)sGC_malloc(strlen(argv[i])+80); |
AsirInitFile = (char *)sGC_malloc(strlen(argv[i])+80); |
sprintf(AsirInitFile,"%s",argv[i]); |
sprintf(AsirInitFile,"%s",argv[i]); |
|
}else if (strcmp(argv[i],"--quiet") == 0) { |
|
/* it is already set. Ignore. */ |
|
}else if (strcmp(argv[i],"--prompt")==0) { |
|
i++; |
|
Prompt[View] = (char *)sGC_malloc(strlen(argv[i])+2); |
|
strcpy(Prompt[View],argv[i]); |
}else{ |
}else{ |
/* printv("Unknown option\n"); */ |
/* printv("Unknown option\n"); */ |
} |
} |
Line 216 main(int argc,char *argv[]) { |
|
Line 280 main(int argc,char *argv[]) { |
|
if (LanguageResource != NULL) KSexecuteString(LanguageResource); |
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 230 main(int argc,char *argv[]) { |
|
Line 294 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; |
} else { } |
} else { } |
if (!irt) { |
if (!irt) { |
printf("%s",Data_end[View]); fflush(stdout); |
if (View != V_SAGE) printf("%s",Data_end[View]); fflush(stdout); |
} |
} |
irt = 0; |
irt = 0; |
|
|
/* Reading the input. */ |
/* Reading the input. */ |
|
if ((View == V_SAGE) || (View == V_JUPYTER)) { |
|
if (s != NULL) {printf("%s",Prompt[View]); fflush(stdout);} |
|
else {printf("%s",&(Prompt[View][1])); fflush(stdout);} |
|
}else{ |
|
printf("%s",Prompt[View]); fflush(stdout); |
|
} |
if (TM_Engine == K0) { |
if (TM_Engine == K0) { |
s=readString(stdin, " ", " "); /* see test data */ |
s=readString(stdin, " ", " "); /* see test data */ |
}else if (TM_Engine == SM1) { |
}else if (TM_Engine == SM1) { |
Line 389 static char *pngGetResult(void) { |
|
Line 459 static char *pngGetResult(void) { |
|
strcpy(s,tmp); \ |
strcpy(s,tmp); \ |
} |
} |
/* */ |
/* */ |
|
static char *Sss=NULL; |
|
static int Sss_size=10240; |
|
|
static char *readString(FILE *fp, char *prolog, char *epilog) { |
static char *readString(FILE *fp, char *prolog, char *epilog) { |
int n = 0; |
int n = 0; |
static int limit = 0; |
static int limit = 0; |
Line 415 static char *readString(FILE *fp, char *prolog, char * |
|
Line 488 static char *readString(FILE *fp, char *prolog, char * |
|
start = n; |
start = n; |
while ((c = fgetc(fp)) != EOF) { |
while ((c = fgetc(fp)) != EOF) { |
#ifdef DEBUG2 |
#ifdef DEBUG2 |
fprintf(Dfp,"[%x] ",c); fflush(Dfp); |
fprintf(Dfp,"[%x]%c ",c,c); fflush(Dfp); |
#endif |
#endif |
if (end_of_input(c)) { |
if (end_of_input(c)) { |
/* If there remains data in the stream, |
/* If there remains data in the stream, |
read the remaining data. (for debug) */ |
read the remaining data. (for debug) */ |
/* |
/* |
if (oxSocketSelect0(0,1)) { |
if ((View == V_JUPYTER) || (View == V_SAGE)) { |
if (c == '\n') c=' '; |
if (oxSocketSelect0(0,1)) { |
|
#ifdef DEBUG2 |
|
fprintf(Dfp,"<%x>%c ",c,c); fflush(Dfp); |
|
#endif |
|
if (c == '\n') c=' '; |
|
s[n++] = c; s[n] = 0; m++; |
|
INC_BUF ; |
|
continue; |
|
} |
|
} |
|
*/ |
|
if (View == V_JUPYTER) { |
s[n++] = c; s[n] = 0; m++; |
s[n++] = c; s[n] = 0; m++; |
INC_BUF ; |
INC_BUF ; |
continue; |
|
} |
} |
*/ |
|
break; |
break; |
} |
} |
if ( c == '\v') c=' '; |
if ( c == '\v') c=' '; |
s[n++] = c; s[n] = 0; m++; |
s[n++] = c; s[n] = 0; m++; |
INC_BUF ; |
INC_BUF ; |
} |
} |
|
if ((c == EOF) && (start == n)) exit(0); |
/* Check the escape sequence */ |
/* Check the escape sequence */ |
if (strcmp(&(s[start]),"!quit;") == 0) { |
if (mystrncmp(&(s[start]),"!quit;") == 0) { |
printv("Terminated the process ox_texmacs.\n"); |
printv("Terminated the process ox_texmacs.\n"); |
exit(0); |
exit(0); |
} |
} |
|
if (((View == V_JUPYTER) || (View == V_SAGE)) && |
|
((mystrncmp(&(s[start]),"quit")==0) || (mystrncmp(&(s[start]),"quit()")==0))) { |
|
printv("Terminated the process ox_texmacs.\n"); |
|
exit(0); |
|
} |
|
if ((View == V_JUPYTER) && |
|
(mystrncmp(&(s[start]),"version")==0)) { |
|
strcpy(&(s[start]),"version"); |
|
s[n=strlen(s)]='('; s[++n]=0; INC_BUF; |
|
s[n++]=')'; s[n]=0; INC_BUF; |
|
} |
/* 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) { |
if (View != V_CFEP) printv("Output mode is changed to verbatim mode."); |
if (View != V_CFEP) printv("Output mode is changed to verbatim mode."); |
Line 490 static char *readString(FILE *fp, char *prolog, char * |
|
Line 584 static char *readString(FILE *fp, char *prolog, char * |
|
s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break; |
s[i-3] = s[i-2] = s[i-1] = s[i] = ' '; break; |
} |
} |
} |
} |
|
|
|
/* 2019.03.28 for jupyter */ |
|
if ((View == V_JUPYTER) && (mystrncmp(&(s[start]),"base_prompt") != 0) |
|
&&(mystrncmp(&(s[start]),"version()") != 0)) { |
|
if (Sss == NULL) { |
|
Sss = (char *)sGC_malloc(Sss_size); |
|
Sss[0] = 0; |
|
} |
|
if (Sss_size < strlen(Sss)+strlen(s)+strlen(epilog)-10) { |
|
Sss_size = 2*Sss_size; |
|
if (Sss_size < 0) { fprintf(stderr,"Fatal error: too big string\n"); exit(-1); } |
|
char *sss_tmp = (char *)sGC_malloc(Sss_size); |
|
strcpy(sss_tmp,Sss); |
|
Sss=sss_tmp; |
|
} |
|
strcpy(&(Sss[strlen(Sss)]),&(s[start])); |
|
for (i=strlen(Sss); i>=0; i--) { |
|
if (Sss[i] < 0x20) continue; |
|
if ((Sss[i] == ';') && (Sss[i-1] == ';')) { |
|
/* construct s and return s */ |
|
Sss[i] = ' '; |
|
s = (char *) sGC_malloc(strlen(Sss)+strlen(prolog)+strlen(epilog)+10); |
|
sprintf(s,"%s%s%s",prolog,Sss,epilog); |
|
Sss[0]=0; |
|
#ifdef DEBUG2 |
|
fprintf(Dfp,"#By Sss: %s#\n",s); fflush(Dfp); |
|
#endif |
|
return s; |
|
}else break; |
|
} |
|
return NULL; |
|
} |
|
}else{ |
|
#ifdef DEBUG2 |
|
fprintf(Dfp,"#base_prompt or version()#\n",s); fflush(Dfp); |
|
#endif |
} |
} |
|
/* end 2019.03.28 for jupyter. */ |
|
|
/* Set TM_do_no_print */ |
/* Set TM_do_no_print */ |
if (s[n-1] == '$' && TM_Engine == ASIR) { |
if (s[n-1] == '$' && TM_Engine == ASIR) { |
Line 503 static char *readString(FILE *fp, char *prolog, char * |
|
Line 634 static char *readString(FILE *fp, char *prolog, char * |
|
s[n++] = epilog[i]; s[n] = 0; |
s[n++] = epilog[i]; s[n] = 0; |
INC_BUF ; |
INC_BUF ; |
} |
} |
|
#ifdef DEBUG2 |
|
fprintf(Dfp,"#By normal readString:%s\n",s); hexout(Dfp,s); fprintf(Dfp,"\n"); fflush(Dfp); |
|
#endif |
return s; |
return s; |
} |
} |
|
|
Line 514 static int end_of_input(int c) { |
|
Line 648 static int end_of_input(int c) { |
|
static void setDefaultParameterForCfep() { |
static void setDefaultParameterForCfep() { |
Format = 0; |
Format = 0; |
} |
} |
|
static void setDefaultParameterForSage() { |
|
Format = 0; |
|
} |
|
static void setDefaultParameterForJupyter() { |
|
Format = 0; |
|
} |
|
|
static void printv(char *s) { |
static void printv(char *s) { |
int i; |
int i; |
Line 521 static void printv(char *s) { |
|
Line 661 static void printv(char *s) { |
|
printf("%s",s); |
printf("%s",s); |
printf("%s",Data_end[View]); |
printf("%s",Data_end[View]); |
#ifdef DEBUG2 |
#ifdef DEBUG2 |
fprintf(Dfp,"<%s>",s); fflush(Dfp); |
fprintf(Dfp,"printv:<%s>",s); fflush(Dfp); |
#endif |
#endif |
fflush(NULL); |
fflush(NULL); |
} |
} |
Line 552 static void printp(char *s) { |
|
Line 692 static void printp(char *s) { |
|
fflush(NULL); |
fflush(NULL); |
} |
} |
static void printCopyright(char *s) { |
static void printCopyright(char *s) { |
printf("%s",Data_begin_v[View]); |
|
if (! NoCopyright) { |
if (! NoCopyright) { |
|
printf("%s",Data_begin_v[View]); |
printf("OpenXM engine (ox engine) interface with TeXmacs protocol.\n2004 (C) openxm.org"); |
printf("OpenXM engine (ox engine) interface with TeXmacs protocol.\n2004 (C) openxm.org"); |
printf(" under the BSD license. !asir; !sm1; !k0; !verbatim; !quit;\n"); |
printf(" under the BSD license. !asir; !sm1; !k0; !verbatim; !quit;\n"); |
printf("Type in !reset; when the engine gets confused. "); |
printf("Type in !reset; when the engine gets confused. "); |
printf("%s",s); |
printf("%s",s); |
|
printf("%s",Data_end[View]); |
} |
} |
printf("%s",Data_end[View]); |
|
fflush(NULL); |
fflush(NULL); |
} |
} |
|
|
Line 568 static void flushSm1() { |
|
Line 708 static void flushSm1() { |
|
} |
} |
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]); |
if (!TM_quiet) printf("%s",Data_begin_v[View]); |
if (type == SM1) { |
if (type == SM1) { |
if (!TM_sm1Started) KSexecuteString(" sm1connectr "); |
if (!TM_sm1Started) KSexecuteString(" sm1connectr "); |
KSexecuteString(" /ox.engine oxsm1.ccc def "); |
KSexecuteString(" /ox.engine oxsm1.ccc def "); |
Line 624 static int startEngine(int type,char *msg) { |
|
Line 764 static int startEngine(int type,char *msg) { |
|
not work. */ |
not work. */ |
KSexecuteString(" oxasir.ccc (print(\"----------- Messages from asir ------------------------------\")$ ) oxsubmit oxasir.ccc oxpopcmo "); |
KSexecuteString(" oxasir.ccc (print(\"----------- Messages from asir ------------------------------\")$ ) oxsubmit oxasir.ccc oxpopcmo "); |
} |
} |
printf("%s",Data_end[View]); |
if (!TM_quiet) printf("%s",Data_end[View]); |
fflush(NULL); |
fflush(NULL); |
} |
} |
|
|
Line 708 static void pngNotAvailable(void) { |
|
Line 848 static void pngNotAvailable(void) { |
|
fflush(NULL); |
fflush(NULL); |
} |
} |
|
|
|
/* Check if a is a substring of s */ |
|
static int is_substr_of(char a[],char s[]) { |
|
int n,m,i,j; |
|
n = strlen(s); |
|
m = strlen(a); |
|
for (i=0; i<n-m; i++) { |
|
for (j=0; j<m; j++) { |
|
if (s[i+j] != a[j]) break; |
|
if (j == m-1) return 1; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
|
static void hexout(FILE *fp,char s[]) { |
|
int i; |
|
for (i=0; i<strlen(s); i++) fprintf(fp,"%2x ",(unsigned char)s[i]); |
|
} |
|
static int mystrncmp(char a[],char s[]) { |
|
int r; |
|
r=strncmp(a,s,strlen(s)); |
|
#ifdef DEBUG2 |
|
fprintf(Dfp,"mystrncmp(%s,%s)=%d\n",a,s,r); fflush(Dfp); |
|
#endif |
|
return r; |
|
} |
|
|