source: trunk/gcc/boehm-gc/include/ec.h@ 3232

Last change on this file since 3232 was 2, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 1.7 KB
Line 
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
37typedef 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 */
49void 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. */
68void CORD_ec_append_cord(CORD_ec x, CORD s);
69
70# endif /* EC_H */
Note: See TracBrowser for help on using the repository browser.