Annotation of coherent/b/bin/c/common/talloc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * common/talloc.c
                      3:  * C compiler common library.
                      4:  * Tree space sub-allocator.
                      5:  */
                      6: 
                      7: #ifdef   vax
                      8: #include "INC$LIB:cc0.h"
                      9: #else
                     10: #include "cc0.h"
                     11: #endif
                     12: 
                     13: /*
                     14:  * Tree space management.
                     15:  */
                     16: struct tree_space {
                     17:        struct tree_space *ts_link;
                     18:        char *ts_ptr;
                     19:        char *ts_end;
                     20:        char ts_base[];
                     21: } *ts_bp, *ts_cp;
                     22: int ts_size;
                     23: 
                     24: /*
                     25:  * Allocate some space from the tree area.
                     26:  * Always allocate the size of a tree node,
                     27:  * the other uses are too few and far between
                     28:  * to bother with.
                     29:  * Abort the compiler if no space to get.
                     30:  * To make life a lot easier for the rest of the world,
                     31:  * tree space is zeroed.
                     32:  */
                     33: extern char *malloc();
                     34: char *talloc()
                     35: {
                     36:        register char *p;
                     37:        register int n;
                     38: 
                     39:        n = ts_size;
                     40:        if (ts_cp->ts_ptr == ts_cp->ts_end) {
                     41:            if (ts_cp->ts_link == NULL) {
                     42:                if ((ts_cp->ts_link = malloc(sizeof(*ts_bp)+n*128)) == NULL)
                     43:                    cfatal("out of space in tree node allocator");
                     44:                ts_cp->ts_link->ts_link = NULL;
                     45:            }
                     46:            ts_cp = ts_cp->ts_link;
                     47:            ts_cp->ts_ptr = ts_cp->ts_base;
                     48:            ts_cp->ts_end = ts_cp->ts_base+n*128;
                     49:        }
                     50:        p = ts_cp->ts_ptr += n;
                     51:        while (--n >= 0) *--p = 0;
                     52:        return (p);
                     53: }
                     54: 
                     55: /*
                     56:  * Clear tree space.
                     57:  * If tsize == ts_size then reset the tree allocator.
                     58:  * If tsize != ts_size then free all space allocated
                     59:  * and if tsize != 0 then reallocate with new granularity.
                     60:  * tsize is the size of the tree nodes allocated.
                     61:  */
                     62: newtree(tsize) int tsize;
                     63: {
                     64:        if (tsize != ts_size) {
                     65:                while (ts_bp != NULL) {
                     66:                        ts_cp = ts_bp;
                     67:                        ts_bp = ts_bp->ts_link;
                     68:                        free(ts_cp);
                     69:                }
                     70:                if (ts_size = tsize) {
                     71:                    if ((ts_bp = malloc(sizeof(*ts_bp) + ts_size*128)) == NULL)
                     72:                        cfatal("no space in tree allocator");
                     73:                    ts_bp->ts_link = NULL;
                     74:                } else {
                     75:                    ts_bp = NULL;
                     76:                }
                     77:        }
                     78:        if (ts_cp = ts_bp) {
                     79:                ts_cp->ts_ptr = ts_cp->ts_base;
                     80:                ts_cp->ts_end = ts_cp->ts_base+ts_size*128;
                     81:        }
                     82: }
                     83: 
                     84: /*
                     85:  * Reset tree space to saved location.
                     86:  * Used to parse #if expressions in mid-expression.
                     87:  */
                     88: treset(p) char *p;
                     89: {
                     90:        for (ts_cp = ts_bp; ts_cp != NULL; ts_cp = ts_cp->ts_link)
                     91:                if (ts_cp->ts_base <= p && p <= ts_cp->ts_end)
                     92:                        break;
                     93:        if (ts_cp == NULL) cbotch("tree reset");
                     94:        ts_cp->ts_ptr = p;
                     95: }
                     96: 
                     97: #if    OVERLAID
                     98: /*
                     99:  * Free all of the tree nodes.
                    100:  */
                    101: freetree()
                    102: {
                    103:        newtree(0);
                    104: }
                    105: #endif
                    106: 
                    107: /* end of common/talloc.c */

unix.superglobalmegacorp.com

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