Annotation of 43BSD/ucb/pascal/src/tree.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)tree.c     5.1 (Berkeley) 6/5/85";
        !             9: #endif not lint
        !            10: 
        !            11: #include "whoami.h"
        !            12: #include "0.h"
        !            13: 
        !            14: /*
        !            15:  * TREE SPACE DECLARATIONS
        !            16:  */
        !            17: struct tr {
        !            18:        int     *tr_low;
        !            19:        int     *tr_high;
        !            20: } ttab[MAXTREE], *tract;
        !            21: 
        !            22: /*
        !            23:  * The variable space is the
        !            24:  * absolute base of the tree segments.
        !            25:  * (exactly the same as ttab[0].tr_low)
        !            26:  * Spacep is maintained to point at the
        !            27:  * beginning of the next tree slot to
        !            28:  * be allocated for use by the grammar.
        !            29:  * Spacep is used "extern" by the semantic
        !            30:  * actions in pas.y.
        !            31:  * The variable tract is maintained to point
        !            32:  * at the tree segment out of which we are
        !            33:  * allocating (the active segment).
        !            34:  */
        !            35: int    *space, *spacep;
        !            36: 
        !            37: /*
        !            38:  * TREENMAX is the maximum width
        !            39:  * in words that any tree node 
        !            40:  * due to the way in which the parser uses
        !            41:  * the pointer spacep.
        !            42:  */
        !            43: #define        TREENMAX        6
        !            44: 
        !            45: int    trspace[ITREE];
        !            46: int    *space  = trspace;
        !            47: int    *spacep = trspace;
        !            48: struct tr *tract       = ttab;
        !            49: 
        !            50: /*
        !            51:  * Inittree allocates the first tree slot
        !            52:  * and sets up the first segment descriptor.
        !            53:  * A lot of this work is actually done statically
        !            54:  * above.
        !            55:  */
        !            56: inittree()
        !            57: {
        !            58: 
        !            59:        ttab[0].tr_low = space;
        !            60:        ttab[0].tr_high = &space[ITREE];
        !            61: }
        !            62: 
        !            63: /*
        !            64:  * Tree builds the nodes in the
        !            65:  * parse tree. It is rarely called
        !            66:  * directly, rather calls are made
        !            67:  * to tree[12345] which supplies the
        !            68:  * first argument to save space in
        !            69:  * the code. Tree also guarantees
        !            70:  * that spacep points to the beginning
        !            71:  * of the next slot it will return,
        !            72:  * a property required by the parser
        !            73:  * which was always true before we
        !            74:  * segmented the tree space.
        !            75:  */
        !            76: /*VARARGS1*/
        !            77: struct tnode *
        !            78: tree(cnt, a)
        !            79:        int cnt;
        !            80: {
        !            81:        register int *p, *q;
        !            82:        register int i;
        !            83: 
        !            84:        i = cnt;
        !            85:        p = spacep;
        !            86:        q = &a;
        !            87:        do
        !            88:                *p++ = *q++;
        !            89:        while (--i);
        !            90:        q = spacep;
        !            91:        spacep = p;
        !            92:        if (p+TREENMAX >= tract->tr_high)
        !            93:                /*
        !            94:                 * this peek-ahead should
        !            95:                 * save a great number of calls
        !            96:                 * to tralloc.
        !            97:                 */
        !            98:                tralloc(TREENMAX);
        !            99:        return ((struct tnode *) q);
        !           100: }
        !           101: 
        !           102: /*
        !           103:  * Tralloc preallocates enough
        !           104:  * space in the tree to allow
        !           105:  * the grammar to use the variable
        !           106:  * spacep, as it did before the
        !           107:  * tree was segmented.
        !           108:  */
        !           109: tralloc(howmuch)
        !           110: {
        !           111:        register char *cp;
        !           112:        register i;
        !           113: 
        !           114:        if (spacep + howmuch >= tract->tr_high) {
        !           115:                i = TRINC;
        !           116:                cp = malloc((unsigned) (i * sizeof ( int )));
        !           117:                if (cp == 0) {
        !           118:                        yerror("Ran out of memory (tralloc)");
        !           119:                        pexit(DIED);
        !           120:                }
        !           121:                spacep = (int *) cp;
        !           122:                tract++;
        !           123:                if (tract >= &ttab[MAXTREE]) {
        !           124:                        yerror("Ran out of tree tables");
        !           125:                        pexit(DIED);
        !           126:                }
        !           127:                tract->tr_low = (int *) cp;
        !           128:                tract->tr_high = tract->tr_low+i;
        !           129:        }
        !           130: }
        !           131: 
        !           132: extern int yylacnt;
        !           133: extern struct B *bottled;
        !           134: #ifdef PXP
        !           135: #endif
        !           136: /*
        !           137:  * Free up the tree segments
        !           138:  * at the end of a block.
        !           139:  * If there is scanner lookahead,
        !           140:  * i.e. if yylacnt != 0 or there is bottled output, then we
        !           141:  * cannot free the tree space.
        !           142:  * This happens only when errors
        !           143:  * occur and the forward move extends
        !           144:  * across "units".
        !           145:  */
        !           146: trfree()
        !           147: {
        !           148: 
        !           149:        if (yylacnt != 0 || bottled != NIL)
        !           150:                return;
        !           151: #ifdef PXP
        !           152:        if (needtree())
        !           153:                return;
        !           154: #endif
        !           155:        spacep = space;
        !           156:        while (tract->tr_low > spacep || tract->tr_high <= spacep) {
        !           157:                free((char *) tract->tr_low);
        !           158:                tract->tr_low = NIL;
        !           159:                tract->tr_high = NIL;
        !           160:                tract--;
        !           161:                if (tract < ttab)
        !           162:                        panic("ttab");
        !           163:        }
        !           164: #ifdef PXP
        !           165:        packtree();
        !           166: #endif
        !           167: }
        !           168: 
        !           169: /*
        !           170:  * Copystr copies a token from
        !           171:  * the "token" buffer into the
        !           172:  * tree space.
        !           173:  */
        !           174: copystr(token)
        !           175:        register char *token;
        !           176: {
        !           177:        register char *cp;
        !           178:        register int i;
        !           179: 
        !           180:        i = (strlen(token) + sizeof ( int )) & ~( ( sizeof ( int ) ) - 1 );
        !           181:        tralloc(i / sizeof ( int ));
        !           182:        (void) pstrcpy((char *) spacep, token);
        !           183:        cp = (char *) spacep;
        !           184:        spacep = ((int *) cp + i);
        !           185:        tralloc(TREENMAX);
        !           186:        return ((int) cp);
        !           187: }

unix.superglobalmegacorp.com

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