bseek.c 847 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. vlong
  5. Bseek(Biobufhdr *bp, vlong offset, int base)
  6. {
  7. vlong n, d;
  8. switch(bp->state) {
  9. default:
  10. fprint(2, "Bseek: unknown state %d\n", bp->state);
  11. return Beof;
  12. case Bracteof:
  13. bp->state = Bractive;
  14. bp->icount = 0;
  15. bp->gbuf = bp->ebuf;
  16. case Bractive:
  17. n = offset;
  18. if(base == 1) {
  19. n += Boffset(bp);
  20. base = 0;
  21. }
  22. /*
  23. * try to seek within buffer
  24. */
  25. if(base == 0) {
  26. d = n - Boffset(bp);
  27. bp->icount += d;
  28. if(d >= 0) {
  29. if(bp->icount <= 0)
  30. return n;
  31. } else {
  32. if(bp->ebuf - bp->gbuf >= -bp->icount)
  33. return n;
  34. }
  35. }
  36. /*
  37. * reset the buffer
  38. */
  39. n = seek(bp->fid, n, base);
  40. bp->icount = 0;
  41. bp->gbuf = bp->ebuf;
  42. break;
  43. case Bwactive:
  44. Bflush(bp);
  45. n = seek(bp->fid, offset, base);
  46. break;
  47. }
  48. bp->offset = n;
  49. return n;
  50. }