/* * linebuf_donebuf * * Flush all the lines associated with this buffer */ void linebuf_donebuf(buf_head_t * bufhead) { while (bufhead->list.head != NULL) { linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data, bufhead->list.head); } }
/* * 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 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! */ /* make sure we've got the space, including the NULL */ cpylen = bufline->len; s_assert(cpylen + 1 <= buflen); /* 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 + 1); /* convert CR/LF to NULL */ if(bufline->raw && !raw) buf[cpylen] = '\0'; s_assert(cpylen >= 0); /* Deallocate the line */ linebuf_done_line(bufhead, bufline, bufhead->list.head); /* return how much we copied */ return cpylen; }