|
|
1.1 ! root 1: static char *sccsid = "@(#)fex3.c 34.2 10/13/80"; ! 2: ! 3: #include "global.h" ! 4: #include <vadvise.h> ! 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. */ ! 10: #ifdef chkarg ! 11: #undef chkarg ! 12: #endif ! 13: chkarg(expnum,string) ! 14: int expnum; /* expected number of args */ ! 15: char string[]; ! 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; ! 24: } ! 25: ! 26: ! 27: /* ! 28: *Ndumplisp -- create executable version of current state of this lisp. ! 29: */ ! 30: #include "a.out.h" ! 31: ! 32: asm(" .globl Dlast") ! 33: lispval ! 34: Ndumplisp() ! 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; ! 42: extern int dmpmode,holend,curhbeg,usehole; ! 43: extern int end; ! 44: int descrip, des2, count, ax,mode; ! 45: char tbuf[BUFSIZ]; ! 46: snpand(4); ! 47: ! 48: ! 49: #ifndef UNIXTS ! 50: vadvise(VA_ANOM); ! 51: #endif ! 52: ! 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; ! 62: if(usehole) ! 63: workp->a_text = curhbeg & (~PAGRND); ! 64: else ! 65: workp->a_text = ((((unsigned) (&holend)) - 1) & (~PAGRND)) + PAGSIZ; ! 66: #ifndef VMS ! 67: workp->a_data = (unsigned) sbrk(0) - workp->a_text; ! 68: #else ! 69: workp->a_data = ((int)&end) - workp->a_text; ! 70: #endif ! 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) { ! 81: temp = argptr->d.car; ! 82: if((TYPE(temp))==ATOM) ! 83: fname = temp->a.pname; ! 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; ! 123: ! 124: #ifndef UNIXTS ! 125: vadvise(VA_NORM); ! 126: #endif ! 127: return(nil); ! 128: } ! 129: ! 130: lispval ! 131: Nndumplisp() ! 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 ! 231: return(nil); ! 232: } ! 233: lispval ! 234: typred(typ,ptr) ! 235: int typ; ! 236: lispval 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: } ! 243: lispval ! 244: Nfunction() ! 245: { ! 246: register lispval handy; ! 247: ! 248: snpand(1); ! 249: handy = lbot->val->d.car; ! 250: if(TYPE(handy)==ATOM && handy->a.fnbnd!=nil) ! 251: return(handy->a.fnbnd); ! 252: else ! 253: return(handy); ! 254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.