|
|
1.1 root 1: /* Copyright 1989 by AT&T Bell Laboratories */
2: #include <stdio.h>
3: #include <sys/types.h>
4: #include <sys/stat.h>
5: #include <sys/file.h>
6: #include <signal.h>
7: #include "tags.h"
8: #include "descriptor.h"
9: #include "prof.h"
10: extern double atof();
11:
12: extern int cstruct[];
13:
14: extern int profvec[];
15:
16: extern int saved_dataptr;
17:
18: extern struct datalist
19: {mlstring name;
20: char *data;
21: struct datalist *next;
22: } datalist;
23:
24: int openread(s) char *s;
25: {int fd= -1; char *p, *q; int i;
26: {struct datalist *d; mlstring ss=(mlstring)mak_str(s);
27: for(d= &datalist; (int)d!=1; d=d->next)
28: if (ml_eqstr(ss,d->name)) return (int)d->data-4;
29: }
30:
31: #ifdef V9
32: fd = open(s,0);
33: #endif
34: #ifdef BSD
35: fd = open(s,O_RDONLY,0666);
36: #endif
37: if (fd<0) quit("cannot open %s\n",s);
38: p=(char *)saved_dataptr;
39: saved_dataptr += sizeof(int);
40: while (i=read(fd,saved_dataptr,4096)) saved_dataptr+=i;
41: q=(char*)saved_dataptr;
42: while (saved_dataptr & 3) saved_dataptr++;
43: *(int*)p = mak_desc(q-p-sizeof(int),tag_string);
44: return (int)p;
45: }
46:
47: char *load();
48:
49: closure(x) int x;
50: {int *p = (int *)mak_obj(1,tag_record);
51: p[0] = x;
52: return (int)p;
53: }
54:
55: extern int new_size;
56: extern int resettimers();
57: #ifdef M68
58: extern int math_functor, mathvec;
59: #endif
60:
61: char *pervfunc = "mo/PervFunc.mo";
62: char *loadername = "mo/Loader.mo";
63: char *mathfunc = "mo/Math.mo";
64: int xflag=0;
65: extern int gcmessages0[], ratio0[], softmax0[], pstruct0[];
66: #define gcmessages (gcmessages0[1])
67: #define pstruct (pstruct0[1])
68: #define ratio (ratio0[1])
69: #define softmax (softmax0[1])
70: extern int cause;
71: char **global_argv;
72: main(argc,argv) int argc;
73: char *argv[];
74: {
75: int perv, core, math, loader, *argrec;
76: char *argname;
77: char **p = argv+1;
78:
79: global_argv=argv;
80: if (cause==CAUSE_EXPORT) restarter();
81: gcmessages = ML_INT(2);
82: ratio=11;
83: softmax=1024*1024*100*2 + 1;
84: while (*p && **p == '-')
85: switch (p[0][1])
86: {case 'h': if (p[1])
87: {new_size = 1024*atoi(p[1]); p+=2;}
88: else quit("no -h value");
89: break;
90: case 'r': if (p[1]) {ratio = atoi(p[1])*2+1; p+=2;
91: if (ratio<7) ratio=7;
92: }
93: else quit("no -r value");
94: break;
95: case 'm': if (p[1]) {softmax = 1024*atoi(p[1])*2+1; p+=2;}
96: else die("no -m value");
97: break;
98: case 'g': if (p[1])
99: {gcmessages0[1] = ML_INT(atoi(p[1])); p+=2;}
100: else quit("no -g value");
101: break;
102: case 'x': if (p[1])
103: {xflag=1; pervfunc = p[1]; p+=2;}
104: else quit("no -x value");
105: break;
106: case 'y': if (p[1])
107: {xflag=2; pervfunc = p[1]; p+=2;}
108: else quit("no -y value");
109: break;
110: case 'z': if (p[1])
111: {xflag=3; loadername = p[1]; p+=2;}
112: else quit("no -z value");
113: break;
114: case 't': if (p[1])
115: {mathfunc = p[1]; p+=2;}
116: else quit("no -t value");
117: break;
118: }
119:
120: if (*p) argname= *p;
121: else if (xflag==0) quit("no file to execute\n");
122:
123: setupsignals();
124: resettimers();
125: init_gc();
126:
127: #ifdef PROFILE
128: {int i;
129: for(i=0; i<PROFSIZE; i++) profvec[i] = ML_INT(0);
130: }
131: #endif
132:
133: perv = (int)load(mak_str("CoreFunc"));
134: enroll(mak_str("Core"),core=apply(perv,cstruct+1));
135: #ifdef M68
136: math = (int)&mathvec;
137: enroll(mak_str("Math"),math);
138: #else
139: math = (int)load(mak_str("Math"));
140: #endif
141: perv = pstruct = (int)load(mak_str("Initial"));
142: if (xflag==1) {chatting("Result is %d\n",(*(int*) perv)>>1); _exit(0);}
143:
144: loader = (int)load(mak_str("Loader"));
145: if (xflag==3) {chatting("Result is %d\n", (*(int*) loader)>>1); _exit(0);}
146: argrec = (int *)mak_obj(4,tag_record);
147: argrec[0] = core;
148: argrec[1] = perv;
149: argrec[2] = math;
150: argrec[3] = mak_str(argname);
151: apply(loader,argrec);
152: #ifdef PROFILE
153: print_profile_info();
154: #endif
155: #ifdef GCPROFILE
156: print_gcprof();
157: #endif
158: exit(0);
159: }
160:
161: struct exception {
162: mlstring val;
163: mlstring *name;
164: };
165:
166: uncaught(e) struct exception *e;
167: {int descr;
168: if ((int)e->val & 1)
169: chatting("Uncaught exception %.*s with %d\n",
170: (((int *)*e->name)[-1])>>width_tags,
171: e->name[0],
172: (int)e->val);
173: else if (((descr=((int*)e->val)[-1])&mask_tags) == tag_string
174: || (descr&mask_tags) == tag_embedded) /* possible bug on reals */
175: chatting("uncaught exception %.*s with \"%.*s\"\n",
176: (((int *)*e->name)[-1])>>width_tags,
177: e->name[0],
178: descr>>width_tags,
179: e->val);
180: else chatting("uncaught exception %.*s with <unknown>\n",
181: (((int *)*e->name)[-1])>>width_tags,
182: e->name[0]);
183: exit(1);
184: }
185:
186:
187: int quit(s, a, b, c, d, e, f)
188: char *s;
189: {char dbuf[1024];
190: sprintf(dbuf, s, a, b, c, d, e, f);
191: write(2, dbuf, strlen(dbuf));
192: exit (2);
193: }
194:
195: die(s, a, b, c, d, e, f)
196: char *s;
197: {char dbuf[1024];
198: sprintf(dbuf, s, a, b, c, d, e, f);
199: write(2, dbuf, strlen(dbuf));
200: /* abort(); */
201: exit(3);
202: }
203:
204: chatting(s, a, b, c, d, e, f, g)
205: char *s;
206: {char dbuf[1024];
207: sprintf(dbuf, s, a, b, c, d, e, f, g);
208: write(2, dbuf, strlen(dbuf));
209: }
210:
211:
212: mlstring names[10];
213: char * objs[10];
214: int objcount;
215:
216: enroll(name,obj) mlstring name; char *obj;
217: {
218: names[objcount]=name; objs[objcount]=obj;
219: objcount++;
220: }
221:
222: #define get_slen(x) ( ((int*)(x))[-1]>>width_tags )
223: char *lookup(name) mlstring name;
224: {int i;
225: for(i=0;i<objcount;i++)
226: {mlstring s = names[i];
227: if (get_slen(name)==get_slen(s) && !strncmp(name,s,get_slen(s)))
228: return objs[i];
229: }
230: return 0;
231: }
232:
233: struct list {mlstring name; struct list *next;};
234:
235: struct list *loadlist(names) struct list *names;
236: {struct list * g;
237: if ((int)names==1) return (struct list *)1;
238: g = (struct list *) mak_obj(2,tag_record);
239: g->name = (mlstring) load(names->name);
240: g->next = loadlist(names->next);
241: return g;
242: }
243:
244: char *load(name) mlstring name;
245: {mlstring p; char buf[50];
246: if (p=lookup(name)) return p;
247: strcpy(buf,"mo/");
248: strncpy(buf+3,name,get_slen(name));
249: strcpy(buf+3+get_slen(name),".mo");
250: chatting("[Loading %s]\n",buf);
251: p = (char *)closure(openread(buf)+12);
252: p = (char *)apply(p,ML_UNIT);
253: chatting("[Executing %s]\n",buf);
254: p = (char *)(((int*)(apply(((int*)p)[0], loadlist(((int*)p)[1]))))[0]);
255: /* p = (char *)apply(((int*)p)[0], loadlist(((int*)p)[1])); */
256: enroll(name,p);
257: return p;
258: }
259:
260:
261: /* profiling stuff */
262: extern int *current0[];
263:
264: handleprof()
265: {
266: current0[1][1] += 2;
267: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.