tThis patch fixes unicode, unicode-be and unicode-le input, and unicode output, which have been broken due to the change of the size of Rune from two bytes to four bytes. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit c006e984192aa8bcb755bdd25e111bb37b5db16b
parent 25989d9ecabaf82acbf72f5c8fbf1c369a6b98ae
Author: Michael Teichgräber 
Date:   Mon, 28 Jun 2010 14:43:28 -0700

This patch fixes unicode, unicode-be and unicode-le
input, and unicode output, which have been broken due
tto the change of the size of Rune from two bytes to
four bytes.

(Unicode-le and unicode-be output have not been
affected, since they work different, and produce
correct output as long as sizeof(Rune) >= 2.)

In all of the affected functions an extra array of N
elements of type u16int is used to temporarily store
tthe 16-bit unicode data.  As this increases stack
usage, perhaps a different, slightly more complicated
solution might be preferred, where only a single
`Rune buf[N]' is used for both temporary storage and
tthe result.

R=rsc
CC=codebot
http://codereview.appspot.com/1574041

Diffstat:
  M src/cmd/tcs/tcs.c                   |      32 ++++++++++++++++++++-----------

1 file changed, 21 insertions(+), 11 deletions(-)
---
diff --git a/src/cmd/tcs/tcs.c b/src/cmd/tcs/tcs.c
t@@ -187,17 +187,19 @@ swab2(char *b, int n)
 void
 unicode_in(int fd, long *notused, struct convert *out)
 {
+        u16int ubuf[N];
         Rune buf[N];
-        int n;
+        int i, n;
         int swabme;
 
         USED(notused);
-        if(read(fd, (char *)buf, 2) != 2)
+        if(read(fd, (char *)ubuf, 2) != 2)
                 return;
         ninput += 2;
-        switch(buf[0])
+        switch(ubuf[0])
         {
         default:
+                buf[0] = ubuf[0];
                 OUT(out, buf, 1);
         case 0xFEFF:
                 swabme = 0;
t@@ -206,10 +208,12 @@ unicode_in(int fd, long *notused, struct convert *out)
                 swabme = 1;
                 break;
         }
-        while((n = read(fd, (char *)buf, 2*N)) > 0){
+        while((n = read(fd, (char *)ubuf, 2*N)) > 0){
                 ninput += n;
                 if(swabme)
-                        swab2((char *)buf, n);
+                        swab2((char *)ubuf, n);
+                for(i=0; i 0){
+        while((n = read(fd, (char *)ubuf, 2*N)) > 0){
                 ninput += n;
-                p = (uchar*)buf;
+                p = (uchar*)ubuf;
                 for(i=0; i 0){
+        while((n = read(fd, (char *)ubuf, 2*N)) > 0){
                 ninput += n;
-                p = (uchar*)buf;
+                p = (uchar*)ubuf;
                 for(i=0; i