Annotation of 43BSD/contrib/icon/rt/alc.c, revision 1.1

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:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.