billiob pushed a commit to branch master.
commit 7a92b145e5e12f0585cc799a4efc2ff81b95a242
Author: Boris Faure <[email protected]>
Date: Sun Apr 28 22:47:14 2013 +0200
fix issue when buffer cuts last unicode
---
src/bin/termpty.c | 47 +++++++++++++++++++++++++++++++++++++----------
src/bin/termpty.h | 1 +
2 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index 0be1d00..27d4873 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -179,13 +179,28 @@ _cb_fd_read(void *data, Ecore_Fd_Handler *fd_handler
__UNUSED__)
// read up to 64 * 4096 bytes
for (reads = 0; reads < 64; reads++)
{
- len = read(ty->fd, buf, sizeof(buf) - 1);
+ char *rbuf = buf;
+ len = sizeof(buf) - 1;
+
+ for (i = 0; i < (int)sizeof(ty->oldbuf) && ty->oldbuf[i] & 0x80; i++)
+ {
+ *rbuf = ty->oldbuf[i];
+ rbuf++;
+ len--;
+ }
+ len = read(ty->fd, rbuf, len);
if (len <= 0) break;
-
-/*
+
+
+ for (i = 0; i < (int)sizeof(ty->oldbuf); i++)
+ ty->oldbuf[i] = 0;
+
+ len += rbuf - buf;
+
+ /*
printf(" I: ");
int jj;
- for (jj = 0; jj < len && jj < 100; jj++)
+ for (jj = 0; jj < len; jj++)
{
if ((buf[jj] < ' ') || (buf[jj] >= 0x7f))
printf("\033[33m%02x\033[0m", (unsigned char)buf[jj]);
@@ -193,23 +208,35 @@ _cb_fd_read(void *data, Ecore_Fd_Handler *fd_handler
__UNUSED__)
printf("%c", buf[jj]);
}
printf("\n");
- */
+ */
buf[len] = 0;
// convert UTF8 to codepoint integers
j = 0;
for (i = 0; i < len;)
{
- int g = 0;
+ int g = 0, prev_i = i;
if (buf[i])
{
#if (EINA_VERSION_MAJOR > 1) || (EINA_VERSION_MINOR >= 8)
g = eina_unicode_utf8_next_get(buf, &i);
-#else
+ if (0xdc80 <= g && g <= 0xdcff &&
+#else
i = evas_string_char_next_get(buf, i, &g);
-#endif
- if (i < 0) break;
-// DBG("(%i) %02x '%c'", j, g, g);
+ if (i < 0 &&
+#endif
+ (len - prev_i) <= (int) sizeof(ty->oldbuf))
+ {
+ int k;
+ for (k = 0;
+ k < (int)sizeof(ty->oldbuf) && k < (len - prev_i);
+ k++)
+ {
+ ty->oldbuf[k] = buf[prev_i+k];
+ }
+ DBG("failure at %d/%d/%d", prev_i, i, len);
+ break;
+ }
}
else
{
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index b4adcba..9e84f98 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -111,6 +111,7 @@ struct _Termpty
const char *cur_cmd;
Termcell *screen, *screen2;
Termsave **back;
+ unsigned char oldbuf[4];
int *buf;
int buflen;
int w, h;
--
------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr