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

Reply via email to