ref: 201a570b7374f689a51c091f49cc6e76fcadb726
parent: 52d6adc83025d5ba4ba4b1f4399f6d331d61b8c9
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Dec 20 12:00:08 EST 2012
tcs: dont get confused on odd read count for utf-16
--- a/sys/src/cmd/tcs/tcs.c
+++ b/sys/src/cmd/tcs/tcs.c
@@ -206,6 +206,25 @@
}
}
+static int
+cread(int fd, void *buf, int len, int mod)
+{+ char *off = buf;
+
+ len -= (len % mod);
+Again:
+ len = read(fd, off, len);
+ if(len <= 0)
+ return len;
+ off += len;
+ len = off - (char*)buf;
+ if((len % mod) != 0){+ len = mod - (len % mod);
+ goto Again;
+ }
+ return len;
+}
+
void
unicode_in(int fd, long *notused, struct convert *out)
{@@ -214,7 +233,7 @@
int swabme;
USED(notused);
- if(read(fd, (char *)buf, 2) != 2)
+ if(cread(fd, (char *)buf, 2, 2) != 2)
return;
ninput += 2;
switch(buf[0])
@@ -228,19 +247,10 @@
swabme = 1;
break;
}
- while((n = read(fd, (char *)buf, 2*N)) > 0){+ while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){ninput += n;
if(swabme)
swab2((char *)buf, n);
- if(n&1){- if(squawk)
- EPR "%s: odd byte count in %s\n", argv0, file);
- nerrors++;
- if(clean)
- n--;
- else
- buf[n++/2] = Runeerror;
- }
OUT(out, buf, n/2);
}
OUT(out, buf, 0);
@@ -254,24 +264,16 @@
uchar *p;
USED(notused);
- while((n = read(fd, (char *)buf, 2*N)) > 0){+ while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){ninput += n;
+ n /= 2;
p = (uchar*)buf;
- for(i=0; i<n/2; i++){+ for(i=0; i<n; i++){r = *p++<<8;
r |= *p++;
buf[i] = r;
}
- if(n&1){- if(squawk)
- EPR "%s: odd byte count in %s\n", argv0, file);
- nerrors++;
- if(clean)
- n--;
- else
- buf[n++/2] = Runeerror;
- }
- OUT(out, buf, n/2);
+ OUT(out, buf, n);
}
OUT(out, buf, 0);
}
@@ -284,24 +286,16 @@
uchar *p;
USED(notused);
- while((n = read(fd, (char *)buf, 2*N)) > 0){+ while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){ninput += n;
+ n /= 2;
p = (uchar*)buf;
- for(i=0; i<n/2; i++){+ for(i=0; i<n; i++){r = *p++;
r |= *p++<<8;
buf[i] = r;
}
- if(n&1){- if(squawk)
- EPR "%s: odd byte count in %s\n", argv0, file);
- nerrors++;
- if(clean)
- n--;
- else
- buf[n++/2] = Runeerror;
- }
- OUT(out, buf, n/2);
+ OUT(out, buf, n);
}
OUT(out, buf, 0);
}
--
⑨