mirror of https://github.com/0intro/wmii
88 lines
2.1 KiB
C
88 lines
2.1 KiB
C
#ifndef _BIO_H_
|
|
#define _BIO_H_ 1
|
|
|
|
#ifdef AUTOLIB
|
|
AUTOLIB(bio)
|
|
#endif
|
|
|
|
#include <sys/types.h> /* for off_t */
|
|
#include <fcntl.h> /* for O_RDONLY, O_WRONLY */
|
|
#include <stdarg.h> /* for va_list */
|
|
|
|
typedef struct Biobuf Biobuf;
|
|
|
|
enum
|
|
{
|
|
Bsize = 8*1024,
|
|
Bungetsize = 4, /* space for ungetc */
|
|
Bmagic = 0x314159,
|
|
Beof = -1,
|
|
Bbad = -2,
|
|
|
|
Binactive = 0, /* states */
|
|
Bractive,
|
|
Bwactive,
|
|
Bracteof,
|
|
|
|
Bend
|
|
};
|
|
|
|
struct Biobuf
|
|
{
|
|
int icount; /* neg num of bytes at eob */
|
|
int ocount; /* num of bytes at bob */
|
|
int rdline; /* num of bytes after rdline */
|
|
int runesize; /* num of bytes of last getrune */
|
|
int state; /* r/w/inactive */
|
|
int fid; /* open file */
|
|
int flag; /* magic if malloc'ed */
|
|
off_t offset; /* offset of buffer in file */
|
|
int bsize; /* size of buffer */
|
|
unsigned char* bbuf; /* pointer to beginning of buffer */
|
|
unsigned char* ebuf; /* pointer to end of buffer */
|
|
unsigned char* gbuf; /* pointer to good data in buf */
|
|
unsigned char b[Bungetsize+Bsize];
|
|
};
|
|
|
|
#define BGETC(bp)\
|
|
((bp)->icount?(bp)->bbuf[(bp)->bsize+(bp)->icount++]:Bgetc((bp)))
|
|
#define BPUTC(bp,c)\
|
|
((bp)->ocount?(bp)->bbuf[(bp)->bsize+(bp)->ocount++]=(c),0:Bputc((bp),(c)))
|
|
#define BOFFSET(bp)\
|
|
(((bp)->state==Bractive)?\
|
|
(bp)->offset + (bp)->icount:\
|
|
(((bp)->state==Bwactive)?\
|
|
(bp)->offset + ((bp)->bsize + (bp)->ocount):\
|
|
-1))
|
|
#define BLINELEN(bp)\
|
|
(bp)->rdline
|
|
#define BFILDES(bp)\
|
|
(bp)->fid
|
|
|
|
int Bbuffered(Biobuf*);
|
|
Biobuf* Bfdopen(int, int);
|
|
int Bfildes(Biobuf*);
|
|
int Bflush(Biobuf*);
|
|
int Bgetc(Biobuf*);
|
|
int Bgetd(Biobuf*, double*);
|
|
long Bgetrune(Biobuf*);
|
|
int Binit(Biobuf*, int, int);
|
|
int Binits(Biobuf*, int, int, unsigned char*, int);
|
|
int Blinelen(Biobuf*);
|
|
off_t Boffset(Biobuf*);
|
|
Biobuf* Bopen(const char*, int);
|
|
int Bprint(Biobuf*, const char*, ...);
|
|
int Bputc(Biobuf*, int);
|
|
int Bputrune(Biobuf*, long);
|
|
void* Brdline(Biobuf*, int);
|
|
char* Brdstr(Biobuf*, int, int);
|
|
long Bread(Biobuf*, void*, long);
|
|
off_t Bseek(Biobuf*, off_t, int);
|
|
int Bterm(Biobuf*);
|
|
int Bungetc(Biobuf*);
|
|
int Bungetrune(Biobuf*);
|
|
long Bwrite(Biobuf*, void*, long);
|
|
int Bvprint(Biobuf*, const char*, va_list);
|
|
|
|
#endif
|