| 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 |
| 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(-)
--- |
| 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 |