Annotation of OpenXM/src/k097/ki.c, Revision 1.1.1.1
1.1 maekawa 1: /* ki.c ( kx interpreter ) */
2:
3: #include <stdio.h>
4: #include "datatype.h"
5: #include "stackm.h"
6: #include "extern.h"
7: #include "extern2.h"
8: #include "lookup.h"
9: #include "matrix.h"
10: #include "gradedset.h"
11: #include <setjmp.h>
12: #include <signal.h>
13:
14: char *getLOAD_K_PATH(); /* from d.h */
15:
16: #ifdef CALLASIR
17: #include "ak0.h"
18: #endif
19:
20: extern jmp_buf KCenvOfParser;
21:
22: char Ktmp[10240];
23: int Ksize = 10240;
24: char *Kbuff = Ktmp;
25: int Kpt = 0;
26: int DebugCompiler = 0; /* 0: , 1: Displays sendKan[ .... ] */
27: int K00_verbose = 0;
28:
29: extern int DebugMode;
30:
31: sendKan(int p) {
32: static int n = 2;
33: extern int Interactive;
34: struct object obj;
35: int result;
36: signal(SIGINT,SIG_IGN); /* Don't jump to ctrlC(). */
37: if (p == 10) {printf("In(%d)=",n++); return;}
38: if (p == 0 && DebugCompiler) printf("sendKan[%s]\n",Kbuff);
39: /* printf("sendKan[%s]\n",Kbuff); */
40: if (strlen(Kbuff) != 0) {
41: signal(SIGINT,SIG_DFL);
42: result = KSexecuteString(Kbuff);
43: /* fprintf(stderr,"r=%d ",result); */
44: signal(SIGINT,SIG_IGN); /* Reset SIGINT. Don't jump to ctrlC(). */
45: }
46: /* fprintf(stderr,"r=%d ",result); */
47: if (result == -1) {
48: K00recoverFromError();
49: fprintf(stderr,"--- Engine error or interrupt : ");
50: if (DebugMode) {
51: signal(SIGINT,SIG_DFL);
52: KSexecuteString("db.DebugStack setstack ");
53: signal(SIGINT,SIG_IGN); /* Reset SIGINT. Don't jump to ctrlC(). */
54: obj = KSpop();
55: signal(SIGINT,SIG_DFL);
56: KSexecuteString("stdstack ");
57: signal(SIGINT,SIG_IGN); /* Reset SIGINT. Don't jump to ctrlC(). */
58: if (obj.tag == Sdollar) {
59: fprintf(stderr,"%s\n",obj.lc.str);
60: fprintf(stderr,"\n");
61: }else{
62: fprintf(stderr,"The error occured on the top level.\n");
63: }
64: fprintf(stderr,"Type in Cleards() to exit the debug mode and Where() to see the stack trace.\n");
65: }
66: }
67: #define AFO
68: #ifdef AFO
69: if (setjmp(KCenvOfParser)) {
70: fprintf(stderr,"Error: Goto the top level.\n");
71: parseAfile(stdin);
72: KCparse();
73: /* Call KCparse() recursively when there is error. */
74: /* This is the easiest way to handle errors. */
75: /* However, it should be rewrited in a future. */
76: }else{ /* fprintf(stderr,"setjmp\n"); */ }
77: #endif
78: if (p == 0 && Interactive) printf("In(%d)=",n++);
79: Kpt=0; Kbuff[0] = '\0';
80: }
81:
82:
83: void pkkan(s)
84: char *s;
85: {
86: char *t;
87: if (strlen(s)+Kpt >= Ksize) {
88: Ksize = Ksize*2;
89: t = (char *)GC_malloc(sizeof(char)*Ksize);
90: if (t == (char *)NULL) { fprintf(stderr,"No memory."); exit();}
91: strcpy(t,Kbuff); Kbuff = t;
92: }
93: strcpy(&(Kbuff[Kpt]),s);
94: Kpt += strlen(s);
95: }
96:
97: void pkdebug(char *s0,char *s1, char *s2,char *s3) {
98: if (DebugMode) {
99: pkkan(" db.DebugStack setstack $");
100: pkkan(s0); pkkan(s1); pkkan(s2); pkkan(s3);
101: pkkan("$ stdstack \n");
102: }
103: }
104:
105: void pkdebug2(void) {
106: if (DebugMode) {
107: pkkan(" db.DebugStack setstack pop stdstack \n");
108: }
109: }
110:
111:
112: void *mymalloc(int n)
113: {
114: return((void *)GC_malloc(n));
115: }
116:
117: execFile(char *s)
118: {
119: FILE *fp;
120: #define TMP_SIZE 1024
121: char tmp[TMP_SIZE+1];
122: char tname[1024];
123: char tname2[1024];
124: char tname3[1024];
125: char tname4[1024];
126: int c;
127: if ((fp = fopen(s,"r")) == (FILE *) NULL) {
128: strcpy(tname,LOAD_SM1_PATH2);
129: strcat(tname,s);
130: strcpy(tname2,tname);
131: if ((fp = fopen(tname,"r")) == (FILE *) NULL) {
132: strcpy(tname,getLOAD_K_PATH());
133: strcat(tname,s);
134: strcpy(tname3,tname);
135: if ((fp = fopen(tname,"r")) == (FILE *) NULL) {
136: strcpy(tname,LOAD_K_PATH);
137: strcat(tname,s);
138: strcpy(tname4,tname);
139: if ((fp = fopen(tname,"r")) == (FILE *) NULL) {
140: strcpy(tname,getLOAD_K_PATH());
141: strcat(tname,"../kan96xx/Kan/");
142: strcat(tname,s);
143: if ((fp = fopen(tname,"r")) == (FILE *) NULL) {
144: fprintf(stderr,"Fatal error: Cannot open the system macro %s in %s, %s, %s nor %s.\n",
145: s,tname2,tname3,tname4,tname);
146: exit(11);
147: return;
148: }
149: }
150: }
151: }
152: }
153: /* printf("Reading\n"); fflush(stdout); */
154: while (fgets(tmp,TMP_SIZE,fp) != NULL) {
155: pkkan(tmp);
156: }
157: /* printf("Done.\n"); fflush(stdout); */
158: sendKan(1);
159: /* printf("sendKan, done.\n"); fflush(stdout); */
160: }
161:
162: /*Tag: yychar = YYEMPTY; Put the following line in simple.tab.c */
163: /* It makes segmentation fault. */
164: /*
165: #include <setjmp.h>
166: extern jmp_buf KCenvOfParser;
167: if (setjmp(KCenvOfParser)) {
168: parseAfile(stdin);
169: fprintf(stderr,"Error: Goto the top level.\n");
170: }else{ }
171: */
172:
173:
174: void testNewFunction(objectp op)
175: {
176: fprintf(stderr,"This is testNewFunction of NOT CALLASIR.\n");
177: if (op->tag != Sstring) {
178: fprintf(stderr,"The argument must be given as an argment of load.\n");
179: return;
180: }
181: fprintf(stderr,"Now execute .. <<%s>> \n",op->lc.str);
182: parseAstring(op->lc.str);
183: fprintf(stderr,"\nDone.\n");
184: }
185:
186:
187:
188:
189:
190:
191:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>