| version 1.9, 2003/07/13 08:18:27 |
version 1.21, 2020/10/07 23:53:25 |
|
|
| /* $OpenXM: OpenXM/src/k097/d.c,v 1.8 2002/02/24 10:27:21 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/k097/d.c,v 1.20 2018/11/02 01:33:26 takayama Exp $ */ |
| /* simple.c, 1996, 1/1 --- 1/5 */ |
/* simple.c, 1996, 1/1 --- 1/5 */ |
| #include <stdio.h> |
#include <stdio.h> |
| #include <ctype.h> |
#include <ctype.h> |
| #include <setjmp.h> |
#include <setjmp.h> |
| #include <stdlib.h> |
#include <stdlib.h> |
| |
#include <unistd.h> |
| #include <sys/types.h> |
#include <sys/types.h> |
| #include <sys/stat.h> |
#include <sys/stat.h> |
| #include "d.h" |
#include "d.h" |
| #include "simple.tab.h" |
#include "simple.tab.h" |
| |
#include "ox_pathfinder.h" |
| |
|
| #if defined(__CYGWIN__) |
#if defined(__CYGWIN__) |
| #define JMP_BUF sigjmp_buf |
#define JMP_BUF sigjmp_buf |
| Line 48 int Interactive = 1; |
|
| Line 50 int Interactive = 1; |
|
| static int isThereStdin(); |
static int isThereStdin(); |
| #define MARK_CHAR 3 |
#define MARK_CHAR 3 |
| |
|
| main2(int argc, char *argv[]) { |
void main2(int argc, char *argv[]) { |
| FILE *f; |
FILE *f; |
| FILE *outf; |
FILE *outf; |
| char name[1024]; |
char name[1024]; |
| Line 78 main2(int argc, char *argv[]) { |
|
| Line 80 main2(int argc, char *argv[]) { |
|
| } |
} |
| } |
} |
| |
|
| repl(FILE *inFile,FILE *outFile) { |
void repl(FILE *inFile,FILE *outFile) { |
| int c; |
int c; |
| int t; |
int t; |
| Inop = newObject_d(); |
Inop = newObject_d(); |
| Line 159 repl(FILE *inFile,FILE *outFile) { |
|
| Line 161 repl(FILE *inFile,FILE *outFile) { |
|
| case INCREMENT: printf("\nKClex returns --- ++."); break; |
case INCREMENT: printf("\nKClex returns --- ++."); break; |
| case DECREMENT: printf("\nKClex returns --- --."); break; |
case DECREMENT: printf("\nKClex returns --- --."); break; |
| case MEMBER: printf("\nKClex returns --- ->."); break; |
case MEMBER: printf("\nKClex returns --- ->."); break; |
| case RESIDUEPUT: printf("\nKClex returns --- %=."); break; |
case RESIDUEPUT: printf("\nKClex returns --- %%=."); break; |
| case NEGATEPUT: printf("\nKClex returns --- ^=."); break; |
case NEGATEPUT: printf("\nKClex returns --- ^=."); break; |
| case MULTPUT: printf("\nKClex returns --- *=."); break; |
case MULTPUT: printf("\nKClex returns --- *=."); break; |
| |
|
| Line 180 objectp newObject_d() { |
|
| Line 182 objectp newObject_d() { |
|
| fprintf(stderr,"Error: No more memory in newObject_d().\n"); |
fprintf(stderr,"Error: No more memory in newObject_d().\n"); |
| exit(10); |
exit(10); |
| } |
} |
| obj->tag = Snull; |
obj->tag = Snull; obj->attr = NULL; |
| return(obj); |
return(obj); |
| } |
} |
| |
|
|
|
| |
|
| } |
} |
| |
|
| KCerror(char *s) /* You need this function. Otherwise, you get core. */ |
int KCerror(char *s) /* You need this function. Otherwise, you get core. */ |
| { |
{ |
| K00recoverFromError(); |
K00recoverFromError(); |
| fprintf(stderr,"\nSyntax Error in the line %d:%s\n",Linenumber,s); |
fprintf(stderr,"\nSyntax Error in the line %d:%s\n",Linenumber,s); |
| Line 604 KCerror(char *s) /* You need this function. Otherwis |
|
| Line 606 KCerror(char *s) /* You need this function. Otherwis |
|
| ungetc(MARK_CHAR,stdin); |
ungetc(MARK_CHAR,stdin); |
| while (fsgetc(Inop) > MARK_CHAR) ; |
while (fsgetc(Inop) > MARK_CHAR) ; |
| } |
} |
| return ; |
return 0; |
| LONGJMP(KCenvOfParser,2); |
LONGJMP(KCenvOfParser,2); |
| exit(1); |
exit(1); |
| } |
} |
| |
|
| readcomment() { |
int readcomment() { |
| int c; |
int c; |
| while (1) { |
while (1) { |
| c = fsgetc(Inop); |
c = fsgetc(Inop); |
| if (c == EOF) { |
if (c == EOF) { |
| fprintf(stderr,"%d: Unexpected end of file in a comment.\n",Linenumber); |
fprintf(stderr,"%d: Unexpected end of file in a comment.\n",Linenumber); |
| fsungetc(c,Inop); /* should change */ |
fsungetc(c,Inop); /* should change */ |
| return; |
return 0; |
| } |
} |
| if (c == '*') { |
if (c == '*') { |
| c = fsgetc(Inop); |
c = fsgetc(Inop); |
| if (c == '/') return; |
if (c == '/') return 0; |
| } |
} |
| } |
} |
| } |
} |
| Line 673 char *readstring() { |
|
| Line 675 char *readstring() { |
|
| } |
} |
| |
|
| |
|
| readchar() { |
int readchar() { |
| int c; |
int c; |
| if (Replace) putchar0('\''); |
if (Replace) putchar0('\''); |
| c = fsgetc(Inop); /* 'c.' '\.c' */ |
c = fsgetc(Inop); /* 'c.' '\.c' */ |
|
|
| return(c); |
return(c); |
| } |
} |
| |
|
| putchar0(c) |
void putchar0(c) |
| int c; |
int c; |
| { |
{ |
| if (c > 0) fputc(c,outfile); |
if (c > 0) fputc(c,outfile); |
| } |
} |
| |
|
| printf0(s) |
void printf0(s) |
| char *s; |
char *s; |
| { |
{ |
| int i = 0; |
int i = 0; |
| while (s[i] != '\0') putchar0(s[i++]); |
while (s[i] != '\0') putchar0(s[i++]); |
| } |
} |
| |
|
| printf1(s) |
void printf1(s) |
| char *s; |
char *s; |
| { |
{ |
| int i = 0; |
int i = 0; |
|
|
| while (s[i] != '\0') putchar0(s[i++]); |
while (s[i] != '\0') putchar0(s[i++]); |
| } |
} |
| |
|
| isReserved(s) |
int isReserved(s) |
| char *s; |
char *s; |
| { |
{ |
| char *r[] = {"auto","break","case","char","const","continue", |
char *r[] = {"auto","break","case","char","const","continue", |
|
|
| |
|
| } |
} |
| |
|
| shouldReplace(s) |
int shouldReplace(s) |
| char *s; |
char *s; |
| { |
{ |
| char *r[] = {"dummy"}; |
char *r[] = {"dummy"}; |
| Line 1020 objectp checkIfTheFileExists(objectp op) { |
|
| Line 1022 objectp checkIfTheFileExists(objectp op) { |
|
| } |
} |
| } |
} |
| } |
} |
| close(fp); |
fclose(fp); |
| op = newObject_d(); |
op = newObject_d(); |
| op->tag = Sstring; |
op->tag = Sstring; |
| s = (char *)GC_malloc(sizeof(char)*(strlen(fname)+1)); |
s = (char *)GC_malloc(sizeof(char)*(strlen(fname)+1)); |
| Line 1057 void loadFileWithCpp(objectp op) |
|
| Line 1059 void loadFileWithCpp(objectp op) |
|
| char tmpName[1024]; |
char tmpName[1024]; |
| int pid; |
int pid; |
| objectp ob; |
objectp ob; |
| |
char *outfile; |
| |
char *cpp; |
| |
char *argv[10]; |
| |
int n; |
| |
char *sfile = NULL; |
| if (op->tag != Sstring) { |
if (op->tag != Sstring) { |
| fprintf(stderr,"File name must be given as an argment of load.\n"); |
fprintf(stderr,"File name must be given as an argment of load.\n"); |
| return; |
return; |
| Line 1067 void loadFileWithCpp(objectp op) |
|
| Line 1074 void loadFileWithCpp(objectp op) |
|
| fprintf(stderr,"Too long file name.\n"); |
fprintf(stderr,"Too long file name.\n"); |
| return; |
return; |
| } |
} |
| system("/bin/rm -f k00.cppload.tmp"); |
/* Use gcc -v to know what symbols are defined. |
| /* Use gcc -v to know what symbols are defined. */ |
if defined(linux) || defined(__linux__) |
| #if defined(linux) || defined(__linux__) |
Removed old codes. */ |
| strcpy(fname,"/lib/cpp -P -lang-c++ <"); |
|
| |
sfile = op->lc.str; |
| |
cpp = getCppPath(); |
| |
if (cpp == NULL) { |
| |
fprintf(stderr,"cpp is not found.\n"); return; |
| |
} |
| |
/* printf("%s\n",cpp); */ |
| |
outfile = generateTMPfileName("k0-cpp"); |
| |
if (outfile == NULL) { |
| |
fprintf(stderr,"Failed to generate a temporary file name.\n"); return; |
| |
} |
| |
/* printf("%s\n",outfile); */ |
| |
if ((char *)strstr(cpp,"/asir/bin/cpp.exe") == NULL) { |
| |
#if defined(__clang__) || defined(__FreeBSD__) |
| |
/* cpp of the FreeBSD is the cpp of the clang, but gcc is selected by configure. |
| |
echo | gcc -dM -E - |
| |
*/ |
| |
sprintf(tmpName,"cpp -E -P %s | sed -e 's/^#.*//g' >%s",sfile,outfile); |
| #else |
#else |
| strcpy(fname,"cpp -P -lang-c++ <"); |
argv[0] = cpp; |
| |
argv[1] = "-P"; |
| |
argv[2] = "-lang-c++"; |
| |
argv[3] = sfile; |
| |
argv[4] = outfile; |
| |
argv[5] = NULL; |
| #endif |
#endif |
| strcat(fname,op->lc.str); |
}else{ |
| strcat(fname," >k00.cppload.tmp"); |
argv[0] = cpp; |
| system(fname); |
argv[1] = "-P"; |
| |
argv[2] = cygwinPathToWinPath(sfile); |
| |
argv[3] = cygwinPathToWinPath(outfile); |
| |
argv[4] = NULL; |
| |
} |
| |
#if defined(__clang__) || defined(__FreeBSD__) |
| |
system(tmpName); |
| |
#else |
| |
n=oxForkExecBlocked(argv); |
| |
#endif |
| |
|
| ob = newObject_d(); |
ob = newObject_d(); |
| ob->tag = Sstring; |
ob->tag = Sstring; |
| ob->lc.str = "k00.cppload.tmp"; |
ob->lc.str = outfile; |
| loadFile(ob); |
loadFile(ob); |
| system("/bin/rm -f k00.cppload.tmp"); |
unlink(outfile); |
| } |
} |
| |
|
| void showStringBuff(objectp op) |
void showStringBuff(objectp op) |
| Line 1099 void showStringBuff(objectp op) |
|
| Line 1138 void showStringBuff(objectp op) |
|
| if (K00_verbose) { |
if (K00_verbose) { |
| fprintf(stderr,"stringBuff ptr = %d, ",ptr); |
fprintf(stderr,"stringBuff ptr = %d, ",ptr); |
| fprintf(stderr,"sb[ptr] = %x,%d",(sb->str)[ptr],(sb->str)[ptr]); |
fprintf(stderr,"sb[ptr] = %x,%d",(sb->str)[ptr],(sb->str)[ptr]); |
| fprintf(stderr,"Saki(yomi) = %x \n",Saki,Saki); |
fprintf(stderr,"Saki(yomi) = %x,%d \n",Saki,Saki); |
| } |
} |
| if (ptr == 0 && Saki == -1) { |
if (ptr == 0 && Saki == -1) { |
| fprintf(stderr," ; was expected.\n"); |
fprintf(stderr," ; was expected.\n"); |
| Line 1114 void showStringBuff(objectp op) |
|
| Line 1153 void showStringBuff(objectp op) |
|
| } |
} |
| |
|
| |
|
| /* Aux-functions for getLOAD_K_PATH(); */ |
|
| static int getOStypei(); |
|
| static char *getOStypes(); |
|
| static char *addSlash(); |
|
| static char *getOpenXM_HOME(); |
|
| static char *get_k0_lib_path(); |
|
| static void msg_get_home(int c,char *s); |
|
| static int getFileSize(char *s); |
|
| |
|
| static int Verbose_get_home = 0; |
|
| |
|
| #define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} |
|
| |
|
| static int getOStypei() { |
|
| /* |
|
| 0 unix |
|
| 1 windows-cygwin |
|
| 2 windows-cygwin-on-X |
|
| 3 windows-native |
|
| */ |
|
| int ostype; |
|
| char *s,*s2,*s3; |
|
| #if defined(__CYGWIN__) |
|
| ostype = 1; |
|
| #else |
|
| ostype = 0; |
|
| #endif |
|
| if (ostype == 0) return ostype; |
|
| /* Heuristic method */ |
|
| s = (char *)getenv("WINDOWID"); |
|
| if (s != NULL) { |
|
| return 2; |
|
| } |
|
| s = (char *)getenv("OSTYPE"); |
|
| s2 = (char *)getenv("MACHTYPE"); |
|
| s3 = (char *)getenv("PWD"); |
|
| if ((s != NULL) || (s2 != NULL) || (s3 != NULL)) { |
|
| return 1; |
|
| } |
|
| return 3; |
|
| } |
|
| |
|
| static char *getOStypes() { |
|
| int ostype; |
|
| ostype = getOStypei(); |
|
| |
|
| if (ostype == 1) { |
|
| return("Windows-cygwin"); |
|
| }else if (ostype == 2) { |
|
| return("Windows-cygwin-on-X"); |
|
| }else if (ostype == 3) { |
|
| return("Windows-native"); |
|
| }else{ |
|
| return("unix"); |
|
| } |
|
| } |
|
| |
|
| static int getFileSize(char *s) { |
|
| struct stat buf; |
|
| int m; |
|
| if (s == NULL) return -1; |
|
| m = stat(s,&buf); |
|
| if (m == -1) { |
|
| return -1; |
|
| /* fail */ |
|
| }else{ |
|
| /* success */ |
|
| return ((int) buf.st_size); |
|
| } |
|
| } |
|
| |
|
| static char *addSlash(char *p) { |
|
| char *p2; |
|
| if ((strlen(p) == 0) || (p == NULL)) return(p); |
|
| if (p[strlen(p)-1] == '/') return(p); |
|
| /* Add / */ |
|
| p2 = (char *) GC_malloc(sizeof(char)*(strlen(p)+3)); |
|
| if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
|
| strcpy(p2,p); strcat(p2,"/"); |
|
| return(p2); |
|
| |
|
| } |
|
| |
|
| static void msg_get_home(int t,char *s) { |
|
| extern int Verbose_get_home; |
|
| if (!Verbose_get_home) return; |
|
| if (t == 1) { |
|
| fprintf(stderr,"getOpenXM_HOME(): "); |
|
| }else if (t == 2) { |
|
| fprintf(stderr,"getServerEnv(): "); |
|
| }else if (t == 3) { |
|
| fprintf(stderr,"getOXenv(): "); |
|
| }else if (t == 4) { |
|
| fprintf(stderr,"for_cmd(): "); |
|
| }else{ |
|
| fprintf(stderr,"getting path...: "); |
|
| } |
|
| if (s != NULL) { |
|
| fprintf(stderr,"%s\n",s); |
|
| }else{ |
|
| fprintf(stderr," --NULL-- \n"); |
|
| } |
|
| } |
|
| |
|
| char *getOpenXM_HOME() { |
|
| char *p; |
|
| char *h; |
|
| p = getOStypes(); |
|
| msg_get_home(1,p); |
|
| |
|
| p = (char *) getenv("OpenXM_HOME"); |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM_HOME is not found."); |
|
| |
|
| p = (char *) getenv("OPENXM_HOME"); |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OPENXM_HOME is not found."); |
|
| |
|
| if (getOStypei() == 3) { /* cygwin-native */ |
|
| p = (char *) getenv("OpenXM_HOME_WIN"); |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM_HOME_WIN is not found."); |
|
| |
|
| p = (char *) getenv("OPENXMHOMEWIN"); |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OPENXMHOMEWIN is not found."); |
|
| } |
|
| |
|
| /* Try to find default directories */ |
|
| h = (char *)getenv("HOME"); |
|
| if (h != NULL) { |
|
| p = (char *)GC_malloc(strlen(h)+100); |
|
| if (p == NULL) { |
|
| fprintf(stderr,"No more memory.\n"); exit(100); |
|
| } |
|
| strcat(h,"/OpenXM"); |
|
| p = h; |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM is not found under the home directory."); |
|
| } |
|
| |
|
| if (getOStypei() != 3) { |
|
| p = "/usr/local/OpenXM"; |
|
| }else{ |
|
| p = "/cygdrive/c/usr/local/OpenXM"; |
|
| } |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM is not found under /usr/local"); |
|
| |
|
| if (getOStypei() != 0) { |
|
| p = "/cygdrive/c/OpenXM"; |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM is not found under c:\\"); |
|
| |
|
| p = "/cygdrive/c/OpenXM-win"; |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM-win is not found under c:\\"); |
|
| |
|
| p = "/cygdrive/c/Program Files/OpenXM"; |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM is not found under c:\\Program Files"); |
|
| |
|
| p = "/cygdrive/c/Program Files/OpenXM-win"; |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"OpenXM-win is not found under c:\\Program Files"); |
|
| |
|
| } |
|
| |
|
| msg_get_home(1,"Giving up!"); |
|
| return NULL; |
|
| |
|
| } |
|
| |
|
| static char *get_k0_lib_path() { |
|
| char *oxhome; |
|
| char *p; |
|
| |
|
| |
|
| p = (char *)getenv("LOAD_K_PATH"); |
|
| if (p != NULL) { |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,"LOAD_K0_PATH is not found."); |
|
| } |
|
| |
|
| oxhome = getOpenXM_HOME(); |
|
| if (oxhome == NULL) return (char *)NULL; |
|
| p = (char *) GC_malloc(strlen(oxhome)+100); |
|
| if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} |
|
| |
|
| strcpy(p,oxhome); |
|
| strcat(p,"lib/k097"); |
|
| if (getFileSize(p) != -1) return addSlash(p); |
|
| msg_get_home(1,oxhome); |
|
| msg_get_home(1," is found, but "); |
|
| msg_get_home(1,p); |
|
| msg_get_home(1," is not found."); |
|
| |
|
| msg_get_home(1,"Giving up!"); |
|
| return NULL; |
|
| } |
|
| |
|
| |
|
| char *getLOAD_K_PATH() { |
char *getLOAD_K_PATH() { |
| char *p; |
return getLOAD_K_PATH2(); |
| p = get_k0_lib_path(); |
|
| if (p == NULL) { |
|
| return("/usr/local/lib/kxx97/yacc/"); |
|
| }else{ |
|
| return p; |
|
| } |
|
| } |
} |