|
|
1.1 ! root 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. */ ! 7: chkarg(expnum) ! 8: int 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: ! 26: asm(" .globl Dlast") ! 27: lispval ! 28: Ndumplisp() ! 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: } ! 106: lispval ! 107: typred(typ,ptr) ! 108: int typ; ! 109: lispval 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: } ! 116: lispval ! 117: Nfunction() ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.