diff --git a/xio-readline.c b/xio-readline.c index 5ffd8ed..dd6998e 100644 --- a/xio-readline.c +++ b/xio-readline.c @@ -214,25 +214,26 @@ void xioscan_readline(struct single *pipe, const void *buff, size_t bytes) { if (pipe->dtype == XIODATA_READLINE && pipe->para.readline.dynprompt) { /* we save the last part of the output as possible prompt */ const void *ptr = buff; - const void *pcr = memrchr(buff, '\r', bytes); - const void *plf = memrchr(buff, '\n', bytes); + const void *pcr; + const void *plf; size_t len; + if (bytes > pipe->para.readline.dynbytes) { ptr = (const char *)buff + bytes - pipe->para.readline.dynbytes; + len = pipe->para.readline.dynbytes; + } else { + len = bytes; } - if (pcr) { - /* forget old prompt */ - pipe->para.readline.dynend = pipe->para.readline.dynprompt; - /* new prompt starts here */ - ptr = (const char *)pcr+1; - } - if (plf && plf >= ptr) { + pcr = memrchr(ptr, '\r', len); + plf = memrchr(ptr, '\n', len); + if (pcr != NULL || plf != NULL) { + const void *peol = Max(pcr, plf); /* forget old prompt */ pipe->para.readline.dynend = pipe->para.readline.dynprompt; + len -= (peol+1 - ptr); /* new prompt starts here */ - ptr = (const char *)plf+1; + ptr = (const char *)peol+1; } - len = (const char *)buff-(const char *)ptr+bytes; if (pipe->para.readline.dynend - pipe->para.readline.dynprompt + len > pipe->para.readline.dynbytes) { memmove(pipe->para.readline.dynprompt, @@ -243,7 +244,6 @@ void xioscan_readline(struct single *pipe, const void *buff, size_t bytes) { pipe->para.readline.dynprompt + pipe->para.readline.dynbytes - len; } memcpy(pipe->para.readline.dynend, ptr, len); - /*pipe->para.readline.dynend = pipe->para.readline.dynprompt + len;*/ pipe->para.readline.dynend = pipe->para.readline.dynend + len; } return; -- 1.7.0.4