=================================================================== RCS file: /home/cvs/OpenXM/src/k097/d.c,v retrieving revision 1.9 retrieving revision 1.22 diff -u -p -r1.9 -r1.22 --- OpenXM/src/k097/d.c 2003/07/13 08:18:27 1.9 +++ OpenXM/src/k097/d.c 2021/03/12 06:45:55 1.22 @@ -1,13 +1,15 @@ -/* $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.21 2020/10/07 23:53:25 takayama Exp $ */ /* simple.c, 1996, 1/1 --- 1/5 */ #include #include #include #include +#include #include #include #include "d.h" #include "simple.tab.h" +#include "ox_pathfinder.h" #if defined(__CYGWIN__) #define JMP_BUF sigjmp_buf @@ -48,7 +50,7 @@ int Interactive = 1; static int isThereStdin(); #define MARK_CHAR 3 -main2(int argc, char *argv[]) { +void main2(int argc, char *argv[]) { FILE *f; FILE *outf; char name[1024]; @@ -78,7 +80,7 @@ main2(int argc, char *argv[]) { } } -repl(FILE *inFile,FILE *outFile) { +void repl(FILE *inFile,FILE *outFile) { int c; int t; Inop = newObject_d(); @@ -159,7 +161,7 @@ repl(FILE *inFile,FILE *outFile) { case INCREMENT: printf("\nKClex returns --- ++."); break; case DECREMENT: 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 MULTPUT: printf("\nKClex returns --- *=."); break; @@ -180,7 +182,7 @@ objectp newObject_d() { fprintf(stderr,"Error: No more memory in newObject_d().\n"); exit(10); } - obj->tag = Snull; + obj->tag = Snull; obj->attr = NULL; return(obj); } @@ -428,7 +430,7 @@ int KClex() { /*if (Mydebug) printf("identifier string=[%s]",name);*/ if (isdigit(name[0])) { /**************************** - /**case : machine integer. + **case : machine integer. KClval = newObject_d(); KClval->tag = Sinteger; sscanf(name,"%d",&(KClval->lc.ival));*************/ @@ -441,7 +443,7 @@ int KClex() { break; } /* else : Identifier case.*/ - if (d = isReserved(name)) { + if ((d = isReserved(name))) { if (Replace) printf0(name); return(d); } else { @@ -594,7 +596,7 @@ int KClex() { } -KCerror(char *s) /* You need this function. Otherwise, you get core. */ +int KCerror(char *s) /* You need this function. Otherwise, you get core. */ { K00recoverFromError(); fprintf(stderr,"\nSyntax Error in the line %d:%s\n",Linenumber,s); @@ -604,23 +606,23 @@ KCerror(char *s) /* You need this function. Otherwis ungetc(MARK_CHAR,stdin); while (fsgetc(Inop) > MARK_CHAR) ; } - return ; + return 0; LONGJMP(KCenvOfParser,2); exit(1); } -readcomment() { +int readcomment() { int c; while (1) { c = fsgetc(Inop); if (c == EOF) { fprintf(stderr,"%d: Unexpected end of file in a comment.\n",Linenumber); fsungetc(c,Inop); /* should change */ - return; + return 0; } if (c == '*') { c = fsgetc(Inop); - if (c == '/') return; + if (c == '/') return 0; } } } @@ -673,7 +675,7 @@ char *readstring() { } -readchar() { +int readchar() { int c; if (Replace) putchar0('\''); c = fsgetc(Inop); /* 'c.' '\.c' */ @@ -701,20 +703,20 @@ readchar() { return(c); } -putchar0(c) +void putchar0(c) int c; { if (c > 0) fputc(c,outfile); } -printf0(s) +void printf0(s) char *s; { int i = 0; while (s[i] != '\0') putchar0(s[i++]); } -printf1(s) +void printf1(s) char *s; { int i = 0; @@ -722,7 +724,7 @@ char *s; while (s[i] != '\0') putchar0(s[i++]); } -isReserved(s) +int isReserved(s) char *s; { char *r[] = {"auto","break","case","char","const","continue", @@ -759,7 +761,7 @@ char *s; } -shouldReplace(s) +int shouldReplace(s) char *s; { char *r[] = {"dummy"}; @@ -938,6 +940,7 @@ int fsgetc(objectp op) { int fsungetc(int c,objectp op) { fprintf(stderr,"Sorry. fsungetc has not yet implemented.\n"); + return -1; } void clearInop() { @@ -1020,7 +1023,7 @@ objectp checkIfTheFileExists(objectp op) { } } } - close(fp); + fclose(fp); op = newObject_d(); op->tag = Sstring; s = (char *)GC_malloc(sizeof(char)*(strlen(fname)+1)); @@ -1057,6 +1060,11 @@ void loadFileWithCpp(objectp op) char tmpName[1024]; int pid; objectp ob; + char *outfile; + char *cpp; + char *argv[10]; + int n; + char *sfile = NULL; if (op->tag != Sstring) { fprintf(stderr,"File name must be given as an argment of load.\n"); return; @@ -1067,21 +1075,53 @@ void loadFileWithCpp(objectp op) fprintf(stderr,"Too long file name.\n"); return; } - system("/bin/rm -f k00.cppload.tmp"); - /* Use gcc -v to know what symbols are defined. */ -#if defined(linux) || defined(__linux__) - strcpy(fname,"/lib/cpp -P -lang-c++ <"); + /* Use gcc -v to know what symbols are defined. + if defined(linux) || defined(__linux__) + Removed old codes. */ + + 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 - 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 - strcat(fname,op->lc.str); - strcat(fname," >k00.cppload.tmp"); - system(fname); + }else{ + argv[0] = cpp; + 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->tag = Sstring; - ob->lc.str = "k00.cppload.tmp"; + ob->lc.str = outfile; loadFile(ob); - system("/bin/rm -f k00.cppload.tmp"); + unlink(outfile); } void showStringBuff(objectp op) @@ -1099,7 +1139,7 @@ void showStringBuff(objectp op) if (K00_verbose) { fprintf(stderr,"stringBuff ptr = %d, ",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) { fprintf(stderr," ; was expected.\n"); @@ -1114,214 +1154,7 @@ 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 *p; - p = get_k0_lib_path(); - if (p == NULL) { - return("/usr/local/lib/kxx97/yacc/"); - }else{ - return p; - } + return getLOAD_K_PATH2(); }