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
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c006e984192aa8bcb755bdd25e111bb37b5db16b
 (DIR) parent 25989d9ecabaf82acbf72f5c8fbf1c369a6b98ae
 (HTM) Author: Michael Teichgräber <mt4swm@googlemail.com>
       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(-)
       ---
 (DIR) 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<n/2; i++)
       +                        buf[i] = ubuf[i];
                        if(n&1){
                                if(squawk)
                                        EPR "%s: odd byte count in %s\n", argv0, file);
       t@@ -227,13 +231,14 @@ void
        unicode_in_be(int fd, long *notused, struct convert *out)
        {
                int i, n;
       +        u16int ubuf[N];
                Rune buf[N], r;
                uchar *p;
        
                USED(notused);
       -        while((n = read(fd, (char *)buf, 2*N)) > 0){
       +        while((n = read(fd, (char *)ubuf, 2*N)) > 0){
                        ninput += n;
       -                p = (uchar*)buf;
       +                p = (uchar*)ubuf;
                        for(i=0; i<n/2; i++){
                                r = *p++<<8;
                                r |= *p++;
       t@@ -257,13 +262,14 @@ void
        unicode_in_le(int fd, long *notused, struct convert *out)
        {
                int i, n;
       +        u16int ubuf[N];
                Rune buf[N], r;
                uchar *p;
        
                USED(notused);
       -        while((n = read(fd, (char *)buf, 2*N)) > 0){
       +        while((n = read(fd, (char *)ubuf, 2*N)) > 0){
                        ninput += n;
       -                p = (uchar*)buf;
       +                p = (uchar*)ubuf;
                        for(i=0; i<n/2; i++){
                                r = *p++;
                                r |= *p++<<8;
       t@@ -287,17 +293,21 @@ void
        unicode_out(Rune *base, int n, long *notused)
        {
                static int first = 1;
       +        u16int buf[N];
       +        int i;
        
                USED(notused);
                nrunes += n;
                if(first){
       -                unsigned short x = 0xFEFF;
       +                u16int x = 0xFEFF;
                        noutput += 2;
                        write(1, (char *)&x, 2);
                        first = 0;
                }
                noutput += 2*n;
       -        write(1, (char *)base, 2*n);
       +        for(i=0; i<n; i++)
       +                buf[i] = base[i];
       +        write(1, (char *)buf, 2*n);
        }
        
        void