From: Jeffrey Stedfast Date: Wed, 20 Apr 2011 19:59:12 +0000 (-0400) Subject: Added Latin1 support to giconv X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=af89f6e9b18a9e92633ff818be9436eb33cbb013;p=mono.git Added Latin1 support to giconv --- diff --git a/eglib/src/giconv.c b/eglib/src/giconv.c index acfddcac7c0..6273d3e19f7 100644 --- a/eglib/src/giconv.c +++ b/eglib/src/giconv.c @@ -72,21 +72,29 @@ static int encode_utf16 (gunichar c, char **outbytes, size_t *outbytesleft); static int decode_utf8 (char **inbytes, size_t *inbytesleft, gunichar *outchar); static int encode_utf8 (gunichar c, char **outbytes, size_t *outbytesleft); +static int decode_latin1 (char **inbytes, size_t *inbytesleft, gunichar *outchar); +static int encode_latin1 (gunichar c, char **outbytes, size_t *outbytesleft); + static struct { const char *name; Decoder decoder; Encoder encoder; } charsets[] = { - { "UTF-32BE", decode_utf32be, encode_utf32be }, - { "UTF-32LE", decode_utf32le, encode_utf32le }, - { "UTF-16BE", decode_utf16be, encode_utf16be }, - { "UTF-16LE", decode_utf16le, encode_utf16le }, - { "UTF-32", decode_utf32, encode_utf32 }, - { "UTF-16", decode_utf16, encode_utf16 }, - { "UTF-8", decode_utf8, encode_utf8 }, - { "UTF32", decode_utf32, encode_utf32 }, - { "UTF16", decode_utf16, encode_utf16 }, - { "UTF8", decode_utf8, encode_utf8 }, + { "ISO-8859-1", decode_latin1, encode_latin1 }, + { "ISO8859-1", decode_latin1, encode_latin1 }, + { "UTF-32BE", decode_utf32be, encode_utf32be }, + { "UTF-32LE", decode_utf32le, encode_utf32le }, + { "UTF-16BE", decode_utf16be, encode_utf16be }, + { "UTF-16LE", decode_utf16le, encode_utf16le }, + { "UTF-32", decode_utf32, encode_utf32 }, + { "UTF-16", decode_utf16, encode_utf16 }, + { "UTF-8", decode_utf8, encode_utf8 }, + { "US-ASCII", decode_latin1, encode_latin1 }, + { "Latin1", decode_latin1, encode_latin1 }, + { "ASCII", decode_latin1, encode_latin1 }, + { "UTF32", decode_utf32, encode_utf32 }, + { "UTF16", decode_utf16, encode_utf16 }, + { "UTF8", decode_utf8, encode_utf8 }, }; @@ -455,6 +463,9 @@ decode_utf8 (char **inbytes, size_t *inbytesleft, gunichar *outchar) unsigned char c; gunichar u; + if (inleft < 1) + return 0; + c = *inptr++; if (c < 0x80) { @@ -548,3 +559,45 @@ encode_utf8 (gunichar c, char **outbytes, size_t *outbytesleft) return 0; } + +static int +decode_latin1 (char **inbytes, size_t *inbytesleft, gunichar *outchar) +{ + size_t inleft = *inbytesleft; + char *inptr = *inbytes; + gunichar u = *inptr; + + if (inleft < 1) + return 0; + + *inbytesleft = inleft - 1; + *inbytes = inptr + 1; + *outchar = u; + + return 0; +} + +static int +encode_latin1 (gunichar c, char **outbytes, size_t *outbytesleft) +{ + size_t outleft = *outbytesleft; + char *outptr = *outbytes; + + if (outleft < 1) { + errno = E2BIG; + return -1; + } + + if (c > 0xff) { + errno = EILSEQ; + return -1; + } + + *outptr++ = (char) c; + outleft--; + + *outbytesleft = outleft; + *outbytes = outptr; + + return 0; +}