implemented Setup.hs to build boehm cpp libs and install them;
[hs-boehmgc.git] / gc-7.2 / include / ec.h
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 */