bgetc.c 948 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. int
  5. Bgetc(Biobufhdr *bp)
  6. {
  7. int i;
  8. loop:
  9. i = bp->icount;
  10. if(i != 0) {
  11. bp->icount = i+1;
  12. return bp->ebuf[i];
  13. }
  14. if(bp->state != Bractive) {
  15. if(bp->state == Bracteof)
  16. bp->state = Bractive;
  17. return Beof;
  18. }
  19. /*
  20. * get next buffer, try to keep Bungetsize
  21. * characters pre-catenated from the previous
  22. * buffer to allow that many ungets.
  23. */
  24. memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
  25. i = read(bp->fid, bp->bbuf, bp->bsize);
  26. bp->gbuf = bp->bbuf;
  27. if(i <= 0) {
  28. bp->state = Bracteof;
  29. if(i < 0)
  30. bp->state = Binactive;
  31. return Beof;
  32. }
  33. if(i < bp->bsize) {
  34. memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
  35. bp->gbuf = bp->ebuf-i;
  36. }
  37. bp->icount = -i;
  38. bp->offset += i;
  39. goto loop;
  40. }
  41. int
  42. Bungetc(Biobufhdr *bp)
  43. {
  44. if(bp->state == Bracteof)
  45. bp->state = Bractive;
  46. if(bp->state != Bractive)
  47. return Beof;
  48. bp->icount--;
  49. return 1;
  50. }