From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/lib/ap/stdio/rdline.c | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 sys/src/ape/lib/ap/stdio/rdline.c (limited to 'sys/src/ape/lib/ap/stdio/rdline.c') diff --git a/sys/src/ape/lib/ap/stdio/rdline.c b/sys/src/ape/lib/ap/stdio/rdline.c new file mode 100755 index 000000000..6281a97e8 --- /dev/null +++ b/sys/src/ape/lib/ap/stdio/rdline.c @@ -0,0 +1,65 @@ +/* + * pANS stdio -- rdline + * This is not a pANS routine. + */ +#include "iolib.h" +#include + +char *rdline(FILE *f, char **ep){ + int cnt; + char *nlp, *vp; + switch(f->state){ + default: /* CLOSED, WR, ERR, EOF */ + return NULL; + case OPEN: + _IO_setvbuf(f); + case RDWR: + f->state=RD; + case RD: + if(f->bufl==0){ /* Called by a comedian! */ + f->state=ERR; + return NULL; + } + vp=f->rp; + for(;;){ + /* + * Look for a newline. + * If none found, slide the partial line to the beginning + * of the buffer, read some more and keep looking. + */ + nlp=memchr(f->rp, '\n', f->wp-f->rp); + if(nlp!=0) break; + if(f->flags&STRING){ + f->rp=f->wp; + if(ep) *ep=f->wp; + return vp; + } + if(f->rp!=f->buf){ + memmove(f->buf, f->rp, f->wp-f->rp); + f->wp-=f->rp-f->buf; + f->rp=f->buf; + vp=f->rp; + } + cnt=f->bufl-(f->wp-f->buf); + if(cnt==0){ /* no room left */ + nlp=f->wp-1; + break; + } + cnt=read(f->fd, f->wp, cnt); + if(cnt==-1){ + f->state=ERR; + return NULL; + } + if(cnt==0){ /* is this ok? */ + f->state=EOF; + return NULL; + } + f->rp=f->wp; + f->wp+=cnt; + } + *nlp='\0'; + f->rp=nlp+1; + if(ep) *ep=nlp; + return vp; + } +} -- cgit v1.2.3