~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gc/include/ec.h

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2006-05-17 02:46:26 UTC
  • Revision ID: james.westby@ubuntu.com-20060517024626-lljr08ftv9g9vefl
Tags: upstream-0.9h-20060510
ImportĀ upstreamĀ versionĀ 0.9h-20060510

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */