Blob


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