git: 9front

Download patch

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);
 }
--