+ do {
+ // find next newline, terminate string there
+ for (char* i = self->buffer; i < self->eob; ++i)
+ {
+ if (*i == '\n')
+ {
+ *i = '\0';
+ self->eol = i;
+ // have line, return it
+ return (self->eob == self->buffer) ? NULL : self->buffer;
+ }
+ }
+
+ // else we have to read
+ if (self->state == RXPD_OK)
+ {
+ ssize_t r = 0;
+ do
+ {
+ r = pth_read (fd, self->eob, 4095 - (self->eob - self->buffer));
+ }
+ while (r == -1 && errno == EINTR);
+
+ if (r != -1)
+ {
+ if (r == 0)
+ {
+ shutdown (fd, SHUT_RD);
+ self->state = RXPD_EOF;
+ }
+ self->eob += r;
+ }
+ else
+ self->state = RXPD_ERROR;
+ }
+ } while (1); // TODO while (!buffer overfulls)
+ return NULL;