]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 */ |