[BACK]Return to d.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / k097

Diff for /OpenXM/src/k097/d.c between version 1.2 and 1.22

version 1.2, 2000/01/21 03:01:25 version 1.22, 2021/03/12 06:45:55
Line 1 
Line 1 
 /* $OpenXM$ */  /* $OpenXM: OpenXM/src/k097/d.c,v 1.21 2020/10/07 23:53:25 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/stat.h>
 #include "d.h"  #include "d.h"
 #include "simple.tab.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;  int DebugMode = 1;
 extern int K00_verbose;  extern int K00_verbose;
   
 static FILE *outfile = stdout;  static FILE *outfile;
 int Linenumber = 0;  int Linenumber = 0;
 objectp Inop = (objectp) NULL;  /* Input stream */  objectp Inop = (objectp) NULL;  /* Input stream */
 int Saki = 0;   /* Look a head */  int Saki = 0;   /* Look a head */
Line 34  int Debug2 = 0;
Line 47  int Debug2 = 0;
   
 int Interactive = 1;  int Interactive = 1;
   
 main2(int argc, char *argv[]) {  static int isThereStdin();
   #define MARK_CHAR  3
   
   void main2(int argc, char *argv[]) {
   FILE *f;    FILE *f;
   FILE *outf;    FILE *outf;
   char name[1024];    char name[1024];
Line 64  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 145  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 166  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);
 }  }
   
Line 414  int KClex() {
Line 430  int KClex() {
       /*if (Mydebug) printf("identifier string=[%s]",name);*/        /*if (Mydebug) printf("identifier string=[%s]",name);*/
       if (isdigit(name[0])) {        if (isdigit(name[0])) {
         /****************************          /****************************
           /**case : machine integer.            **case : machine integer.
         KClval = newObject_d();          KClval = newObject_d();
         KClval->tag = Sinteger;          KClval->tag = Sinteger;
         sscanf(name,"%d",&(KClval->lc.ival));*************/          sscanf(name,"%d",&(KClval->lc.ival));*************/
Line 427  int KClex() {
Line 443  int KClex() {
         break;          break;
       } /* else : Identifier case.*/        } /* else : Identifier case.*/
   
       if (d = isReserved(name)) {        if ((d = isReserved(name))) {
         if (Replace) printf0(name);          if (Replace) printf0(name);
         return(d);          return(d);
       } else {        } else {
Line 580  int KClex() {
Line 596  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();    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);
   showStringBuff(Inop); return ;    showStringBuff(Inop);
   longjmp(KCenvOfParser,2);    /* 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);    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 653  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' */
Line 681  readchar() {
Line 703  readchar() {
   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;
Line 702  char *s;
Line 724  char *s;
   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",
Line 739  char *s;
Line 761  char *s;
   
 }  }
   
 shouldReplace(s)  int shouldReplace(s)
 char *s;  char *s;
 {  {
   char *r[] = {"dummy"};    char *r[] = {"dummy"};
Line 877  static int popFile() {
Line 899  static int popFile() {
   return(Saki);    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) {  int fsgetc(objectp op) {
   struct stringBuf *obuf;    struct stringBuf *obuf;
   char *str;    char *str;
Line 909  int fsgetc(objectp op) {
Line 940  int fsgetc(objectp op) {
   
 int fsungetc(int c,objectp op) {  int fsungetc(int c,objectp op) {
   fprintf(stderr,"Sorry. fsungetc has not yet implemented.\n");    fprintf(stderr,"Sorry. fsungetc has not yet implemented.\n");
     return -1;
 }  }
   
 void clearInop() {  void clearInop() {
Line 961  void parseAstring(char *s)
Line 993  void parseAstring(char *s)
   
 }  }
   
 void loadFile(objectp op)  objectp checkIfTheFileExists(objectp op) {
 {  
   FILE *fp;    FILE *fp;
   char fname[1024];    char fname[1024];
     char *s;
     objectp nullObj;
     nullObj = 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 nullObj;
   }    }
   if (strlen(op->lc.str) > 1000) {    if (strlen(op->lc.str) > 800) {
     fprintf(stderr,"Too long file name.\n");      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) {    if (fp == (FILE *)NULL) {
     strcpy(fname,getLOAD_K_PATH());      strcpy(fname,getLOAD_K_PATH());
     strcat(fname,op->lc.str);      strcat(fname,op->lc.str);
Line 983  void loadFile(objectp op)
Line 1018  void loadFile(objectp op)
       strcat(fname,op->lc.str);        strcat(fname,op->lc.str);
       fp = fopen(fname,"r");        fp = fopen(fname,"r");
       if (fp == (FILE *)NULL) {        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);                  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;                  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);    if (K00_verbose) fprintf(stderr,"Reading the file <<%s>>...  ",op->lc.str);
   parseAfile(fp);    parseAfile(fp);
   if (K00_verbose) fprintf(stderr,"\nClosed the file <<%s>>.\n",op->lc.str);    if (K00_verbose) fprintf(stderr,"\nClosed the file <<%s>>.\n",op->lc.str);
Line 997  void loadFileWithCpp(objectp op)
Line 1057  void loadFileWithCpp(objectp op)
 {  {
   FILE *fp;    FILE *fp;
   char fname[1024];    char fname[1024];
     char tmpName[1024];
     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;
   }    }
     op = checkIfTheFileExists(op);
     if (op == NULL) return;
   if (strlen(op->lc.str) > 900) {    if (strlen(op->lc.str) > 900) {
     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.
   strcpy(fname,"/lib/cpp -P -lang-c++ <");           if  defined(linux) || defined(__linux__)
   strcat(fname,op->lc.str);           Removed old codes. */
   strcat(fname,"  >k00.cppload.tmp");  
   system(fname);    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 = newObject_d();
   ob->tag = Sstring;    ob->tag = Sstring;
   ob->lc.str = "k00.cppload.tmp";    ob->lc.str = outfile;
   loadFile(ob);    loadFile(ob);
     unlink(outfile);
 }  }
   
 void showStringBuff(objectp op)  void showStringBuff(objectp op)
Line 1032  void showStringBuff(objectp op)
Line 1139  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 1046  void showStringBuff(objectp op)
Line 1153  void showStringBuff(objectp op)
   fprintf(stderr,"\n");    fprintf(stderr,"\n");
 }  }
   
   
   
 char *getLOAD_K_PATH() {  char *getLOAD_K_PATH() {
   char *p;    return getLOAD_K_PATH2();
   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);  
   }  
 }  }
   

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.22

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>