1 #ifndef BUFFER_H
2 #define BUFFER_H
3 
4 typedef struct buffer {
5   char *x;
6   unsigned int p;
7   unsigned int n;
8   unsigned int a;
9   int fd;
10   int (*op)();
11 } buffer;
12 
13 #define BUFFER_INIT(op,fd,buf,len) { (buf), 0, 0, (len), (fd), (op) }
14 #define BUFFER_INIT_READ(op,fd,buf,len) BUFFER_INIT(op,fd,buf,len) /*obsolete*/
15 #define BUFFER_INSIZE 8192
16 #define BUFFER_OUTSIZE 8192
17 
18 extern void buffer_init(buffer* b,int (*op)(),int fd,char* y,unsigned int ylen);
19 
20 extern int buffer_flush(buffer* b);
21 extern int buffer_put(buffer* b,const char* x,unsigned int len);
22 extern int buffer_putalign(buffer* b,const char* x,unsigned int len);
23 extern int buffer_putflush(buffer* b,const char* x,unsigned int len);
24 extern int buffer_puts(buffer* b,const char* x);
25 extern int buffer_putsalign(buffer* b,const char* x);
26 extern int buffer_putsflush(buffer* b,const char* x);
27 
28 extern int buffer_putspace(buffer* b);
29 
30 #define buffer_PUTC(s,c) \
31   ( ((s)->a != (s)->p) \
32     ? ( (s)->x[(s)->p++] = (c), 0 ) \
33     : buffer_put((s),&(c),1) \
34   )
35 
36 extern int buffer_get(buffer* b,char* x,unsigned int len);
37 extern int buffer_bget(buffer* b,char* x,unsigned int len);
38 extern int buffer_feed(buffer* b);
39 extern int buffer_getc(buffer* b,char* x);
40 extern int buffer_getn(buffer* b,char* x,unsigned int len);
41 extern int buffer_get_token(buffer* b,char* x,unsigned int len,const char* charset,unsigned int setlen);
42 #define buffer_getline(b,x,len) buffer_get_token((b),(x),(len),"\n",1)
43 
44 extern char *buffer_peek(buffer* b);
45 extern void buffer_seek(buffer* b,unsigned int len);
46 
47 #define buffer_PEEK(s) ( (s)->x + (s)->p )
48 #define buffer_SEEK(s,len) ( (s)->p += (len) )
49 
50 #define buffer_GETC(s,c) \
51   ( ((s)->p < (s>->n) \
52     ? ( *(c) = *buffer_PEEK(s), buffer_SEEK((s),1), 1 ) \
53     : buffer_get((s),(c),1) \
54   )
55 
56 extern int buffer_copy(buffer* out,buffer* in);
57 
58 extern int buffer_putulong(buffer *b,unsigned long l);
59 extern int buffer_put8long(buffer *b,unsigned long l);
60 extern int buffer_putxlong(buffer *b,unsigned long l);
61 extern int buffer_putlong(buffer *b,unsigned long l);
62 extern int buffer_putulonglong(buffer *b,unsigned long long l);
63 
64 extern buffer *buffer_0;
65 extern buffer *buffer_0small;
66 extern buffer *buffer_1;
67 extern buffer *buffer_1small;
68 extern buffer *buffer_2;
69 
70 #endif
71