Annotation of coherent/a/usr/bob/korn/expand.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Expandable strings
        !             3:  *
        !             4:  * Usage
        !             5:  *     XString xs;
        !             6:  *     char *xp;
        !             7:  *
        !             8:  *     Xinit(xs, xp, 128);
        !             9:  *     while ((c = generate()) {
        !            10:  *             Xcheck(xs, xp);
        !            11:  *             Xput(xs, xp, c);
        !            12:  *     }
        !            13:  *     return Xclose(xs, xp);
        !            14:  */
        !            15: 
        !            16: typedef struct XString {
        !            17:        char   *end, *beg;      /* end, begin of string */
        !            18: #if 1
        !            19:        char   *oth, *old;      /* togo, adjust */
        !            20: #endif
        !            21:        size_t  len;            /* length */
        !            22: } XString;
        !            23: 
        !            24: typedef char * XStringP;
        !            25: 
        !            26: /* initialize expandable string */
        !            27: #define        Xinit(xs, xp, length) { \
        !            28:                        (xs).len = length; \
        !            29:                        (xs).beg = alloc((xs).len + 4, ATEMP); \
        !            30:                        (xs).end = (xs).beg + (xs).len; \
        !            31:                        xp = (xs).beg; \
        !            32:                }
        !            33: 
        !            34: /* stuff char into string */
        !            35: #define        Xput(xs, xp, c) *xp++ = (c)
        !            36: 
        !            37: /* check for overflow, expand string */
        !            38: #define        Xcheck(xs, xp) if (xp >= (xs).end) { \
        !            39:                        char *old_beg = (xs).beg; \
        !            40:                        (xs).len += (xs).len; \
        !            41:                        (xs).beg = alloc((xs).len + 4, ATEMP); \
        !            42:                        (xs).end = (xs).beg + (xs).len; \
        !            43:                        memcpy((xs).beg, old_beg, (size_t)(xp - old_beg)); \
        !            44:                        afree((Void*) old_beg, ATEMP); \
        !            45:                        xp = (xs).beg + (xp - old_beg); \
        !            46:                }
        !            47: 
        !            48: /* free string */
        !            49: #define        Xfree(xs, xp)   afree((Void*) (xs).beg, ATEMP)
        !            50: 
        !            51: /* close, return string */
        !            52: #define        Xclose(xs, xp)  (char*) aresize((Void*)(xs).beg, \
        !            53:                                        (size_t)(xp - (xs).beg), ATEMP)
        !            54: /* begin of string */
        !            55: #define        Xstring(xs, xp) ((xs).beg)
        !            56: 
        !            57: #define        Xsavepos(xs, xp) (xp - (xs).beg)
        !            58: #define        Xrestpos(xs, xp, n) ((xs).beg + (n))
        !            59: 
        !            60: /*
        !            61:  * expandable vector of generic pointers
        !            62:  */
        !            63: 
        !            64: typedef struct XPtrV {
        !            65:        Void  **cur;            /* next avail ptr */
        !            66:        Void  **beg, **end;     /* begin, end of vector */
        !            67: } XPtrV;
        !            68: 
        !            69: #define        XPinit(x, n) { \
        !            70:                        register Void **vp; \
        !            71:                        vp = (Void**) alloc(sizeofN(Void*, n), ATEMP); \
        !            72:                        (x).cur = (x).beg = vp; \
        !            73:                        (x).end = vp + n; \
        !            74:                        }
        !            75: 
        !            76: #define        XPput(x, p) { \
        !            77:                        if ((x).cur >= (x).end) \
        !            78:                                xpexpand(&(x)); \
        !            79:                        *(x).cur++ = (p); \
        !            80:                        }
        !            81: 
        !            82: #define        XPptrv(x)       ((x).beg)
        !            83: #define        XPsize(x)       ((x).cur - (x).beg)
        !            84: 
        !            85: #define        XPclose(x)      (Void**) aresize((Void*)(x).beg, \
        !            86:                                         sizeofN(Void*, XPsize(x)), ATEMP)
        !            87: 
        !            88: #define        XPfree(x)       afree((Void*) (x).beg, ATEMP)
        !            89: 

unix.superglobalmegacorp.com

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