Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
+91
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
/**
|
||||
* This structure represents the concatenation of `ec_cord` with
|
||||
* `ec_buf[0 .. ec_bufptr - ec_buf - 1]`.
|
||||
*/
|
||||
typedef struct CORD_ec_struct {
|
||||
CORD ec_cord;
|
||||
char *ec_bufptr;
|
||||
char ec_buf[CORD_BUFSZ + 1];
|
||||
} CORD_ec[1];
|
||||
|
||||
/** Flush the buffer part of the extended cord into extensible cord. */
|
||||
CORD_API void CORD_ec_flush_buf(CORD_ec);
|
||||
|
||||
/** 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
|
||||
* the original.
|
||||
*/
|
||||
CORD_API void CORD_ec_append_cord(CORD_ec, CORD);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* EC_H */
|
||||
Reference in new issue
Block a user