Added Latin1 support to giconv
authorJeffrey Stedfast <fejj@gnome.org>
Wed, 20 Apr 2011 19:59:12 +0000 (15:59 -0400)
committerJeffrey Stedfast <fejj@gnome.org>
Wed, 20 Apr 2011 19:59:12 +0000 (15:59 -0400)
eglib/src/giconv.c

index acfddcac7c051f8d6d1b6675a6787bd434124892..6273d3e19f787ebfbed315cb65e2f9c7f5b35967 100644 (file)
@@ -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;
+}