Annotation of coherent/d/bin/sh/alloc.c, revision 1.1

1.1     ! root        1: /* sh/alloc.c */
        !             2: 
        !             3: #include "sh.h"
        !             4: 
        !             5: extern char    *malloc();
        !             6: 
        !             7: /*
        !             8:  * Externals.
        !             9:  */
        !            10: BUF    *bufap = NULL;                  /* Head of allocation list */
        !            11: BUF    *buffp = NULL;                  /* Tail of free list */
        !            12: BUF    **bufapp = &bufap;              /* Tail of allocation list */
        !            13: 
        !            14: /*
        !            15:  * Given a string, return a pointer to a copy of it.  If 'f'
        !            16:  * is set, don't add it onto the free list.
        !            17:  */
        !            18: char *
        !            19: duplstr(cp0, f)
        !            20: register char *cp0;
        !            21: {
        !            22:        register char *cp1, *cp2;
        !            23: 
        !            24:        cp1 = cp0;
        !            25:        while (*cp1++)
        !            26:                ;
        !            27:        cp2 = (char *) f ? salloc(cp1-cp0) : balloc(cp1-cp0);
        !            28:        cp1 = cp2;
        !            29:        while (*cp1++=*cp0++)
        !            30:                ;
        !            31:        return (cp2);
        !            32: }
        !            33: 
        !            34: /*
        !            35:  * Create an argument list.
        !            36:  */
        !            37: char **
        !            38: makargl()
        !            39: {
        !            40:        register char **app;
        !            41: 
        !            42:        app = (char **)balloc((1+IALSIZE)*sizeof(char *));
        !            43:        app++;
        !            44:        app[-1] = (char *)IALSIZE;
        !            45:        app[0] = NULL;
        !            46:        return (app);
        !            47: }
        !            48: 
        !            49: /*
        !            50:  * Add an element to an argument list.
        !            51:  */
        !            52: char **
        !            53: addargl(app, sp)
        !            54: char **app;
        !            55: char *sp;
        !            56: {
        !            57:        char **napp;
        !            58:        register char **rapp;
        !            59:        register unsigned n, i;
        !            60: 
        !            61:        rapp = app;
        !            62:        n = (int)rapp[-1];
        !            63:        while (*rapp++ != NULL)
        !            64:                ;
        !            65:        if (rapp-app >= n) {
        !            66:                napp = (char **)balloc((1+n*2)*sizeof(char *));
        !            67:                napp++;
        !            68:                napp[-1] = (char *)(n*2);
        !            69:                for (i=0; i<n; i++)
        !            70:                        napp[i] = app[i];
        !            71:                napp[n-1] = sp;
        !            72:                napp[n] = NULL;
        !            73:                return (napp);
        !            74:        }
        !            75:        *rapp = NULL;
        !            76:        *--rapp = sp;
        !            77:        return (app);
        !            78: }
        !            79: 
        !            80: /*
        !            81:  * Save allocation position.
        !            82:  */
        !            83: BUF **
        !            84: savebuf()
        !            85: {
        !            86:        return (bufapp);
        !            87: }
        !            88: 
        !            89: /*
        !            90:  * Free everything allocated since passed allocation position
        !            91:  * was saved.
        !            92:  */
        !            93: freebuf(bpp)
        !            94: register char **bpp;
        !            95: {
        !            96:        *bufapp = buffp;
        !            97:        buffp = *bpp;
        !            98:        *bpp = NULL;
        !            99:        bufapp = bpp;
        !           100: }
        !           101: 
        !           102: /*
        !           103:  * Allocate a buffer 'n' bytes long.
        !           104:  * Add it onto the allocated buffer list.
        !           105:  */
        !           106: char *
        !           107: balloc(n)
        !           108: {
        !           109:        register BUF *bp, **bpp;
        !           110: 
        !           111:        bpp = &buffp;
        !           112:        for (;;) {
        !           113:                if ((bp=*bpp) == NULL) {
        !           114:                        bp = (BUF *) salloc(sizeof (BUF) + n);
        !           115:                        bp->b_size = n;
        !           116:                        break;
        !           117:                }
        !           118:                if (bp->b_size == n) {
        !           119:                        *bpp = bp->b_next;
        !           120:                        break;
        !           121:                }
        !           122:                bpp = &bp->b_next;
        !           123:        }
        !           124:        *bufapp = bp;
        !           125:        bufapp = &bp->b_next;
        !           126:        *bufapp = NULL;
        !           127:        return ((char *) bp + sizeof (BUF));
        !           128: }
        !           129: 
        !           130: /*
        !           131:  * Allocate 'n' bytes.
        !           132:  */
        !           133: char *
        !           134: salloc(n)
        !           135: {
        !           136:        register char *cp;
        !           137:        char    *malloc();
        !           138: 
        !           139:        if ((cp=malloc(n)) == NULL) {
        !           140:                prints("Out of memory\n");
        !           141:                reset(RNOSBRK);
        !           142:                NOTREACHED;
        !           143:        }
        !           144:        return (cp);
        !           145: }
        !           146: 
        !           147: /*
        !           148:  * Free something possibly allocated by 'salloc'.
        !           149:  *     notmem is part of our customised malloc package which
        !           150:  *     prevents freeing of static strings and automatic variables.
        !           151:  */
        !           152: sfree(cp)
        !           153: char *cp;
        !           154: {
        !           155:        if (notmem(cp))
        !           156:                return;
        !           157:        free(cp);
        !           158: }
        !           159: 
        !           160: /*
        !           161:  * Deallocate a vector.
        !           162:  */
        !           163: vfree(vecp)
        !           164: char **vecp;
        !           165: {
        !           166:        register char **vpp;
        !           167: 
        !           168:        if (notmem(vecp))
        !           169:                return;
        !           170:        for (vpp = vecp; *vpp!=NULL; vpp += 1)
        !           171:                sfree(*vpp);
        !           172:        sfree(vecp);
        !           173: }
        !           174: 
        !           175: char **
        !           176: vdupl(vecp)
        !           177: char **vecp;
        !           178: {
        !           179:        register char **vp, **nvp, **tvp;
        !           180: 
        !           181:        for (vp=vecp; *vp++ != NULL; );
        !           182:        tvp = nvp = (char **)salloc((vp - vecp) * sizeof *vp);
        !           183:        for (vp=vecp; *vp != NULL; )
        !           184:                *tvp++ = duplstr(*vp++, 1);
        !           185:        *tvp = NULL;
        !           186:        return (nvp);
        !           187: }
        !           188: 
        !           189: /* end of sh/alloc.c */

unix.superglobalmegacorp.com

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