tcs: dont get confused on odd read count for utf-16
This commit is contained in:
parent
03024cd814
commit
db71faf2d7
1 changed files with 29 additions and 35 deletions
|
@ -206,6 +206,25 @@ swab2(char *b, int n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
void
|
||||||
unicode_in(int fd, long *notused, struct convert *out)
|
unicode_in(int fd, long *notused, struct convert *out)
|
||||||
{
|
{
|
||||||
|
@ -214,7 +233,7 @@ unicode_in(int fd, long *notused, struct convert *out)
|
||||||
int swabme;
|
int swabme;
|
||||||
|
|
||||||
USED(notused);
|
USED(notused);
|
||||||
if(read(fd, (char *)buf, 2) != 2)
|
if(cread(fd, (char *)buf, 2, 2) != 2)
|
||||||
return;
|
return;
|
||||||
ninput += 2;
|
ninput += 2;
|
||||||
switch(buf[0])
|
switch(buf[0])
|
||||||
|
@ -228,19 +247,10 @@ unicode_in(int fd, long *notused, struct convert *out)
|
||||||
swabme = 1;
|
swabme = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while((n = read(fd, (char *)buf, 2*N)) > 0){
|
while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){
|
||||||
ninput += n;
|
ninput += n;
|
||||||
if(swabme)
|
if(swabme)
|
||||||
swab2((char *)buf, n);
|
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, n/2);
|
||||||
}
|
}
|
||||||
OUT(out, buf, 0);
|
OUT(out, buf, 0);
|
||||||
|
@ -254,24 +264,16 @@ unicode_in_be(int fd, long *notused, struct convert *out)
|
||||||
uchar *p;
|
uchar *p;
|
||||||
|
|
||||||
USED(notused);
|
USED(notused);
|
||||||
while((n = read(fd, (char *)buf, 2*N)) > 0){
|
while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){
|
||||||
ninput += n;
|
ninput += n;
|
||||||
|
n /= 2;
|
||||||
p = (uchar*)buf;
|
p = (uchar*)buf;
|
||||||
for(i=0; i<n/2; i++){
|
for(i=0; i<n; i++){
|
||||||
r = *p++<<8;
|
r = *p++<<8;
|
||||||
r |= *p++;
|
r |= *p++;
|
||||||
buf[i] = r;
|
buf[i] = r;
|
||||||
}
|
}
|
||||||
if(n&1){
|
OUT(out, buf, n);
|
||||||
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);
|
OUT(out, buf, 0);
|
||||||
}
|
}
|
||||||
|
@ -284,24 +286,16 @@ unicode_in_le(int fd, long *notused, struct convert *out)
|
||||||
uchar *p;
|
uchar *p;
|
||||||
|
|
||||||
USED(notused);
|
USED(notused);
|
||||||
while((n = read(fd, (char *)buf, 2*N)) > 0){
|
while((n = cread(fd, (char *)buf, 2*N, 2)) > 0){
|
||||||
ninput += n;
|
ninput += n;
|
||||||
|
n /= 2;
|
||||||
p = (uchar*)buf;
|
p = (uchar*)buf;
|
||||||
for(i=0; i<n/2; i++){
|
for(i=0; i<n; i++){
|
||||||
r = *p++;
|
r = *p++;
|
||||||
r |= *p++<<8;
|
r |= *p++<<8;
|
||||||
buf[i] = r;
|
buf[i] = r;
|
||||||
}
|
}
|
||||||
if(n&1){
|
OUT(out, buf, n);
|
||||||
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);
|
OUT(out, buf, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue