|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: #include "../h/gc.h" ! 3: #include "../h/record.h" ! 4: ! 5: /* ! 6: * allocate - returns pointer to nbytes of free storage in heap. ! 7: */ ! 8: ! 9: union block *allocate(nbytes) ! 10: int nbytes; ! 11: { ! 12: register unsigned fspace, *sloc; ! 13: ! 14: /* ! 15: * See if there is enough room in the heap. ! 16: */ ! 17: fspace = maxheap - hpfree; ! 18: if (fspace < nbytes) ! 19: runerr(301, NULL); ! 20: ! 21: /* ! 22: * Decrement the free space in the heap by the number of bytes allocated ! 23: * and return the address of the first byte of the allocated block. ! 24: */ ! 25: sloc = (unsigned *) hpfree; ! 26: heapneed -= nbytes; ! 27: hpfree = hpfree + nbytes; ! 28: return (union block *) (sloc); ! 29: } ! 30: ! 31: #ifdef LONGS ! 32: /* ! 33: * alclint - allocate a long integer block in the heap. ! 34: */ ! 35: ! 36: struct b_int *alclint(val) ! 37: long val; ! 38: { ! 39: register struct b_int *blk; ! 40: extern union block *allocate(); ! 41: ! 42: blk = allocate(sizeof(struct b_int)); ! 43: blk->type = T_LONGINT; ! 44: blk->intval = val; ! 45: return (blk); ! 46: } ! 47: #endif LONGS ! 48: /* ! 49: * alcreal - allocate a real value in the heap. ! 50: */ ! 51: ! 52: struct b_real *alcreal(val) ! 53: double val; ! 54: { ! 55: register struct b_real *blk; ! 56: extern union block *allocate(); ! 57: ! 58: blk = (struct b_real *) allocate(sizeof(struct b_real)); ! 59: blk->type = T_REAL; ! 60: blk->realval = val; ! 61: return (blk); ! 62: } ! 63: ! 64: /* ! 65: * alccset - allocate a cset in the heap. ! 66: */ ! 67: ! 68: struct b_cset *alccset() ! 69: { ! 70: register struct b_cset *blk; ! 71: register i; ! 72: extern union block *allocate(); ! 73: ! 74: blk = (struct b_cset *) allocate(sizeof(struct b_cset)); ! 75: blk->type = T_CSET; ! 76: /* ! 77: * Zero out the bit array. ! 78: */ ! 79: for (i = 0; i < CSETSIZE; i++) ! 80: blk->bits[i] = 0; ! 81: return (blk); ! 82: } ! 83: ! 84: ! 85: /* ! 86: * alcfile - allocate a file block in the heap. ! 87: */ ! 88: ! 89: struct b_file *alcfile(fd, status, name) ! 90: FILE *fd; ! 91: int status; ! 92: struct descrip *name; ! 93: { ! 94: register struct b_file *blk; ! 95: extern union block *allocate(); ! 96: ! 97: blk = (struct b_file *) allocate(sizeof(struct b_file)); ! 98: blk->type = T_FILE; ! 99: blk->fd = fd; ! 100: blk->status = status; ! 101: blk->fname = *name; ! 102: return (blk); ! 103: } ! 104: ! 105: /* ! 106: * alcrecd - allocate record with nfield fields in the heap. ! 107: */ ! 108: ! 109: struct b_record *alcrecd(nfields, recptr) ! 110: int nfields; ! 111: struct b_proc *recptr; ! 112: { ! 113: register struct b_record *blk; ! 114: register i, size; ! 115: extern union block *allocate(); ! 116: ! 117: size = vsizeof(struct b_record) + nfields*sizeof(struct descrip); ! 118: blk = (struct b_record *) allocate(size); ! 119: blk->type = T_RECORD; ! 120: blk->size = size; ! 121: blk->recptr = recptr; ! 122: /* ! 123: * Assign &null to each field in the record. ! 124: */ ! 125: for (i = 0; i < nfields; i++) ! 126: blk->fields[i] = nulldesc; ! 127: return (blk); ! 128: } ! 129: ! 130: /* ! 131: * alclist - allocate a list header block in the heap. ! 132: */ ! 133: ! 134: struct b_list *alclist(size) ! 135: int size; ! 136: { ! 137: register struct b_list *blk; ! 138: extern union block *allocate(); ! 139: ! 140: blk = (struct b_list *) allocate(sizeof(struct b_list)); ! 141: blk->type = T_LIST; ! 142: blk->cursize = size; ! 143: blk->listhead = nulldesc; ! 144: return (blk); ! 145: } ! 146: ! 147: /* ! 148: * alclstb - allocate a list element block in the heap. ! 149: */ ! 150: ! 151: struct b_lelem *alclstb(nelem, first, nused) ! 152: int nelem, first, nused; ! 153: { ! 154: register struct b_lelem *blk; ! 155: register int i, size; ! 156: extern union block *allocate(); ! 157: ! 158: #ifdef MAXLISTSIZE ! 159: if (nelem >= MAXLISTSIZE) ! 160: runerr(205, NULL); ! 161: #endif MAXLISTSIZE ! 162: size = vsizeof(struct b_lelem)+nelem*sizeof(struct descrip); ! 163: blk = (struct b_lelem *) allocate(size); ! 164: blk->type = T_LELEM; ! 165: blk->size = size; ! 166: blk->nelem = nelem; ! 167: blk->first = first; ! 168: blk->nused = nused; ! 169: blk->listprev = nulldesc; ! 170: blk->listnext = nulldesc; ! 171: /* ! 172: * Set all elements to &null. ! 173: */ ! 174: for (i = 0; i < nelem; i++) ! 175: blk->lslots[i] = nulldesc; ! 176: return (blk); ! 177: } ! 178: ! 179: /* ! 180: * alctable - allocate a table header block in the heap. ! 181: */ ! 182: ! 183: struct b_table *alctable(def) ! 184: struct descrip *def; ! 185: { ! 186: register int i; ! 187: register struct b_table *blk; ! 188: extern union block *allocate(); ! 189: ! 190: blk = (struct b_table *) allocate(sizeof(struct b_table)); ! 191: blk->type = T_TABLE; ! 192: blk->cursize = 0; ! 193: blk->defvalue = *def; ! 194: /* ! 195: * Zero out the buckets. ! 196: */ ! 197: for (i = 0; i < NBUCKETS; i++) ! 198: blk->buckets[i] = nulldesc; ! 199: return (blk); ! 200: } ! 201: /* ! 202: * alctelem - allocate a table element block in the heap. ! 203: */ ! 204: ! 205: struct b_telem *alctelem() ! 206: { ! 207: register struct b_telem *blk; ! 208: extern union block *allocate(); ! 209: ! 210: blk = (struct b_telem *) allocate(sizeof(struct b_telem)); ! 211: blk->type = T_TELEM; ! 212: blk->hashnum = 0; ! 213: blk->blink = nulldesc; ! 214: blk->tref = nulldesc; ! 215: blk->tval = nulldesc; ! 216: return (blk); ! 217: } ! 218: #ifdef SETS ! 219: ! 220: /* ! 221: * alcset - allocate a set header heap block. ! 222: */ ! 223: ! 224: struct b_set *alcset() ! 225: { ! 226: register int i; ! 227: register struct b_set *blk; ! 228: extern union block *allocate(); ! 229: ! 230: blk = (struct b_set *) allocate(sizeof(struct b_set)); ! 231: blk->type = T_SET; ! 232: blk->setsize = 0; ! 233: /* ! 234: * Zero out the buckets. ! 235: */ ! 236: for (i = 0; i < NBUCKETS; i++) ! 237: blk->sbucks[i] = nulldesc; ! 238: return (blk); ! 239: } ! 240: ! 241: /* ! 242: * alcselem - allocate a set element heap block. ! 243: */ ! 244: ! 245: struct b_selem *alcselem(mbr,hn) ! 246: int hn; ! 247: struct descrip *mbr; ! 248: ! 249: { register struct b_selem *blk; ! 250: extern union block *allocate(); ! 251: ! 252: blk = (struct b_selem *) allocate(sizeof(struct b_selem)); ! 253: blk->type = T_SELEM; ! 254: blk->sblink = nulldesc; ! 255: blk->setmem = *mbr; ! 256: blk->hnum = hn; ! 257: return (blk); ! 258: } ! 259: #endif SETS ! 260: ! 261: /* ! 262: * alcsubs - allocate a substring trapped variable in heap. ! 263: */ ! 264: ! 265: struct b_tvsubs *alcsubs(len, pos, var) ! 266: int len, pos; ! 267: struct descrip *var; ! 268: { ! 269: register struct b_tvsubs *blk; ! 270: extern union block *allocate(); ! 271: ! 272: blk = (struct b_tvsubs *) allocate(sizeof(struct b_tvsubs)); ! 273: blk->type = T_TVSUBS; ! 274: blk->sslen = len; ! 275: blk->sspos = pos; ! 276: blk->ssvar = *var; ! 277: return (blk); ! 278: } ! 279: ! 280: /* ! 281: * alctvtbl - allocate a table element trapped variable block in the heap. ! 282: */ ! 283: ! 284: struct b_tvtbl *alctvtbl(tbl, ref, hnum) ! 285: register struct descrip *tbl, *ref; ! 286: int hnum; ! 287: { ! 288: register struct b_tvtbl *blk; ! 289: extern union block *allocate(); ! 290: ! 291: blk = (struct b_tvtbl *) allocate(sizeof(struct b_tvtbl)); ! 292: blk->type = T_TVTBL; ! 293: blk->hashnum = hnum; ! 294: blk->tvtable = *tbl; ! 295: blk->tvtref = *ref; ! 296: blk->tvtval = nulldesc; ! 297: return (blk); ! 298: } ! 299: ! 300: /* ! 301: * alcstr - allocate a string in the string space. ! 302: */ ! 303: ! 304: char *alcstr(s, slen) ! 305: register char *s; ! 306: register int slen; ! 307: { ! 308: register char *d; ! 309: char *ofree; ! 310: ! 311: /* ! 312: * See if there is enough room in the string space. ! 313: */ ! 314: if (sfree + slen > estrings) ! 315: runerr(302, NULL); ! 316: strneed -= slen; ! 317: /* ! 318: * Copy the string into the string space, saving a pointer to its ! 319: * beginning. Note that s may be null, in which case the space is ! 320: * still to be allocated, but nothing is to be copied into it. ! 321: */ ! 322: ofree = d = sfree; ! 323: if (s != NULL) { ! 324: while (slen-- > 0) ! 325: *d++ = *s++; ! 326: } ! 327: else ! 328: d += slen; ! 329: sfree = d; ! 330: return (ofree); ! 331: } ! 332: ! 333: /* ! 334: * alcestk - allocate a co-expression stack block. ! 335: */ ! 336: ! 337: struct b_estack *alcestk() ! 338: { ! 339: struct b_estack *ep; ! 340: ! 341: if (esfree == NULL) ! 342: syserr("no expression stack space"); ! 343: /* ! 344: * Locate the start of the block. ! 345: */ ! 346: ep = (struct b_estack *) (esfree + ! 347: (stksize-sizeof(struct b_estack)/WORDSIZE)); ! 348: /* ! 349: * Move co-expression stack free-list pointer to next stack. ! 350: */ ! 351: esfree = (int *) *esfree; ! 352: ep->type = T_ESTACK; ! 353: return (ep); ! 354: } ! 355: ! 356: /* ! 357: * alceblk - allocate a co-expression heap block. ! 358: */ ! 359: ! 360: struct b_eblock *alceblk(entry, na, nl) ! 361: int *entry, na, nl; ! 362: { ! 363: int size; ! 364: struct b_eblock *blk; ! 365: extern union block *allocate(); ! 366: ! 367: size = vsizeof(struct b_eblock)+(na+nl+1)*sizeof(struct descrip); ! 368: blk = (struct b_eblock *) allocate(size); ! 369: blk->type = T_EBLOCK; ! 370: blk->size = size; ! 371: blk->ep = entry; ! 372: blk->numargs = na; ! 373: blk->numlocals = nl; ! 374: return (blk); ! 375: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.