From 3474a45b14a131e92e52960dd90e63c12fda275d Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Wed, 18 Jan 2012 10:07:36 +0000 Subject: [PATCH] Avoid push_bytes() entirely by read()ing directly into tk->buffer --- termkey.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/termkey.c b/termkey.c index e50ff38..7770d83 100644 --- a/termkey.c +++ b/termkey.c @@ -940,29 +940,17 @@ retry: /* UNREACHABLE */ } -static void push_bytes(TermKey *tk, const unsigned char *input, size_t inputlen) -{ - if(tk->buffstart + tk->buffcount + inputlen > tk->buffsize) { - while(tk->buffstart + tk->buffcount + inputlen > tk->buffsize) - tk->buffsize *= 2; - - unsigned char *newbuffer = realloc(tk->buffer, tk->buffsize); - // TODO: Handle realloc() failure - tk->buffer = newbuffer; - } - - // Not strcpy just in case of NUL bytes - memcpy(tk->buffer + tk->buffstart + tk->buffcount, input, inputlen); - tk->buffcount += inputlen; -} - TermKeyResult termkey_advisereadable(TermKey *tk) { - unsigned char buffer[64]; // Smaller than the default size ssize_t len; + if(tk->buffstart) { + memmove(tk->buffer, tk->buffer + tk->buffstart, tk->buffcount); + tk->buffstart = 0; + } + retry: - len = read(tk->fd, buffer, sizeof buffer); + len = read(tk->fd, tk->buffer + tk->buffcount, tk->buffsize - tk->buffcount); if(len == -1) { if(errno == EAGAIN) @@ -977,7 +965,7 @@ retry: return TERMKEY_RES_NONE; } else { - push_bytes(tk, buffer, len); + tk->buffcount += len; return TERMKEY_RES_AGAIN; } }