| version 1.6, 2000/12/10 02:21:45 |
version 1.9, 2003/07/13 08:18:27 |
|
|
| /* $OpenXM: OpenXM/src/k097/d.c,v 1.5 2000/05/04 11:05:19 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/k097/d.c,v 1.8 2002/02/24 10:27:21 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 <sys/types.h> |
| |
#include <sys/stat.h> |
| #include "d.h" |
#include "d.h" |
| #include "simple.tab.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; |
int DebugMode = 1; |
| extern int K00_verbose; |
extern int K00_verbose; |
|
|
| |
|
| int Interactive = 1; |
int Interactive = 1; |
| |
|
| |
static int isThereStdin(); |
| |
#define MARK_CHAR 3 |
| |
|
| main2(int argc, char *argv[]) { |
main2(int argc, char *argv[]) { |
| FILE *f; |
FILE *f; |
| FILE *outf; |
FILE *outf; |
| Line 584 KCerror(char *s) /* You need this function. Otherwis |
|
| Line 598 KCerror(char *s) /* You need this function. Otherwis |
|
| { |
{ |
| 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 ; |
| |
LONGJMP(KCenvOfParser,2); |
| exit(1); |
exit(1); |
| } |
} |
| |
|
| Line 877 static int popFile() { |
|
| Line 897 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 1084 void showStringBuff(objectp op) |
|
| Line 1113 void showStringBuff(objectp op) |
|
| fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
| } |
} |
| |
|
| char *getLOAD_K_PATH() { |
|
| char *p; |
/* Aux-functions for getLOAD_K_PATH(); */ |
| char *p2; |
static int getOStypei(); |
| p = getenv("LOAD_K_PATH"); |
static char *getOStypes(); |
| if (p == NULL) { |
static char *addSlash(); |
| return("/usr/local/lib/kxx97/yacc/"); |
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{ |
}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); |
if (p[strlen(p)-1] == '/') return(p); |
| /* Add / */ |
/* 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); } |
if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
| strcpy(p2,p); strcat(p2,"/"); |
strcpy(p2,p); strcat(p2,"/"); |
| return(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; |
| |
} |
| |
} |