Blob
1 #include "lib9.h"2 #include <bio.h>4 void*5 Brdline(Biobuf *bp, int delim)6 {7 char *ip, *ep;8 int i, j;10 i = -bp->icount;11 if(i == 0) {12 /*13 * eof or other error14 */15 if(bp->state != Bractive) {16 if(bp->state == Bracteof)17 bp->state = Bractive;18 bp->rdline = 0;19 bp->gbuf = bp->ebuf;20 return 0;21 }22 }24 /*25 * first try in remainder of buffer (gbuf doesn't change)26 */27 ip = (char*)bp->ebuf - i;28 ep = memchr(ip, delim, i);29 if(ep) {30 j = (ep - ip) + 1;31 bp->rdline = j;32 bp->icount += j;33 return ip;34 }36 /*37 * copy data to beginning of buffer38 */39 if(i < bp->bsize)40 memmove(bp->bbuf, ip, i);41 bp->gbuf = bp->bbuf;43 /*44 * append to buffer looking for the delim45 */46 ip = (char*)bp->bbuf + i;47 while(i < bp->bsize) {48 j = read(bp->fid, ip, bp->bsize-i);49 if(j <= 0) {50 /*51 * end of file with no delim52 */53 memmove(bp->ebuf-i, bp->bbuf, i);54 bp->rdline = i;55 bp->icount = -i;56 bp->gbuf = bp->ebuf-i;57 return 0;58 }59 bp->offset += j;60 i += j;61 ep = memchr(ip, delim, j);62 if(ep) {63 /*64 * found in new piece65 * copy back up and reset everything66 */67 ip = (char*)bp->ebuf - i;68 if(i < bp->bsize){69 memmove(ip, bp->bbuf, i);70 bp->gbuf = (unsigned char*)ip;71 }72 j = (ep - (char*)bp->bbuf) + 1;73 bp->rdline = j;74 bp->icount = j - i;75 return ip;76 }77 ip += j;78 }80 /*81 * full buffer without finding82 */83 bp->rdline = bp->bsize;84 bp->icount = -bp->bsize;85 bp->gbuf = bp->bbuf;86 return 0;87 }89 int90 Blinelen(Biobuf *bp)91 {93 return bp->rdline;94 }