/*
* The basic data type is a line buffer, in which blocks of lines are
* allocated. The line buffer can be made inactive, to make it use as little
* system resources as possible.
* Blocks can be created, deleted, queried for their size, split in two, or
* concatenated. Blocks are never actually deleted in a line buffer, but a
* fake delete operation is added for the sake of completeness.
*/
typedef Int block;
typedef struct _btbuf_ {
long offset; /* offset in tmpfile */
struct _btbuf_ *prev; /* prev in linked list */
struct _btbuf_ *next; /* next in linked list */
char *buf; /* buffer with blocks and text */
} btbuf;
typedef struct {
char *file; /* tmpfile name */
int fd; /* tmpfile fd */
char *buf; /* current low-level buffer */
int blksz; /* block size in write buffer */
int txtsz; /* text size in write buffer */
void (*putline) P((char*, char*)); /* output line function */
char *context; /* context for putline */
bool reverse; /* for bk_put() */
btbuf *wb; /* write buffer */
btbuf bt[NR_EDBUFS]; /* read & write buffers */
} linebuf;
extern linebuf *lb_new P((linebuf*, char*));
extern void lb_del P((linebuf*));
extern void lb_inact P((linebuf*));
extern block bk_new P((linebuf*, char*(*)(char*), char*));
# define bk_del(linebuf, block) /* nothing */
extern Int bk_size P((linebuf*, block));
extern void bk_split P((linebuf*, block, Int, block*, block*));
extern block bk_cat P((linebuf*, block, block));
extern void bk_put P((linebuf*, block, Int, Int, void(*)(char*, char*),
char*, int));