| version 1.6, 2000/12/10 02:21:45 |
version 1.11, 2003/07/22 03:25:55 |
|
|
| /* $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.10 2003/07/21 12:41:22 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" |
| |
#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; |
|
|
| |
|
| 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 599 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 898 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 1028 void loadFileWithCpp(objectp op) |
|
| Line 1058 void loadFileWithCpp(objectp op) |
|
| char tmpName[1024]; |
char tmpName[1024]; |
| int pid; |
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; |
| Line 1038 void loadFileWithCpp(objectp op) |
|
| Line 1073 void loadFileWithCpp(objectp op) |
|
| 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. |
| /* Use gcc -v to know what symbols are defined. */ |
if defined(linux) || defined(__linux__) |
| #if defined(linux) || defined(__linux__) |
Removed old codes. */ |
| strcpy(fname,"/lib/cpp -P -lang-c++ <"); |
|
| #else |
sfile = op->lc.str; |
| strcpy(fname,"cpp -P -lang-c++ <"); |
if (getFileSize(sfile) < 0) { |
| #endif |
fprintf(stderr,"The source file is not found.\n"); return; |
| strcat(fname,op->lc.str); |
} |
| strcat(fname," >k00.cppload.tmp"); |
cpp = getCppPath(); |
| system(fname); |
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) { |
| |
argv[0] = cpp; |
| |
argv[1] = "-P"; |
| |
argv[2] = "-lang-c++"; |
| |
argv[3] = sfile; |
| |
argv[4] = outfile; |
| |
argv[5] = NULL; |
| |
}else{ |
| |
argv[0] = cpp; |
| |
argv[1] = cygwinPathToWinPath(sfile); |
| |
argv[2] = cygwinPathToWinPath(outfile); |
| |
argv[3] = NULL; |
| |
} |
| |
n=oxForkExecBlocked(argv); |
| |
|
| 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); |
| system("/bin/rm -f k00.cppload.tmp"); |
unlink(outfile); |
| } |
} |
| |
|
| void showStringBuff(objectp op) |
void showStringBuff(objectp op) |
| Line 1084 void showStringBuff(objectp op) |
|
| Line 1142 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); |
|
| } |
|
| } |
} |
| |
|