- /* Clear the read buffer. */
- /* XXX This is possibly incorrect because it throws away inputs that
- * may not have been matched yet. A better idea is to record the
- * end of the previous match and only throw that away.
- */
- clear_buffer (h);
+ if (h->next_match == -1) {
+ /* Fully clear the buffer, then read. */
+ clear_buffer (h);
+ } else {
+ /* See the comment in the manual about h->next_match. We have
+ * some data remaining in the buffer, so begin by matching that.
+ */
+ memmove (&h->buffer[0], &h->buffer[h->next_match], h->len - h->next_match);
+ h->len -= h->next_match;
+ h->buffer[h->len] = '\0';
+ h->next_match = -1;
+ goto try_match;
+ }