1 /* Public domain. */
2 
3 #ifndef BUFFER_H
4 #define BUFFER_H
5 
6 typedef struct buffer {
7   char *x;
8   unsigned int p;
9   unsigned int n;
10   int fd;
11   int (*op)();
12 } buffer;
13 
14 #define BUFFER_INIT(op,fd,buf,len) { (buf), 0, (len), (fd), (op) }
15 #define BUFFER_INSIZE 8192
16 #define BUFFER_OUTSIZE 8192
17 
18 extern void buffer_init(buffer *,int (*)(),int,char *,unsigned int);
19 
20 extern int buffer_flush(buffer *);
21 extern int buffer_put(buffer *,const char *,unsigned int);
22 extern int buffer_putalign(buffer *,const char *,unsigned int);
23 extern int buffer_putflush(buffer *,const char *,unsigned int);
24 extern int buffer_puts(buffer *,const char *);
25 extern int buffer_putsalign(buffer *,const char *);
26 extern int buffer_putsflush(buffer *,const char *);
27 
28 #define buffer_PUTC(s,c) \
29   ( ((s)->n != (s)->p) \
30     ? ( (s)->x[(s)->p++] = (c), 0 ) \
31     : buffer_put((s),&(c),1) \
32   )
33 
34 extern int buffer_get(buffer *,char *,unsigned int);
35 extern int buffer_bget(buffer *,char *,unsigned int);
36 extern int buffer_feed(buffer *);
37 
38 extern char *buffer_peek(buffer *);
39 extern void buffer_seek(buffer *,unsigned int);
40 
41 #define buffer_PEEK(s) ( (s)->x + (s)->n )
42 #define buffer_SEEK(s,len) ( ( (s)->p -= (len) ) , ( (s)->n += (len) ) )
43 
44 #define buffer_GETC(s,c) \
45   ( ((s)->p > 0) \
46     ? ( *(c) = (s)->x[(s)->n], buffer_SEEK((s),1), 1 ) \
47     : buffer_get((s),(c),1) \
48   )
49 
50 extern int buffer_copy(buffer *,buffer *);
51 
52 extern int buffer_unixread(int,char *,unsigned int);
53 extern int buffer_unixwrite(int,const char *,unsigned int);
54 
55 extern buffer *buffer_0;
56 extern buffer *buffer_0small;
57 extern buffer *buffer_1;
58 extern buffer *buffer_1small;
59 extern buffer *buffer_2;
60 
61 #endif
62