Annotation of coherent/d/bin/cc/c/common/talloc.c, revision 1.1

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

unix.superglobalmegacorp.com

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