=================================================================== RCS file: /home/cvs/OpenXM/src/k097/d.c,v retrieving revision 1.1 retrieving revision 1.21 diff -u -p -r1.1 -r1.21 --- OpenXM/src/k097/d.c 1999/10/08 02:12:14 1.1 +++ OpenXM/src/k097/d.c 2020/10/07 23:53:25 1.21 @@ -1,18 +1,32 @@ +/* $OpenXM: OpenXM/src/k097/d.c,v 1.20 2018/11/02 01:33:26 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 +#define SETJMP(env) sigsetjmp(env,1) +#define LONGJMP(env,p) siglongjmp(env,p) +#else +#define JMP_BUF jmp_buf +#define SETJMP(env) setjmp(env) +#define LONGJMP(env,p) longjmp(env,p) +#endif -jmp_buf KCenvOfParser; +JMP_BUF KCenvOfParser; int DebugMode = 1; extern int K00_verbose; -static FILE *outfile = stdout; +static FILE *outfile; int Linenumber = 0; objectp Inop = (objectp) NULL; /* Input stream */ int Saki = 0; /* Look a head */ @@ -33,7 +47,10 @@ int Debug2 = 0; int Interactive = 1; -main2(int argc, char *argv[]) { +static int isThereStdin(); +#define MARK_CHAR 3 + +void main2(int argc, char *argv[]) { FILE *f; FILE *outf; char name[1024]; @@ -63,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(); @@ -144,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; @@ -165,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); } @@ -579,27 +596,33 @@ 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); - showStringBuff(Inop); return ; - longjmp(KCenvOfParser,2); + showStringBuff(Inop); + /* Clean the junks. Try load("debug/buggy.k"); */ + if (isThereStdin()) { + ungetc(MARK_CHAR,stdin); + while (fsgetc(Inop) > MARK_CHAR) ; + } + 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; } } } @@ -652,7 +675,7 @@ char *readstring() { } -readchar() { +int readchar() { int c; if (Replace) putchar0('\''); c = fsgetc(Inop); /* 'c.' '\.c' */ @@ -680,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; @@ -701,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", @@ -738,7 +761,7 @@ char *s; } -shouldReplace(s) +int shouldReplace(s) char *s; { char *r[] = {"dummy"}; @@ -876,6 +899,15 @@ static int popFile() { return(Saki); } +static int isThereStdin() { + if (Stackp > 1 && (InopStack[1])->tag == Sfile + && (InopStack[1])->lc.file == stdin) { + return(1); + }else{ + return(0); + } +} + int fsgetc(objectp op) { struct stringBuf *obuf; char *str; @@ -960,19 +992,22 @@ void parseAstring(char *s) } -void loadFile(objectp op) -{ +objectp checkIfTheFileExists(objectp op) { FILE *fp; char fname[1024]; + char *s; + objectp nullObj; + nullObj = NULL; if (op->tag != Sstring) { fprintf(stderr,"File name must be given as an argment of load.\n"); - return; + return nullObj; } - if (strlen(op->lc.str) > 1000) { + if (strlen(op->lc.str) > 800) { fprintf(stderr,"Too long file name.\n"); - return; + return nullObj; } - fp = fopen(op->lc.str,"r"); + strcpy(fname,op->lc.str); + fp = fopen(fname,"r"); if (fp == (FILE *)NULL) { strcpy(fname,getLOAD_K_PATH()); strcat(fname,op->lc.str); @@ -982,11 +1017,36 @@ void loadFile(objectp op) strcat(fname,op->lc.str); fp = fopen(fname,"r"); if (fp == (FILE *)NULL) { - fprintf(stderr,"Cannot open the file <<%s>> for loading in the current directory nor the library directories %s and %s.\n",op->lc.str,getLOAD_K_PATH(),LOAD_K_PATH); - return; + fprintf(stderr,"Cannot open the file <<%s>> for loading in the current directory nor the library directories %s and %s.\n",op->lc.str,getLOAD_K_PATH(),LOAD_K_PATH); + return nullObj; } } } + fclose(fp); + op = newObject_d(); + op->tag = Sstring; + s = (char *)GC_malloc(sizeof(char)*(strlen(fname)+1)); + if (s == NULL) fprintf(stderr,"No more memory.\n"); + strcpy(s,fname); + op->lc.str = s; + return(op); +} + +void loadFile(objectp op) +{ + FILE *fp; + char fname[1024]; + if (op->tag != Sstring) { + fprintf(stderr,"File name must be given as an argment of load.\n"); + return; + } + op = checkIfTheFileExists(op); + if (op == NULL) return; + if (strlen(op->lc.str) > 1000) { + fprintf(stderr,"Too long file name.\n"); + return; + } + fp = fopen(op->lc.str,"r"); if (K00_verbose) fprintf(stderr,"Reading the file <<%s>>... ",op->lc.str); parseAfile(fp); if (K00_verbose) fprintf(stderr,"\nClosed the file <<%s>>.\n",op->lc.str); @@ -996,24 +1056,71 @@ void loadFileWithCpp(objectp op) { FILE *fp; char fname[1024]; + 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; } + op = checkIfTheFileExists(op); + if (op == NULL) return; if (strlen(op->lc.str) > 900) { fprintf(stderr,"Too long file name.\n"); return; } - system("/bin/rm -f k00.cppload.tmp"); - strcpy(fname,"/lib/cpp -P -lang-c++ <"); - strcat(fname,op->lc.str); - strcat(fname," >k00.cppload.tmp"); - system(fname); + /* 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 + argv[0] = cpp; + argv[1] = "-P"; + argv[2] = "-lang-c++"; + argv[3] = sfile; + argv[4] = outfile; + argv[5] = NULL; +#endif + }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); + unlink(outfile); } void showStringBuff(objectp op) @@ -1031,7 +1138,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"); @@ -1045,20 +1152,8 @@ void showStringBuff(objectp op) fprintf(stderr,"\n"); } + + char *getLOAD_K_PATH() { - char *p; - char *p2; - p = getenv("LOAD_K_PATH"); - if (p == NULL) { - return("/usr/local/lib/kxx97/yacc/"); - }else{ - if (strlen(p) == 0) return(p); - if (p[strlen(p)-1] == '/') return(p); - /* Add / */ - p2 = (char *) malloc(sizeof(char)*(strlen(p)+3)); - if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } - strcpy(p2,p); strcat(p2,"/"); - return(p2); - } + return getLOAD_K_PATH2(); } -