Annotation of researchv9/cmd/sh/stak.c, revision 1.1

1.1     ! root        1: /*     @(#)stak.c      1.4     */
        !             2: /*
        !             3:  * UNIX shell
        !             4:  *
        !             5:  * Bell Telephone Laboratories
        !             6:  *
        !             7:  */
        !             8: 
        !             9: #include       "defs.h"
        !            10: 
        !            11: char *setbrk();
        !            12: 
        !            13: 
        !            14: /* ========    storage allocation      ======== */
        !            15: 
        !            16: char *
        !            17: getstak(asize)                 /* allocate requested stack */
        !            18: int    asize;
        !            19: {
        !            20:        register char   *oldstak;
        !            21:        register int    size;
        !            22: 
        !            23:        size = round(asize, BYTESPERWORD);
        !            24:        oldstak = stakbot;
        !            25:        staktop = stakbot += size;
        !            26:        while (staktop >= brkend)
        !            27:                setbrk(round(staktop - brkend + 1, BRKINCR));
        !            28:        return(oldstak);
        !            29: }
        !            30: 
        !            31: /*
        !            32:  * set up stack for local use
        !            33:  * should be followed by `endstak'
        !            34:  */
        !            35: char *
        !            36: locstak()
        !            37: {
        !            38:        if (brkend - stakbot < BRKINCR)
        !            39:        {
        !            40:                if (setbrk(brkincr) == (char *) -1)
        !            41:                        error(nostack);
        !            42:                if (brkincr < BRKMAX)
        !            43:                        brkincr += 256;
        !            44:        }
        !            45:        return(stakbot);
        !            46: }
        !            47: 
        !            48: char *
        !            49: savstak()
        !            50: {
        !            51:        assert(staktop == stakbot);
        !            52:        return(stakbot);
        !            53: }
        !            54: 
        !            55: char *
        !            56: endstak(argp)          /* tidy up after `locstak' */
        !            57: register char  *argp;
        !            58: {
        !            59:        register char   *oldstak;
        !            60: 
        !            61:        *argp++ = 0;
        !            62:        oldstak = stakbot;
        !            63:        stakbot = staktop = (char *)sround(argp, BYTESPERWORD);
        !            64:        return(oldstak);
        !            65: }
        !            66: 
        !            67: tdystak(x)             /* try to bring stack back to x */
        !            68: register char  *x;
        !            69: {
        !            70:        while ((char *)(stakbsy) > (char *)(x))
        !            71:        {
        !            72:                shfree(stakbsy);
        !            73:                stakbsy = stakbsy->word;
        !            74:        }
        !            75:        staktop = stakbot = max((char *)(x), (char *)(stakbas));
        !            76:        rmtemp(x);
        !            77: }
        !            78: 
        !            79: stakchk()
        !            80: {
        !            81:        if ((brkend - stakbas) > BRKINCR + BRKINCR)
        !            82:                setbrk(-BRKINCR);
        !            83: }
        !            84: 
        !            85: char *
        !            86: cpystak(x)
        !            87: char   *x;
        !            88: {
        !            89:        return(endstak(movstr(x, locstak())));
        !            90: }
        !            91: 
        !            92: setstak(x)
        !            93: char *x;
        !            94: {
        !            95:        staktop = absstak(x);
        !            96:        while (staktop >= brkend)
        !            97:                setbrk(BRKINCR);
        !            98: }
        !            99: 
        !           100: pushstak(c)
        !           101: char c;
        !           102: {
        !           103:        *staktop++ = c;
        !           104:        while (staktop >= brkend)
        !           105:                setbrk(BRKINCR);
        !           106: }

unix.superglobalmegacorp.com

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