90 lines
2.7 KiB
C
90 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
|
|
*
|
|
* THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
|
|
* OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
|
|
*
|
|
* Permission is hereby granted to use or copy this program
|
|
* for any purpose, provided the above notices are retained on all copies.
|
|
* Permission to modify the code and to distribute modified code is granted,
|
|
* provided the above notices are retained, and a notice that the code was
|
|
* modified is included with the above copyright notice.
|
|
*/
|
|
|
|
#ifndef EC_H
|
|
#define EC_H
|
|
|
|
# ifndef CORD_H
|
|
# include "cord.h"
|
|
# endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Extensible cords are strings that may be destructively appended to. */
|
|
/* They allow fast construction of cords from characters that are */
|
|
/* being read from a stream. */
|
|
/*
|
|
* A client might look like:
|
|
*
|
|
* {
|
|
* CORD_ec x;
|
|
* CORD result;
|
|
* char c;
|
|
* FILE *f;
|
|
*
|
|
* ...
|
|
* CORD_ec_init(x);
|
|
* while(...) {
|
|
* c = getc(f);
|
|
* ...
|
|
* CORD_ec_append(x, c);
|
|
* }
|
|
* result = CORD_balance(CORD_ec_to_cord(x));
|
|
*
|
|
* If a C string is desired as the final result, the call to CORD_balance
|
|
* may be replaced by a call to CORD_to_char_star.
|
|
*/
|
|
|
|
# ifndef CORD_BUFSZ
|
|
# define CORD_BUFSZ 128
|
|
# endif
|
|
|
|
typedef struct CORD_ec_struct {
|
|
CORD ec_cord;
|
|
char * ec_bufptr;
|
|
char ec_buf[CORD_BUFSZ+1];
|
|
} CORD_ec[1];
|
|
|
|
/* This structure represents the concatenation of ec_cord with */
|
|
/* ec_buf[0 ... (ec_bufptr-ec_buf-1)] */
|
|
|
|
/* Flush the buffer part of the extended cord into ec_cord. */
|
|
/* Note that this is almost the only real function, and it is */
|
|
/* implemented in 6 lines in cordxtra.c */
|
|
void CORD_ec_flush_buf(CORD_ec x);
|
|
|
|
/* Convert an extensible cord to a cord. */
|
|
# define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord)
|
|
|
|
/* Initialize an extensible cord. */
|
|
#define CORD_ec_init(x) \
|
|
((x)[0].ec_cord = 0, (void)((x)[0].ec_bufptr = (x)[0].ec_buf))
|
|
|
|
/* Append a character to an extensible cord. */
|
|
#define CORD_ec_append(x, c) \
|
|
((void)((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ \
|
|
? (CORD_ec_flush_buf(x), 0) : 0), \
|
|
(void)(*(x)[0].ec_bufptr++ = (c)))
|
|
|
|
/* Append a cord to an extensible cord. Structure remains shared with */
|
|
/* original. */
|
|
void CORD_ec_append_cord(CORD_ec x, CORD s);
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif /* EC_H */
|