home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / k / ksh48.zip / sh / expand.h < prev    next >
C/C++ Source or Header  |  1992-05-03  |  2KB  |  94 lines

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