+
+#ifndef UNIXTS
+ vadvise(VA_NORM);
+#endif
+ return(nil);
+}
+
+lispval
+Nndumplisp()
+{
+ register struct exec *workp;
+ register lispval argptr, temp;
+ register char *fname;
+ extern lispval reborn;
+ struct exec work, old;
+ extern etext;
+ extern int dmpmode,holend,curhbeg,usehole;
+ int descrip, des2, count, ax,mode;
+ char tbuf[BUFSIZ];
+ snpand(4);
+
+
+#ifndef UNIXTS
+ vadvise(VA_ANOM);
+#endif
+
+ /* dump mode is kept in decimal (which looks like octal in dmpmode)
+ and is changeable via (sstatus dumpmode n) where n is 413 or 410
+ base 10
+ */
+ if(dmpmode == 413) mode = 0413;
+ else mode = 0410;
+
+ workp = &work;
+ workp->a_magic = mode;
+ if(usehole)
+ workp->a_text = curhbeg & (~PAGRND);
+ else
+ workp->a_text = ((((unsigned) (&holend)) - 1) & (~PAGRND)) + PAGSIZ;
+ workp->a_data = (unsigned) sbrk(0) - workp->a_text;
+ workp->a_bss = 0;
+ workp->a_syms = 0;
+ workp->a_entry = (unsigned) gstart();
+ workp->a_trsize = 0;
+ workp->a_drsize = 0;
+
+ fname = "savedlisp"; /*set defaults*/
+ reborn = CNIL;
+ argptr = lbot->val;
+ if (argptr != nil) {
+ temp = argptr->d.car;
+ if((TYPE(temp))==ATOM)
+ fname = temp->a.pname;
+ }
+ des2 = open(gstab(),0);
+ if(des2 >= 0) {
+ if(read(des2,&old,sizeof(old))>=0)
+ work.a_syms = old.a_syms;
+ }
+ descrip=creat(fname,0777); /*doit!*/
+ if(-1==write(descrip,workp,sizeof(work)))
+ {
+ close(descrip);
+ error("Dumplisp failed",FALSE);
+ }
+ if(mode == 0413) lseek(descrip,PAGSIZ,0);
+ if( -1==write(descrip,0,workp->a_text) ||
+ -1==write(descrip,workp->a_text,workp->a_data) ) {
+ close(descrip);
+ error("Dumplisp failed",FALSE);
+ }
+ if(des2>0 && work.a_syms) {
+ count = old.a_text + old.a_data + (old.a_magic == 0413 ? PAGSIZ
+ : sizeof(old));
+ if(-1==lseek(des2,count,0))
+ error("Could not seek to stab",FALSE);
+ for(count = old.a_syms;count > 0; count -=BUFSIZ) {
+ ax = read(des2,tbuf,(count < BUFSIZ ? count : BUFSIZ));
+ if(ax==0) {
+ printf("Unexpected end of syms",count);
+ fflush(stdout);
+ break;
+ } else if(ax > 0)
+ write(descrip,tbuf,ax);
+ else
+ error("Failure to write dumplisp stab",FALSE);
+ }
+ if(-1 == lseek(des2,
+ (old.a_magic == 0413 ? PAGSIZ : sizeof(old))
+ + old.a_text + old.a_data
+ + old.a_trsize + old.a_drsize + old.a_syms,
+ 0))
+ error(" Could not seek to string table ",FALSE);
+ for( ax = 1 ; ax > 0;) {
+ ax = read(des2,tbuf,BUFSIZ);
+ if(ax > 0)
+ write(descrip,tbuf,ax);
+ else if (ax < 0)
+ error("Error in string table read ",FALSE);
+ }
+ }
+ close(descrip);
+ if(des2>0) close(des2);
+ reborn = 0;
+
+#ifndef UNIXTS
+ vadvise(VA_NORM);
+#endif