BSD 3 development
[unix-history] / usr / src / cmd / lisp / fex3.c
CommitLineData
414b5b6c
JF
1#include "global.h"
2
3/* chkarg ***************************************************************/
4/* This insures that there are at least expnum arguments passed to the */
5/* BCD function that calls this. If there are fewer, nil arguments */
6/* are pushed onto the name stack and np adjusted accordingly. */
7chkarg(expnum)
8int expnum; /* expected number of args */
9{
10 register struct argent *work;
11 register r10,r9,r8;
12 register struct argent *lbot, *np;
13 saveonly(1);
14
15 for(work = np,np = lbot + expnum; work < np; )
16 work++->val = nil;
17
18}
19
20
21/*
22 *Ndumplisp -- create executable version of current state of this lisp.
23 */
24#include <a.out.h>
25
26asm(" .globl Dlast")
27lispval
28Ndumplisp()
29{
30 register struct exec *workp;
31 register lispval argptr, temp;
32 register char *fname;
33 extern lispval reborn;
34 struct exec work, old;
35 extern etext;
36 extern int dmpmode;
37 int descrip, des2, count, ax,mode;
38 char tbuf[BUFSIZ];
39 snpand(4);
40
41 /* dump mode is kept in decimal (which looks like octal in dmpmode)
42 and is changeable via (sstatus dumpmode n) where n is 413 or 410
43 base 10
44 */
45 if(dmpmode == 413) mode = 0413;
46 else mode = 0410;
47
48 workp = &work;
49 workp->a_magic = mode;
50 workp->a_text = ((((unsigned) (&etext)) - 1) & (~PAGRND)) + PAGSIZ;
51 workp->a_data = (unsigned) sbrk(0) - workp->a_text;
52 workp->a_bss = 0;
53 workp->a_syms = 0;
54 workp->a_entry = (unsigned) gstart();
55 workp->a_trsize = 0;
56 workp->a_drsize = 0;
57
58 fname = "savedlisp"; /*set defaults*/
59 reborn = CNIL;
60 argptr = lbot->val;
61 if (argptr != nil) {
62 temp = argptr->car;
63 if((TYPE(temp))==ATOM)
64 fname = temp->pname;
65 }
66 des2 = open(gstab(),0);
67 if(des2 >= 0) {
68 if(read(des2,&old,sizeof(old))>=0)
69 work.a_syms = old.a_syms;
70 }
71 descrip=creat(fname,0777); /*doit!*/
72 if(-1==write(descrip,workp,sizeof(work)))
73 {
74 close(descrip);
75 error("Dumplisp failed",FALSE);
76 }
77 if(mode == 0413) lseek(descrip,PAGSIZ,0);
78 if( -1==write(descrip,0,workp->a_text) ||
79 -1==write(descrip,workp->a_text,workp->a_data) ) {
80 close(descrip);
81 error("Dumplisp failed",FALSE);
82 }
83 if(des2>0 && work.a_syms) {
84 count = old.a_text + old.a_data + sizeof(old);
85 if(-1==lseek(des2,count,0))
86 error("Could not seek to stab",FALSE);
87 asm("Dlast:");
88 for(count = old.a_syms;count > 0; count -=BUFSIZ) {
89 ax = read(des2,tbuf,BUFSIZ);
90 if(ax==0) {
91 printf("Unexpected end of syms",count);
92 fflush(stdout);
93 break;
94 }
95 if(ax > 0)
96 write(descrip,tbuf,ax);
97 else
98 error("Failure to write dumplisp stab",FALSE);
99 }
100 }
101 close(descrip);
102 if(des2>0) close(des2);
103 reborn = 0;
104 return(nil);
105}
106lispval
107typred(typ,ptr)
108int typ;
109lispval ptr;
110
111{ int tx;
112 if ((tx = TYPE(ptr)) == typ) return(tatom);
113 if ((tx == INT) && (typ == ATOM)) return(tatom);
114 return(nil);
115}
116lispval
117Nfunction()
118{
119 register lispval handy;
120
121 snpand(1);
122 handy = lbot->val->car;
123 if(TYPE(handy)==ATOM && handy->fnbnd!=nil)
124 return(handy->fnbnd);
125 else
126 return(handy);
127}