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