|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.