bio.h 1.9 KB

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