chanfill.b 831 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. implement ChanFill;
  2. #
  3. # Iobuf fill routine to serve a file2chan.
  4. #
  5. include "sys.m";
  6. include "bufio.m";
  7. myfill: BufioFill;
  8. bufio: Bufio;
  9. fid: int;
  10. wc: Sys->Rwrite;
  11. fio: ref Sys->FileIO;
  12. Iobuf: import bufio;
  13. init(data: array of byte, f: int, c: Sys->Rwrite, r: ref Sys->FileIO, b: Bufio): ref Iobuf
  14. {
  15. if (myfill == nil)
  16. myfill = load BufioFill SELF;
  17. bufio = b;
  18. i := bufio->sopen(string data);
  19. fid = f;
  20. wc = c;
  21. fio = r;
  22. i.setfill(myfill);
  23. wc <-= (len data, nil);
  24. return i;
  25. }
  26. fill(b: ref Iobuf): int
  27. {
  28. for (;;) {
  29. (nil, data, f, c) := <-fio.write;
  30. if (f != fid) {
  31. if (c != nil)
  32. c <-= (0, "file busy");
  33. continue;
  34. }
  35. if (c == nil)
  36. return Bufio->EOF;
  37. c <-= (len data, nil);
  38. i := len data;
  39. if (i == 0)
  40. continue;
  41. b.buffer[b.size:] = data;
  42. b.size += i;
  43. b.filpos += big i;
  44. return i;
  45. }
  46. }