src/stdlib/SDL_iconv.c
changeset 2182 cc2597da0840
parent 2143 e906da4414a3
child 2183 9f31740cad2e
equal deleted inserted replaced
2181:791cdc226105 2182:cc2597da0840
   109 {
   109 {
   110     const char *name;
   110     const char *name;
   111     int format;
   111     int format;
   112 } encodings[] = {
   112 } encodings[] = {
   113 /* *INDENT-OFF* */
   113 /* *INDENT-OFF* */
   114     { "646", ENCODING_ASCII },
       
   115     { "ASCII", ENCODING_ASCII },
   114     { "ASCII", ENCODING_ASCII },
   116     { "US-ASCII", ENCODING_ASCII },
   115     { "US-ASCII", ENCODING_ASCII },
   117     { "LATIN1", ENCODING_LATIN1 },
       
   118     { "8859-1", ENCODING_LATIN1 },
   116     { "8859-1", ENCODING_LATIN1 },
   119     { "ISO-8859-1", ENCODING_LATIN1 },
   117     { "ISO-8859-1", ENCODING_LATIN1 },
   120     { "UTF8", ENCODING_UTF8 },
   118     { "UTF8", ENCODING_UTF8 },
   121     { "UTF-8", ENCODING_UTF8 },
   119     { "UTF-8", ENCODING_UTF8 },
   122     { "UTF16", ENCODING_UTF16 },
   120     { "UTF16", ENCODING_UTF16 },
   136     { "UCS4", ENCODING_UCS4 },
   134     { "UCS4", ENCODING_UCS4 },
   137     { "UCS-4", ENCODING_UCS4 },
   135     { "UCS-4", ENCODING_UCS4 },
   138 /* *INDENT-ON* */
   136 /* *INDENT-ON* */
   139 };
   137 };
   140 
   138 
       
   139 static const char *
       
   140 getlocale()
       
   141 {
       
   142     const char *lang;
       
   143 
       
   144     lang = SDL_getenv("LC_ALL");
       
   145     if (!lang) {
       
   146         lang = SDL_getenv("LC_CTYPE");
       
   147     }
       
   148     if (!lang) {
       
   149         lang = SDL_getenv("LC_MESSAGES");
       
   150     }
       
   151     if (!lang) {
       
   152         lang = SDL_getenv("LANG");
       
   153     }
       
   154     if (!lang || !*lang || SDL_strcmp(lang, "C") == 0) {
       
   155         lang = "ASCII";
       
   156     }
       
   157     return lang;
       
   158 }
       
   159 
   141 SDL_iconv_t
   160 SDL_iconv_t
   142 SDL_iconv_open(const char *tocode, const char *fromcode)
   161 SDL_iconv_open(const char *tocode, const char *fromcode)
   143 {
   162 {
   144     int src_fmt = ENCODING_UNKNOWN;
   163     int src_fmt = ENCODING_UNKNOWN;
   145     int dst_fmt = ENCODING_UNKNOWN;
   164     int dst_fmt = ENCODING_UNKNOWN;
   146     int i;
   165     int i;
   147 
   166 
       
   167     if (!fromcode || !*fromcode) {
       
   168         fromcode = getlocale();
       
   169     }
       
   170     if (!tocode || !*tocode) {
       
   171         fromcode = getlocale();
       
   172     }
   148     for (i = 0; i < SDL_arraysize(encodings); ++i) {
   173     for (i = 0; i < SDL_arraysize(encodings); ++i) {
   149         if (SDL_strcasecmp(fromcode, encodings[i].name) == 0) {
   174         if (SDL_strcasecmp(fromcode, encodings[i].name) == 0) {
   150             src_fmt = encodings[i].format;
   175             src_fmt = encodings[i].format;
   151             if (dst_fmt != ENCODING_UNKNOWN) {
   176             if (dst_fmt != ENCODING_UNKNOWN) {
   152                 break;
   177                 break;
   803     size_t stringsize;
   828     size_t stringsize;
   804     char *outbuf;
   829     char *outbuf;
   805     size_t outbytesleft;
   830     size_t outbytesleft;
   806     size_t retCode = 0;
   831     size_t retCode = 0;
   807 
   832 
   808     if (!fromcode || !*fromcode) {
       
   809         fromcode = getlocale();
       
   810     }
       
   811     if (!tocode || !*tocode) {
       
   812         tocode = getlocale();
       
   813     }
       
   814     cd = SDL_iconv_open(tocode, fromcode);
   833     cd = SDL_iconv_open(tocode, fromcode);
       
   834     if (cd == (SDL_iconv_t) - 1) {
       
   835         /* See if we can recover here (fixes iconv on Solaris 11) */
       
   836         if (!tocode || !*tocode) {
       
   837             tocode = "UTF-8";
       
   838         }
       
   839         if (!fromcode || !*fromcode) {
       
   840             tocode = "UTF-8";
       
   841         }
       
   842         cd = SDL_iconv_open(tocode, fromcode);
       
   843     }
   815     if (cd == (SDL_iconv_t) - 1) {
   844     if (cd == (SDL_iconv_t) - 1) {
   816         return NULL;
   845         return NULL;
   817     }
   846     }
   818 
   847 
   819     stringsize = inbytesleft > 4 ? inbytesleft : 4;
   848     stringsize = inbytesleft > 4 ? inbytesleft : 4;