Blob


1 #ifndef _BIO_H_
2 #define _BIO_H_ 1
3 #if defined(__cplusplus)
4 extern "C" {
5 #endif
7 #ifdef AUTOLIB
8 AUTOLIB(bio)
9 #endif
11 #include <sys/types.h> /* for off_t */
12 #include <fcntl.h> /* for O_RDONLY, O_WRONLY */
14 typedef struct Biobuf Biobuf;
16 enum
17 {
18 Bsize = 8*1024,
19 Bungetsize = 4, /* space for ungetc */
20 Bmagic = 0x314159,
21 Beof = -1,
22 Bbad = -2,
24 Binactive = 0, /* states */
25 Bractive,
26 Bwactive,
27 Bracteof,
29 Bend
30 };
32 struct Biobuf
33 {
34 int icount; /* neg num of bytes at eob */
35 int ocount; /* num of bytes at bob */
36 int rdline; /* num of bytes after rdline */
37 int runesize; /* num of bytes of last getrune */
38 int state; /* r/w/inactive */
39 int fid; /* open file */
40 int flag; /* magic if malloc'ed */
41 off_t offset; /* offset of buffer in file */
42 int bsize; /* size of buffer */
43 unsigned char* bbuf; /* pointer to beginning of buffer */
44 unsigned char* ebuf; /* pointer to end of buffer */
45 unsigned char* gbuf; /* pointer to good data in buf */
46 unsigned char b[Bungetsize+Bsize];
47 };
49 #define BGETC(bp)\
50 ((bp)->icount?(bp)->bbuf[(bp)->bsize+(bp)->icount++]:Bgetc((bp)))
51 #define BPUTC(bp,c)\
52 ((bp)->ocount?(bp)->bbuf[(bp)->bsize+(bp)->ocount++]=(c),0:Bputc((bp),(c)))
53 #define BOFFSET(bp)\
54 (((bp)->state==Bractive)?\
55 (bp)->offset + (bp)->icount:\
56 (((bp)->state==Bwactive)?\
57 (bp)->offset + ((bp)->bsize + (bp)->ocount):\
58 -1))
59 #define BLINELEN(bp)\
60 (bp)->rdline
61 #define BFILDES(bp)\
62 (bp)->fid
64 int Bbuffered(Biobuf*);
65 Biobuf* Bfdopen(int, int);
66 int Bfildes(Biobuf*);
67 int Bflush(Biobuf*);
68 int Bgetc(Biobuf*);
69 int Bgetd(Biobuf*, double*);
70 long Bgetrune(Biobuf*);
71 int Binit(Biobuf*, int, int);
72 int Binits(Biobuf*, int, int, unsigned char*, int);
73 int Blinelen(Biobuf*);
74 off_t Boffset(Biobuf*);
75 Biobuf* Bopen(char*, int);
76 int Bprint(Biobuf*, char*, ...);
77 int Bputc(Biobuf*, int);
78 int Bputrune(Biobuf*, long);
79 void* Brdline(Biobuf*, int);
80 char* Brdstr(Biobuf*, int, int);
81 long Bread(Biobuf*, void*, long);
82 off_t Bseek(Biobuf*, off_t, int);
83 int Bterm(Biobuf*);
84 int Bungetc(Biobuf*);
85 int Bungetrune(Biobuf*);
86 long Bwrite(Biobuf*, void*, long);
87 int Bvprint(Biobuf*, char*, va_list);
89 #if defined(__cplusplus)
90 }
91 #endif
92 #endif