=================================================================== RCS file: /home/cvs/OpenXM/src/k097/d.c,v retrieving revision 1.10 retrieving revision 1.22 diff -u -p -r1.10 -r1.22 --- OpenXM/src/k097/d.c 2003/07/21 12:41:22 1.10 +++ OpenXM/src/k097/d.c 2021/03/12 06:45:55 1.22 @@ -1,9 +1,10 @@ -/* $OpenXM: OpenXM/src/k097/d.c,v 1.9 2003/07/13 08:18:27 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" @@ -49,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]; @@ -79,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(); @@ -160,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; @@ -181,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); } @@ -429,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));*************/ @@ -442,7 +443,7 @@ int KClex() { break; } /* else : Identifier case.*/ - if (d = isReserved(name)) { + if ((d = isReserved(name))) { if (Replace) printf0(name); return(d); } else { @@ -595,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); @@ -605,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; } } } @@ -674,7 +675,7 @@ char *readstring() { } -readchar() { +int readchar() { int c; if (Replace) putchar0('\''); c = fsgetc(Inop); /* 'c.' '\.c' */ @@ -702,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; @@ -723,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", @@ -760,7 +761,7 @@ char *s; } -shouldReplace(s) +int shouldReplace(s) char *s; { char *r[] = {"dummy"}; @@ -939,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() { @@ -1021,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)); @@ -1058,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; @@ -1068,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) @@ -1100,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");