brdline.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. void*
  5. Brdline(Biobufhdr *bp, int delim)
  6. {
  7. char *ip, *ep;
  8. int i, j;
  9. i = -bp->icount;
  10. if(i == 0) {
  11. /*
  12. * eof or other error
  13. */
  14. if(bp->state != Bractive) {
  15. if(bp->state == Bracteof)
  16. bp->state = Bractive;
  17. bp->rdline = 0;
  18. bp->gbuf = bp->ebuf;
  19. return 0;
  20. }
  21. }
  22. /*
  23. * first try in remainder of buffer (gbuf doesn't change)
  24. */
  25. ip = (char*)bp->ebuf - i;
  26. ep = memchr(ip, delim, i);
  27. if(ep) {
  28. j = (ep - ip) + 1;
  29. bp->rdline = j;
  30. bp->icount += j;
  31. return ip;
  32. }
  33. /*
  34. * copy data to beginning of buffer
  35. */
  36. if(i < bp->bsize)
  37. memmove(bp->bbuf, ip, i);
  38. bp->gbuf = bp->bbuf;
  39. /*
  40. * append to buffer looking for the delim
  41. */
  42. ip = (char*)bp->bbuf + i;
  43. while(i < bp->bsize) {
  44. j = read(bp->fid, ip, bp->bsize-i);
  45. if(j <= 0) {
  46. /*
  47. * end of file with no delim
  48. */
  49. memmove(bp->ebuf-i, bp->bbuf, i);
  50. bp->rdline = i;
  51. bp->icount = -i;
  52. bp->gbuf = bp->ebuf-i;
  53. return 0;
  54. }
  55. bp->offset += j;
  56. i += j;
  57. ep = memchr(ip, delim, j);
  58. if(ep) {
  59. /*
  60. * found in new piece
  61. * copy back up and reset everything
  62. */
  63. ip = (char*)bp->ebuf - i;
  64. if(i < bp->bsize){
  65. memmove(ip, bp->bbuf, i);
  66. bp->gbuf = (uchar*)ip;
  67. }
  68. j = (ep - (char*)bp->bbuf) + 1;
  69. bp->rdline = j;
  70. bp->icount = j - i;
  71. return ip;
  72. }
  73. ip += j;
  74. }
  75. /*
  76. * full buffer without finding
  77. */
  78. bp->rdline = bp->bsize;
  79. bp->icount = -bp->bsize;
  80. bp->gbuf = bp->bbuf;
  81. return 0;
  82. }
  83. int
  84. Blinelen(Biobufhdr *bp)
  85. {
  86. return bp->rdline;
  87. }