BSD 4 release
[unix-history] / usr / src / cmd / lisp / fex3.c
CommitLineData
31cef89c
BJ
1static char *sccsid = "@(#)fex3.c 34.2 10/13/80";
2
414b5b6c 3#include "global.h"
31cef89c 4#include <vadvise.h>
414b5b6c
JF
5
6/* chkarg ***************************************************************/
7/* This insures that there are at least expnum arguments passed to the */
8/* BCD function that calls this. If there are fewer, nil arguments */
9/* are pushed onto the name stack and np adjusted accordingly. */
31cef89c
BJ
10#ifdef chkarg
11#undef chkarg
12#endif
13chkarg(expnum,string)
414b5b6c 14int expnum; /* expected number of args */
31cef89c 15char string[];
414b5b6c
JF
16{
17 register struct argent *work;
18 register r10,r9,r8;
19 register struct argent *lbot, *np;
20 saveonly(1);
21
22 for(work = np,np = lbot + expnum; work < np; )
23 work++->val = nil;
414b5b6c
JF
24}
25
26
27/*
28 *Ndumplisp -- create executable version of current state of this lisp.
29 */
31cef89c 30#include "a.out.h"
414b5b6c
JF
31
32asm(" .globl Dlast")
33lispval
34Ndumplisp()
35{
36 register struct exec *workp;
37 register lispval argptr, temp;
38 register char *fname;
39 extern lispval reborn;
40 struct exec work, old;
41 extern etext;
31cef89c
BJ
42 extern int dmpmode,holend,curhbeg,usehole;
43 extern int end;
414b5b6c
JF
44 int descrip, des2, count, ax,mode;
45 char tbuf[BUFSIZ];
46 snpand(4);
47
31cef89c
BJ
48
49#ifndef UNIXTS
50 vadvise(VA_ANOM);
51#endif
52
414b5b6c
JF
53 /* dump mode is kept in decimal (which looks like octal in dmpmode)
54 and is changeable via (sstatus dumpmode n) where n is 413 or 410
55 base 10
56 */
57 if(dmpmode == 413) mode = 0413;
58 else mode = 0410;
59
60 workp = &work;
61 workp->a_magic = mode;
31cef89c
BJ
62 if(usehole)
63 workp->a_text = curhbeg & (~PAGRND);
64 else
65 workp->a_text = ((((unsigned) (&holend)) - 1) & (~PAGRND)) + PAGSIZ;
66#ifndef VMS
414b5b6c 67 workp->a_data = (unsigned) sbrk(0) - workp->a_text;
31cef89c
BJ
68#else
69 workp->a_data = ((int)&end) - workp->a_text;
70#endif
414b5b6c
JF
71 workp->a_bss = 0;
72 workp->a_syms = 0;
73 workp->a_entry = (unsigned) gstart();
74 workp->a_trsize = 0;
75 workp->a_drsize = 0;
76
77 fname = "savedlisp"; /*set defaults*/
78 reborn = CNIL;
79 argptr = lbot->val;
80 if (argptr != nil) {
31cef89c 81 temp = argptr->d.car;
414b5b6c 82 if((TYPE(temp))==ATOM)
31cef89c 83 fname = temp->a.pname;
414b5b6c
JF
84 }
85 des2 = open(gstab(),0);
86 if(des2 >= 0) {
87 if(read(des2,&old,sizeof(old))>=0)
88 work.a_syms = old.a_syms;
89 }
90 descrip=creat(fname,0777); /*doit!*/
91 if(-1==write(descrip,workp,sizeof(work)))
92 {
93 close(descrip);
94 error("Dumplisp failed",FALSE);
95 }
96 if(mode == 0413) lseek(descrip,PAGSIZ,0);
97 if( -1==write(descrip,0,workp->a_text) ||
98 -1==write(descrip,workp->a_text,workp->a_data) ) {
99 close(descrip);
100 error("Dumplisp failed",FALSE);
101 }
102 if(des2>0 && work.a_syms) {
103 count = old.a_text + old.a_data + sizeof(old);
104 if(-1==lseek(des2,count,0))
105 error("Could not seek to stab",FALSE);
106 asm("Dlast:");
107 for(count = old.a_syms;count > 0; count -=BUFSIZ) {
108 ax = read(des2,tbuf,BUFSIZ);
109 if(ax==0) {
110 printf("Unexpected end of syms",count);
111 fflush(stdout);
112 break;
113 }
114 if(ax > 0)
115 write(descrip,tbuf,ax);
116 else
117 error("Failure to write dumplisp stab",FALSE);
118 }
119 }
120 close(descrip);
121 if(des2>0) close(des2);
122 reborn = 0;
31cef89c
BJ
123
124#ifndef UNIXTS
125 vadvise(VA_NORM);
126#endif
127 return(nil);
128}
129
130lispval
131Nndumplisp()
132{
133 register struct exec *workp;
134 register lispval argptr, temp;
135 register char *fname;
136 extern lispval reborn;
137 struct exec work, old;
138 extern etext;
139 extern int dmpmode,holend,curhbeg,usehole;
140 int descrip, des2, count, ax,mode;
141 char tbuf[BUFSIZ];
142 snpand(4);
143
144
145#ifndef UNIXTS
146 vadvise(VA_ANOM);
147#endif
148
149 /* dump mode is kept in decimal (which looks like octal in dmpmode)
150 and is changeable via (sstatus dumpmode n) where n is 413 or 410
151 base 10
152 */
153 if(dmpmode == 413) mode = 0413;
154 else mode = 0410;
155
156 workp = &work;
157 workp->a_magic = mode;
158 if(usehole)
159 workp->a_text = curhbeg & (~PAGRND);
160 else
161 workp->a_text = ((((unsigned) (&holend)) - 1) & (~PAGRND)) + PAGSIZ;
162 workp->a_data = (unsigned) sbrk(0) - workp->a_text;
163 workp->a_bss = 0;
164 workp->a_syms = 0;
165 workp->a_entry = (unsigned) gstart();
166 workp->a_trsize = 0;
167 workp->a_drsize = 0;
168
169 fname = "savedlisp"; /*set defaults*/
170 reborn = CNIL;
171 argptr = lbot->val;
172 if (argptr != nil) {
173 temp = argptr->d.car;
174 if((TYPE(temp))==ATOM)
175 fname = temp->a.pname;
176 }
177 des2 = open(gstab(),0);
178 if(des2 >= 0) {
179 if(read(des2,&old,sizeof(old))>=0)
180 work.a_syms = old.a_syms;
181 }
182 descrip=creat(fname,0777); /*doit!*/
183 if(-1==write(descrip,workp,sizeof(work)))
184 {
185 close(descrip);
186 error("Dumplisp failed",FALSE);
187 }
188 if(mode == 0413) lseek(descrip,PAGSIZ,0);
189 if( -1==write(descrip,0,workp->a_text) ||
190 -1==write(descrip,workp->a_text,workp->a_data) ) {
191 close(descrip);
192 error("Dumplisp failed",FALSE);
193 }
194 if(des2>0 && work.a_syms) {
195 count = old.a_text + old.a_data + (old.a_magic == 0413 ? PAGSIZ
196 : sizeof(old));
197 if(-1==lseek(des2,count,0))
198 error("Could not seek to stab",FALSE);
199 for(count = old.a_syms;count > 0; count -=BUFSIZ) {
200 ax = read(des2,tbuf,(count < BUFSIZ ? count : BUFSIZ));
201 if(ax==0) {
202 printf("Unexpected end of syms",count);
203 fflush(stdout);
204 break;
205 } else if(ax > 0)
206 write(descrip,tbuf,ax);
207 else
208 error("Failure to write dumplisp stab",FALSE);
209 }
210 if(-1 == lseek(des2,
211 (old.a_magic == 0413 ? PAGSIZ : sizeof(old))
212 + old.a_text + old.a_data
213 + old.a_trsize + old.a_drsize + old.a_syms,
214 0))
215 error(" Could not seek to string table ",FALSE);
216 for( ax = 1 ; ax > 0;) {
217 ax = read(des2,tbuf,BUFSIZ);
218 if(ax > 0)
219 write(descrip,tbuf,ax);
220 else if (ax < 0)
221 error("Error in string table read ",FALSE);
222 }
223 }
224 close(descrip);
225 if(des2>0) close(des2);
226 reborn = 0;
227
228#ifndef UNIXTS
229 vadvise(VA_NORM);
230#endif
414b5b6c
JF
231 return(nil);
232}
233lispval
234typred(typ,ptr)
235int typ;
236lispval ptr;
237
238{ int tx;
239 if ((tx = TYPE(ptr)) == typ) return(tatom);
240 if ((tx == INT) && (typ == ATOM)) return(tatom);
241 return(nil);
242}
243lispval
244Nfunction()
245{
246 register lispval handy;
247
248 snpand(1);
31cef89c
BJ
249 handy = lbot->val->d.car;
250 if(TYPE(handy)==ATOM && handy->a.fnbnd!=nil)
251 return(handy->a.fnbnd);
414b5b6c
JF
252 else
253 return(handy);
254}