Wrap mbtowc to check for errors

This commit is contained in:
Silvan Jegen 2014-04-12 20:50:51 +02:00 committed by sin
parent bc13aa5960
commit 4e13ff39c3

19
tr.c
View File

@ -46,6 +46,17 @@ handleescapes(char *s)
} }
} }
static int
xmbtowc(wchar_t *unicodep, const char *s)
{
int rv;
rv = mbtowc(unicodep, s, 4);
if (rv < 0)
eprintf("mbtowc:");
return rv;
}
static void static void
parsemapping(const char *set1, const char *set2, wchar_t *mappings) parsemapping(const char *set1, const char *set2, wchar_t *mappings)
{ {
@ -64,12 +75,12 @@ parsemapping(const char *set1, const char *set2, wchar_t *mappings)
while(*s1) { while(*s1) {
if(*s1 == '\\') if(*s1 == '\\')
handleescapes(++s1); handleescapes(++s1);
leftbytes = mbtowc(&runeleft, s1, 4); leftbytes = xmbtowc(&runeleft, s1);
s1 += leftbytes; s1 += leftbytes;
if(*s2 == '\\') if(*s2 == '\\')
handleescapes(++s2); handleescapes(++s2);
if(*s2 != '\0') { if(*s2 != '\0') {
rightbytes = mbtowc(&runeright, s2, 4); rightbytes = xmbtowc(&runeright, s2);
s2 += rightbytes; s2 += rightbytes;
} }
mappings[runeleft] = runeright; mappings[runeleft] = runeright;
@ -85,7 +96,7 @@ maptonull(const wchar_t *mappings, char *in)
s = in; s = in;
while(*s) { while(*s) {
leftbytes = mbtowc(&runeleft, s, 4); leftbytes = xmbtowc(&runeleft, s);
if(!mappings[runeleft]) if(!mappings[runeleft])
putwchar(runeleft); putwchar(runeleft);
s += leftbytes; s += leftbytes;
@ -101,7 +112,7 @@ maptoset(const wchar_t *mappings, char *in)
s = in; s = in;
while(*s) { while(*s) {
leftbytes = mbtowc(&runeleft, s, 4); leftbytes = xmbtowc(&runeleft, s);
if(!mappings[runeleft]) if(!mappings[runeleft])
putwchar(runeleft); putwchar(runeleft);
else else