=================================================================== RCS file: /home/cvs/OpenXM/src/k097/d.c,v retrieving revision 1.1 retrieving revision 1.9 diff -u -p -r1.1 -r1.9 --- OpenXM/src/k097/d.c 1999/10/08 02:12:14 1.1 +++ OpenXM/src/k097/d.c 2003/07/13 08:18:27 1.9 @@ -1,18 +1,30 @@ +/* $OpenXM: OpenXM/src/k097/d.c,v 1.8 2002/02/24 10:27:21 takayama Exp $ */ /* simple.c, 1996, 1/1 --- 1/5 */ #include #include #include #include +#include +#include #include "d.h" #include "simple.tab.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,6 +45,9 @@ int Debug2 = 0; int Interactive = 1; +static int isThereStdin(); +#define MARK_CHAR 3 + main2(int argc, char *argv[]) { FILE *f; FILE *outf; @@ -583,8 +598,14 @@ KCerror(char *s) /* You need this function. Otherwis { 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 ; + LONGJMP(KCenvOfParser,2); exit(1); } @@ -876,6 +897,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 +990,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 +1015,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; } } } + close(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,17 +1054,26 @@ void loadFileWithCpp(objectp op) { FILE *fp; char fname[1024]; + char tmpName[1024]; + int pid; objectp ob; 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"); + /* Use gcc -v to know what symbols are defined. */ +#if defined(linux) || defined(__linux__) strcpy(fname,"/lib/cpp -P -lang-c++ <"); +#else + strcpy(fname,"cpp -P -lang-c++ <"); +#endif strcat(fname,op->lc.str); strcat(fname," >k00.cppload.tmp"); system(fname); @@ -1014,6 +1081,7 @@ void loadFileWithCpp(objectp op) ob->tag = Sstring; ob->lc.str = "k00.cppload.tmp"; loadFile(ob); + system("/bin/rm -f k00.cppload.tmp"); } void showStringBuff(objectp op) @@ -1045,20 +1113,215 @@ 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/"); + +/* 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{ - if (strlen(p) == 0) return(p); + 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 *) malloc(sizeof(char)*(strlen(p)+3)); + 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; + } +}