buf.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <ip.h>
  5. #include <plumb.h>
  6. #include <thread.h>
  7. #include <fcall.h>
  8. #include <9p.h>
  9. #include "dat.h"
  10. #include "fns.h"
  11. void
  12. initibuf(Ibuf *b, Ioproc *io, int fd)
  13. {
  14. b->fd = fd;
  15. b->io = io;
  16. b->rp = b->wp = b->buf;
  17. }
  18. int
  19. readibuf(Ibuf *b, char *buf, int len)
  20. {
  21. int n;
  22. n = b->wp - b->rp;
  23. if(n > 0){
  24. if(n > len)
  25. n = len;
  26. memmove(buf, b->rp, n);
  27. b->rp += n;
  28. return n;
  29. }
  30. return ioreadn(b->io, b->fd, buf, len);
  31. }
  32. void
  33. unreadline(Ibuf *b, char *line)
  34. {
  35. int i, n;
  36. i = strlen(line);
  37. n = b->wp - b->rp;
  38. memmove(&b->buf[i+1], b->rp, n);
  39. memmove(b->buf, line, i);
  40. b->buf[i] = '\n';
  41. b->rp = b->buf;
  42. b->wp = b->rp+i+1+n;
  43. }
  44. int
  45. readline(Ibuf *b, char *buf, int len)
  46. {
  47. int n;
  48. char *p;
  49. len--;
  50. for(p = buf;;){
  51. if(b->rp >= b->wp){
  52. n = ioread(b->io, b->fd, b->wp, sizeof(b->buf)/2);
  53. if(n < 0)
  54. return -1;
  55. if(n == 0)
  56. break;
  57. b->wp += n;
  58. }
  59. n = *b->rp++;
  60. if(len > 0){
  61. *p++ = n;
  62. len--;
  63. }
  64. if(n == '\n')
  65. break;
  66. }
  67. /* drop trailing white */
  68. for(;;){
  69. if(p <= buf)
  70. break;
  71. n = *(p-1);
  72. if(n != ' ' && n != '\t' && n != '\r' && n != '\n')
  73. break;
  74. p--;
  75. }
  76. *p = 0;
  77. return p-buf;
  78. }