=================================================================== RCS file: /home/cvs/OpenXM/src/k097/d.c,v retrieving revision 1.6 retrieving revision 1.10 diff -u -p -r1.6 -r1.10 --- OpenXM/src/k097/d.c 2000/12/10 02:21:45 1.6 +++ OpenXM/src/k097/d.c 2003/07/21 12:41:22 1.10 @@ -1,14 +1,26 @@ -/* $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.9 2003/07/13 08:18:27 takayama Exp $ */ /* simple.c, 1996, 1/1 --- 1/5 */ #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; @@ -34,6 +46,9 @@ int Debug2 = 0; int Interactive = 1; +static int isThereStdin(); +#define MARK_CHAR 3 + main2(int argc, char *argv[]) { FILE *f; FILE *outf; @@ -584,8 +599,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); } @@ -877,6 +898,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; @@ -1084,20 +1114,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(); } -