/* * rb_linebuf_get * * get the next buffer from our line. For the time being it will copy * data into the given buffer and free the underlying linebuf. */ int rb_linebuf_get(buf_head_t * bufhead, char *buf, int buflen, int partial, int raw) { buf_line_t *bufline; int cpylen; char *start, *ch; /* make sure we have a line */ if(bufhead->list.head == NULL) return 0; /* Obviously not.. hrm. */ bufline = bufhead->list.head->data; /* make sure that the buffer was actually *terminated */ if(!(partial || bufline->terminated)) return 0; /* Wait for more data! */ if(buflen < bufline->len) cpylen = buflen - 1; else cpylen = bufline->len; /* Copy it */ start = bufline->buf; /* if we left extraneous '\r\n' characters in the string, * and we don't want to read the raw data, clean up the string. */ if(bufline->raw && !raw) { /* skip leading EOL characters */ while(cpylen && (*start == '\r' || *start == '\n')) { start++; cpylen--; } /* skip trailing EOL characters */ ch = &start[cpylen - 1]; while(cpylen && (*ch == '\r' || *ch == '\n')) { ch--; cpylen--; } } memcpy(buf, start, cpylen); /* convert CR/LF to NULL */ if(!raw) buf[cpylen] = '\0'; lrb_assert(cpylen >= 0); /* Deallocate the line */ rb_linebuf_done_line(bufhead, bufline, bufhead->list.head); /* return how much we copied */ return cpylen; }
/* * rb_linebuf_donebuf * * Flush all the lines associated with this buffer */ void rb_linebuf_donebuf(buf_head_t * bufhead) { while(bufhead->list.head != NULL) { rb_linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data, bufhead->list.head); } }