Annotation of coherent/b/bin/sh.420/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: #if 0
        !            28:        cp2 = (char *) f ? salloc (cp1 - cp0) : balloc (cp1 - cp0);
        !            29: #else
        !            30:        if ((char *) f)
        !            31:                cp2 = salloc (cp1 - cp0);
        !            32:        else    
        !            33:                cp2 = balloc (cp1 - cp0);
        !            34: #endif
        !            35:        cp1 = cp2;
        !            36:        while (*cp1++=*cp0++)
        !            37:                ;
        !            38:        return (cp2);
        !            39: }
        !            40: 
        !            41: /*
        !            42:  * Create an argument list.
        !            43:  */
        !            44: char **
        !            45: makargl()
        !            46: {
        !            47:        register char **app;
        !            48: 
        !            49:        app = (char **)balloc((1+IALSIZE)*sizeof(char *));
        !            50:        app++;
        !            51:        app[-1] = (char *)IALSIZE;
        !            52:        app[0] = NULL;
        !            53:        return (app);
        !            54: }
        !            55: 
        !            56: /*
        !            57:  * Add an element to an argument list.
        !            58:  */
        !            59: char **
        !            60: addargl(app, sp)
        !            61: char **app;
        !            62: char *sp;
        !            63: {
        !            64:        char **napp;
        !            65:        register char **rapp;
        !            66:        register unsigned n, i;
        !            67: 
        !            68:        rapp = app;
        !            69:        n = (int)rapp[-1];
        !            70:        while (*rapp++ != NULL)
        !            71:                ;
        !            72:        if (rapp-app >= n) {
        !            73:                napp = (char **)balloc((1+n*2)*sizeof(char *));
        !            74:                napp++;
        !            75:                napp[-1] = (char *)(n*2);
        !            76:                for (i=0; i<n; i++)
        !            77:                        napp[i] = app[i];
        !            78:                napp[n-1] = sp;
        !            79:                napp[n] = NULL;
        !            80:                return (napp);
        !            81:        }
        !            82:        *rapp = NULL;
        !            83:        *--rapp = sp;
        !            84:        return (app);
        !            85: }
        !            86: 
        !            87: /*
        !            88:  * Save allocation position.
        !            89:  */
        !            90: BUF **
        !            91: savebuf()
        !            92: {
        !            93:        return (bufapp);
        !            94: }
        !            95: 
        !            96: /*
        !            97:  * Free everything allocated since passed allocation position
        !            98:  * was saved.
        !            99:  */
        !           100: freebuf(bpp)
        !           101: register BUF **bpp;
        !           102: {
        !           103:        *bufapp = buffp;
        !           104:        buffp = *bpp;
        !           105:        *bpp = NULL;
        !           106:        bufapp = bpp;
        !           107: }
        !           108: 
        !           109: /*
        !           110:  * Allocate a buffer 'n' bytes long.
        !           111:  * Add it onto the allocated buffer list.
        !           112:  */
        !           113: char *
        !           114: balloc(n)
        !           115: {
        !           116:        register BUF *bp, **bpp;
        !           117: 
        !           118:        bpp = &buffp;
        !           119:        for (;;) {
        !           120:                if ((bp=*bpp) == NULL) {
        !           121:                        bp = (BUF *) salloc(sizeof (BUF) + n);
        !           122:                        bp->b_size = n;
        !           123:                        break;
        !           124:                }
        !           125:                if (bp->b_size == n) {
        !           126:                        *bpp = bp->b_next;
        !           127:                        break;
        !           128:                }
        !           129:                bpp = &bp->b_next;
        !           130:        }
        !           131:        *bufapp = bp;
        !           132:        bufapp = &bp->b_next;
        !           133:        *bufapp = NULL;
        !           134:        return ((char *) bp + sizeof (BUF));
        !           135: }
        !           136: 
        !           137: /*
        !           138:  * Allocate 'n' bytes.
        !           139:  */
        !           140: char *
        !           141: salloc(n)
        !           142: {
        !           143:        register char *cp;
        !           144:        char    *malloc();
        !           145: 
        !           146:        if ((cp=malloc(n)) == NULL) {
        !           147:                prints("Out of memory\n");
        !           148:                reset(RNOSBRK);
        !           149:                NOTREACHED;
        !           150:        }
        !           151: 
        !           152:        return (cp);
        !           153: }
        !           154: 
        !           155: /*
        !           156:  * Free something possibly allocated by 'salloc'.
        !           157:  *     notmem is part of our customised malloc package which
        !           158:  *     prevents freeing of static strings and automatic variables.
        !           159:  */
        !           160: sfree(cp)
        !           161: char *cp;
        !           162: {
        !           163: #if 0
        !           164:        if (cp != NULL && notmem(cp)) {
        !           165:                fprintf (stderr, "freeing \"%s\" at %x\n", cp, cp);
        !           166:                return;
        !           167:        }
        !           168: #endif
        !           169:        free(cp);
        !           170: }
        !           171: 
        !           172: #ifdef ALLOC_DEBUG
        !           173: /*
        !           174:  * For allocation debugging.
        !           175:  */
        !           176: 
        !           177: void alloc_alloc (debug) struct alloc_debug * debug; {
        !           178:        if (++ debug->count > debug->maxcount) {
        !           179:                debug->maxcount = debug->count;
        !           180:                fprintf (stderr, "%s:%d\n", debug->name, debug->count);
        !           181:        }
        !           182: }
        !           183: 
        !           184: #endif
        !           185: 
        !           186: ALLOC_COUNT (vector)
        !           187: 
        !           188: /*
        !           189:  * Deallocate a vector.
        !           190:  */
        !           191: vfree(vecp)
        !           192: char **vecp;
        !           193: {
        !           194:        register char **vpp;
        !           195: 
        !           196:        if (notmem(vecp))
        !           197:                return;
        !           198:        for (vpp = vecp; *vpp!=NULL; vpp += 1)
        !           199:                sfree(*vpp);
        !           200:        sfree(vecp);
        !           201:        ALLOC_FREE (vector)
        !           202: }
        !           203: 
        !           204: char **
        !           205: vdupl(vecp)
        !           206: char **vecp;
        !           207: {
        !           208:        register char **vp, **nvp, **tvp;
        !           209: 
        !           210:        for (vp=vecp; *vp++ != NULL; );
        !           211:        tvp = nvp = (char **)salloc((vp - vecp) * sizeof *vp);
        !           212:        for (vp=vecp; *vp != NULL; )
        !           213:                *tvp++ = duplstr(*vp++, 1);
        !           214:        *tvp = NULL;
        !           215:        ALLOC_ALLOC (vector);
        !           216:        return (nvp);
        !           217: }
        !           218: 
        !           219: /* 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.