Annotation of 43BSD/contrib/pathalias/mem.c, revision 1.1

1.1     ! root        1: /* pathalias -- by steve bellovin, as told to peter honeyman */
        !             2: #ifndef lint
        !             3: static char    *sccsid = "@(#)mem.c    8.1 (down!honey) 86/01/19";
        !             4: #endif
        !             5: 
        !             6: #include "def.h"
        !             7: 
        !             8: /* imported */
        !             9: extern char *sbrk();
        !            10: 
        !            11: link   *
        !            12: newlink()
        !            13: {
        !            14:        link    *rval;
        !            15: 
        !            16:        if ((rval = (link * ) calloc(1, sizeof(link))) == 0)
        !            17:                nomem();
        !            18:        return(rval);
        !            19: }
        !            20: 
        !            21: node   *
        !            22: newnode()
        !            23: {
        !            24:        node    *rval;
        !            25: 
        !            26:        if ((rval = (node * ) calloc(1, sizeof(node))) == 0)
        !            27:                nomem();
        !            28:        Ncount++;
        !            29:        return(rval);
        !            30: }
        !            31: 
        !            32: char   *
        !            33: strsave(s)
        !            34: char   *s;
        !            35: {
        !            36:        char *r;
        !            37: 
        !            38:        if ((r = malloc((unsigned int) strlen(s) + 1)) == 0)
        !            39:                nomem();
        !            40:        (void) strcpy(r, s);
        !            41:        return(r);
        !            42: }
        !            43: 
        !            44: #ifndef strclear
        !            45: void
        !            46: strclear(dst, len)
        !            47: register char *dst;
        !            48: register int len;
        !            49: {
        !            50:        while (--len >= 0)
        !            51:                *dst++ = 0;
        !            52: }
        !            53: #endif /*strclear*/
        !            54: 
        !            55: node   **
        !            56: newtable(size)
        !            57: long   size;
        !            58: {
        !            59:        node    **rval;
        !            60: 
        !            61:        if ((rval = (node **) calloc(1, (unsigned int) (size * sizeof(*rval)))) == 0) 
        !            62:                nomem();
        !            63:        return(rval);
        !            64: }
        !            65: 
        !            66: freetable(t, size)
        !            67: node   **t;
        !            68: long   size;
        !            69: {
        !            70: #ifdef MYMALLOC
        !            71:        addtoheap((char *) t, (long) (size * sizeof(*t)));
        !            72: #else
        !            73:        free((char *) t);
        !            74: #endif
        !            75: }
        !            76: 
        !            77: nomem()
        !            78: {
        !            79:        fprintf(stderr, "%s: Out of memory (%ldk allocated)\n",
        !            80:                        ProgName, allocation());
        !            81:        badmagic(1);
        !            82: }
        !            83: 
        !            84: /* data space allocation -- main sets End very early */
        !            85: allocation()
        !            86: {
        !            87:        static char     *dataspace;
        !            88: 
        !            89:        if (dataspace == 0) {   /* first time */
        !            90:                dataspace = sbrk(0);            /* &end? */
        !            91:                return(0);
        !            92:        }
        !            93:        return((sbrk(0) - dataspace)/1024);
        !            94: }
        !            95: 
        !            96: #ifdef MYMALLOC
        !            97: 
        !            98: /* use c library malloc/calloc here, and here only */
        !            99: #undef malloc
        !           100: #undef calloc
        !           101: extern char *malloc(), *calloc();
        !           102: 
        !           103: /* allocate in MBUFSIZ chunks.  4k works ok (less 16 for malloc quirks). */
        !           104: #define MBUFSIZ (4 * 1024 - 16)
        !           105: 
        !           106: /* 
        !           107:  * mess with ALIGN at your peril.  longword (== 0 mod 4)
        !           108:  * alignment seems to work everywhere.
        !           109:  */
        !           110: 
        !           111: #define ALIGN 2
        !           112: 
        !           113: typedef struct heap heap;
        !           114: struct heap {
        !           115:        heap *h_next;
        !           116:        long h_size;
        !           117: };
        !           118: 
        !           119: static heap *Mheap;    /* not to be confused with a priority queue */
        !           120: 
        !           121: addtoheap(p, size)
        !           122: char *p;
        !           123: long size;
        !           124: {
        !           125:        int adjustment;
        !           126:        heap *pheap;
        !           127: 
        !           128:        /* p is aligned, but it doesn't hurt to check */
        !           129:        adjustment = align(p);
        !           130:        p += adjustment;
        !           131:        size -= adjustment;
        !           132: 
        !           133:        if (size < 1024)
        !           134:                return;         /* can't happen */
        !           135:        pheap = (heap *) p;     /* pheap is shorthand */
        !           136:        pheap->h_next = Mheap;
        !           137:        pheap->h_size = size;
        !           138:        Mheap = pheap;
        !           139: }
        !           140: 
        !           141: /*
        !           142:  * buffered malloc()
        !           143:  *     returns space initialized to 0.  calloc isn't used, since
        !           144:  *     strclear can be faster.
        !           145:  *
        !           146:  * free is ignored, except for very large objects,
        !           147:  * which are returned to the heap with addtoheap(). 
        !           148:  */
        !           149: 
        !           150: char   *
        !           151: mymalloc(n)
        !           152: register unsigned int  n;
        !           153: {
        !           154:        static long     size;           /* how much do we have on hand? */
        !           155:        static char     *mstash;        /* where is it?  (kept aligned) */
        !           156:        register char   *rval;
        !           157: 
        !           158:        n += align((char *) n); /* keep everything aligned */
        !           159:        if (n >= 1024) {                /* from hash table */
        !           160:                rval = malloc(n);       /* aligned */
        !           161:                strclear(rval, n);
        !           162:                return(rval);
        !           163:        }
        !           164:        
        !           165: 
        !           166:        if (n > size) {
        !           167:                /* look in the heap (already aligned) */
        !           168:                if (Mheap) {
        !           169:                        mstash = (char *) Mheap;
        !           170:                        size = Mheap->h_size;
        !           171:                        Mheap = Mheap->h_next;
        !           172:                } else {
        !           173:                        mstash = malloc(MBUFSIZ);       /* aligned */
        !           174:                        if (mstash == 0) {
        !           175:                                size = 0;
        !           176:                                return(0);
        !           177:                        }
        !           178:                        size = MBUFSIZ;
        !           179:                }
        !           180:                strclear(mstash, size);
        !           181:        }
        !           182:        rval = mstash;
        !           183:        mstash += n;
        !           184:        size -= n;
        !           185:        return(rval);
        !           186: }
        !           187: 
        !           188: /* what's the (mis-)alignment of n?  return the complement of (n mod 2^ALIGN) */
        !           189: align(n)
        !           190: char   *n;
        !           191: {
        !           192:        int     abits;  /* misalignment bits in n */
        !           193: 
        !           194:        abits = (int) n & ~(0xff << ALIGN) & 0xff;
        !           195:        if (abits == 0)
        !           196:                return(0);
        !           197:        return((1 << ALIGN) - abits);
        !           198: }
        !           199: 
        !           200: #endif /*MYMALLOC*/

unix.superglobalmegacorp.com

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