PageRenderTime 28ms CodeModel.GetById 18ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/gc/include/ec.h

http://github.com/feyeleanor/RubyGoLightly
C++ Header | 70 lines | 25 code | 11 blank | 34 comment | 2 complexity | b1d9c432f2e6709f4eed702f26126ac1 MD5 | raw file
 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 */