Annotation of OpenXM_contrib2/asir2000/gc/include/ec.h, Revision 1.3
1.1 noro 1: # ifndef EC_H
2: # define EC_H
3:
4: # ifndef CORD_H
5: # include "cord.h"
6: # endif
7:
8: /* Extensible cords are strings that may be destructively appended to. */
9: /* They allow fast construction of cords from characters that are */
10: /* being read from a stream. */
11: /*
12: * A client might look like:
13: *
14: * {
15: * CORD_ec x;
16: * CORD result;
17: * char c;
18: * FILE *f;
19: *
20: * ...
21: * CORD_ec_init(x);
22: * while(...) {
23: * c = getc(f);
24: * ...
25: * CORD_ec_append(x, c);
26: * }
27: * result = CORD_balance(CORD_ec_to_cord(x));
28: *
29: * If a C string is desired as the final result, the call to CORD_balance
30: * may be replaced by a call to CORD_to_char_star.
31: */
32:
33: # ifndef CORD_BUFSZ
34: # define CORD_BUFSZ 128
35: # endif
36:
37: typedef struct CORD_ec_struct {
38: CORD ec_cord;
39: char * ec_bufptr;
40: char ec_buf[CORD_BUFSZ+1];
41: } CORD_ec[1];
42:
43: /* This structure represents the concatenation of ec_cord with */
44: /* ec_buf[0 ... (ec_bufptr-ec_buf-1)] */
45:
46: /* Flush the buffer part of the extended chord into ec_cord. */
47: /* Note that this is almost the only real function, and it is */
48: /* implemented in 6 lines in cordxtra.c */
49: void CORD_ec_flush_buf(CORD_ec x);
50:
51: /* Convert an extensible cord to a cord. */
52: # define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord)
53:
54: /* Initialize an extensible cord. */
55: # define CORD_ec_init(x) ((x)[0].ec_cord = 0, (x)[0].ec_bufptr = (x)[0].ec_buf)
56:
57: /* Append a character to an extensible cord. */
58: # define CORD_ec_append(x, c) \
59: { \
60: if ((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ) { \
61: CORD_ec_flush_buf(x); \
62: } \
63: *((x)[0].ec_bufptr)++ = (c); \
64: }
65:
66: /* Append a cord to an extensible cord. Structure remains shared with */
67: /* original. */
68: void CORD_ec_append_cord(CORD_ec x, CORD s);
69:
70: # endif /* EC_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>