bread.c 746 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. long
  5. Bread(Biobufhdr *bp, void *ap, long count)
  6. {
  7. long c;
  8. uchar *p;
  9. int i, n, ic;
  10. p = ap;
  11. c = count;
  12. ic = bp->icount;
  13. while(c > 0) {
  14. n = -ic;
  15. if(n > c)
  16. n = c;
  17. if(n == 0) {
  18. if(bp->state != Bractive)
  19. break;
  20. i = read(bp->fid, bp->bbuf, bp->bsize);
  21. if(i <= 0) {
  22. bp->state = Bracteof;
  23. if(i < 0)
  24. bp->state = Binactive;
  25. break;
  26. }
  27. bp->gbuf = bp->bbuf;
  28. bp->offset += i;
  29. if(i < bp->bsize) {
  30. memmove(bp->ebuf-i, bp->bbuf, i);
  31. bp->gbuf = bp->ebuf-i;
  32. }
  33. ic = -i;
  34. continue;
  35. }
  36. memmove(p, bp->ebuf+ic, n);
  37. c -= n;
  38. ic += n;
  39. p += n;
  40. }
  41. bp->icount = ic;
  42. if(count == c && bp->state == Binactive)
  43. return -1;
  44. return count-c;
  45. }