Mercurial > emacs
comparison gc/include/ec.h @ 51488:5de98dce4bd1
*** empty log message ***
author | Dave Love <fx@gnu.org> |
---|---|
date | Thu, 05 Jun 2003 17:49:22 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
51487:01d68b199093 | 51488:5de98dce4bd1 |
---|---|
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 */ |