tr: fix escape code handling in set2

Signed-off-by: Hiltjo Posthuma <hiltjo@codemadness.org>
This commit is contained in:
Hiltjo Posthuma 2014-04-09 14:03:02 +02:00 committed by sin
parent e3c62682ff
commit 3e49e946b7

36
tr.c
View File

@ -49,32 +49,30 @@ handleescapes(char *s)
static void static void
parsemapping(const char *set1, const char *set2, wchar_t *mappings) parsemapping(const char *set1, const char *set2, wchar_t *mappings)
{ {
char *s; char *s1, *s2;
wchar_t runeleft; wchar_t runeleft;
wchar_t runeright; wchar_t runeright;
int leftbytes; int leftbytes;
int rightbytes; int rightbytes;
size_t n = 0;
size_t lset2;
if(set2) { s1 = (char *)set1;
lset2 = strnlen(set2, 255 * sizeof(wchar_t)); if(set2)
} else { s2 = (char *)set2;
set2 = &set1[0]; else
lset2 = 0; s2 = (char *)set1;
while(*s1) {
if(*s1 == '\\')
handleescapes(++s1);
leftbytes = mbtowc(&runeleft, s1, 4);
s1 += leftbytes;
if(*s2 == '\\')
handleescapes(++s2);
if(*s2 != '\0') {
rightbytes = mbtowc(&runeright, s2, 4);
s2 += rightbytes;
} }
s = (char *)set1;
while(*s) {
if(*s == '\\')
handleescapes(++s);
leftbytes = mbtowc(&runeleft, s, 4);
if(set2[n] != '\0')
rightbytes = mbtowc(&runeright, set2 + n, 4);
mappings[runeleft] = runeright; mappings[runeleft] = runeright;
s += leftbytes;
if(n < lset2)
n += rightbytes;
} }
} }