diff options
Diffstat (limited to 'src/base/bufio')
-rw-r--r-- | src/base/bufio/init.c | 4 | ||||
-rw-r--r-- | src/base/bufio/readline.c | 11 | ||||
-rw-r--r-- | src/base/bufio/readuntil.c | 15 | ||||
-rw-r--r-- | src/base/bufio/rules.mk | 1 |
4 files changed, 22 insertions, 9 deletions
diff --git a/src/base/bufio/init.c b/src/base/bufio/init.c index 7e6dcee..b6814e1 100644 --- a/src/base/bufio/init.c +++ b/src/base/bufio/init.c @@ -75,14 +75,14 @@ bio·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf) io->g = io->e; io->fd = fd; io->cap = cap; - io->pos = io->runesz = io->flag = io->ilen = io->line = 0; + io->pos = io->runesz = io->flag = io->ilen = io->nread = 0; return 0; } int bio·init(io·Buffer *io, int fd, int mode) { - return bio·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->b); + return bio·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes); } int diff --git a/src/base/bufio/readline.c b/src/base/bufio/readline.c new file mode 100644 index 0000000..0a50098 --- /dev/null +++ b/src/base/bufio/readline.c @@ -0,0 +1,11 @@ +#include "internal.h" + +void * +bio·readline(io·Header *io, int null) +{ + char *start = bio·readuntil(io, '\n'); + if(null && start) + start[io->nread-1] = 0; + + return start; +} diff --git a/src/base/bufio/readuntil.c b/src/base/bufio/readuntil.c index 8084cca..1a0faaf 100644 --- a/src/base/bufio/readuntil.c +++ b/src/base/bufio/readuntil.c @@ -11,7 +11,7 @@ bio·readuntil(io·Header *io, int delim) if(io->state != io·BufRdr){ if(io->state == io·BufEnd) io->state = io·BufRdr; - io->line = 0; + io->nread = 0; io->g = io->e; return nil; } @@ -21,7 +21,7 @@ bio·readuntil(io·Header *io, int delim) b = (char*)io->e - i; if((e = mem·findc(b, i, delim)) != nil){ j = (e - b)+1; - io->line = j; + io->nread = j; io->ilen += j; return b; } @@ -29,12 +29,13 @@ bio·readuntil(io·Header *io, int delim) if(i < io->cap) mem·move(io->b, b, i); io->g = io->b; + /* write to the buffer while we search for delim */ b = (char *)io->b + i; while(i < io->cap){ - if(sys·read(io->fd, io->cap-i, b, &j)){ + if(sys·read(io->fd, io->cap-i, b, &j) || j == 0){ mem·move(io->e-i, io->b, i); - io->line = +i; + io->nread = +i; io->ilen = -i; io->g = io->e - i; return 0; @@ -50,15 +51,15 @@ bio·readuntil(io·Header *io, int delim) io->g = (uchar *)b; } j = (e - (char*)io->b) + 1; - io->line = j; + io->nread = j; io->ilen = j - i; return b; } b += j; } - io->line = +io->cap; + io->nread = +io->cap; io->ilen = -io->cap; io->g = io->b; - return 0; + return nil; } diff --git a/src/base/bufio/rules.mk b/src/base/bufio/rules.mk index 4546aeb..f367b8e 100644 --- a/src/base/bufio/rules.mk +++ b/src/base/bufio/rules.mk @@ -9,6 +9,7 @@ SRCS_$(d)+=\ $(d)/bufio/print.c\ $(d)/bufio/putc.c\ $(d)/bufio/read.c\ + $(d)/bufio/readline.c\ $(d)/bufio/readuntil.c\ $(d)/bufio/seek.c\ $(d)/bufio/ungetc.c\ |