Rationalise null pointer checks in both decode_codepage functions, so
[sgt/putty] / unix / uxucs.c
index 071ecfc..5d3d5af 100644 (file)
@@ -21,7 +21,7 @@ int is_dbcs_leadbyte(int codepage, char byte)
     return 0;                         /* we don't do DBCS */
 }
 
-int mb_to_wc(int codepage, int flags, char *mbstr, int mblen,
+int mb_to_wc(int codepage, int flags, const char *mbstr, int mblen,
             wchar_t *wcstr, int wclen)
 {
     if (codepage == DEFAULT_CODEPAGE) {
@@ -29,7 +29,6 @@ int mb_to_wc(int codepage, int flags, char *mbstr, int mblen,
        mbstate_t state;
 
        memset(&state, 0, sizeof state);
-       setlocale(LC_CTYPE, "");
 
        while (mblen > 0) {
            size_t i = mbrtowc(wcstr+n, mbstr, (size_t)mblen, &state);
@@ -40,8 +39,6 @@ int mb_to_wc(int codepage, int flags, char *mbstr, int mblen,
            mblen -= i;
        }
 
-       setlocale(LC_CTYPE, "C");
-
        return n;
     } else if (codepage == CS_NONE) {
        int n = 0;
@@ -59,7 +56,7 @@ int mb_to_wc(int codepage, int flags, char *mbstr, int mblen,
                                  NULL, NULL, 0);
 }
 
-int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
+int wc_to_mb(int codepage, int flags, const wchar_t *wcstr, int wclen,
             char *mbstr, int mblen, char *defchr, int *defused,
             struct unicode_data *ucsdata)
 {
@@ -73,7 +70,6 @@ int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
        int n = 0;
 
        memset(&state, 0, sizeof state);
-       setlocale(LC_CTYPE, "");
 
        while (wclen > 0) {
            int i = wcrtomb(output, wcstr[0], &state);
@@ -85,8 +81,6 @@ int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
            wclen--;
        }
 
-       setlocale(LC_CTYPE, "C");
-
        return n;
     } else if (codepage == CS_NONE) {
        int n = 0;
@@ -162,7 +156,8 @@ int init_ucs(struct unicode_data *ucsdata, char *linecharset,
      * in the line codepage into Unicode.
      */
     for (i = 0; i < 256; i++) {
-       char c[1], *p;
+       char c[1];
+        const char *p;
        wchar_t wc[1];
        int len;
        c[0] = i;
@@ -216,7 +211,8 @@ int init_ucs(struct unicode_data *ucsdata, char *linecharset,
      * simply CP437.
      */
     for (i = 0; i < 256; i++) {
-       char c[1], *p;
+       char c[1];
+        const char *p;
        wchar_t wc[1];
        int len;
        c[0] = i;
@@ -257,17 +253,19 @@ const char *cp_name(int codepage)
 const char *cp_enumerate(int index)
 {
     int charset;
-    if (index == 0)
-       return "Use font encoding";
-    charset = charset_localenc_nth(index-1);
-    if (charset == CS_NONE)
+    charset = charset_localenc_nth(index);
+    if (charset == CS_NONE) {
+        /* "Use font encoding" comes after all the named charsets */
+        if (charset_localenc_nth(index-1) != CS_NONE)
+            return "Use font encoding";
        return NULL;
+    }
     return charset_to_localenc(charset);
 }
 
 int decode_codepage(char *cp_name)
 {
-    if (!*cp_name)
-       return CS_NONE;                /* use font encoding */
+    if (!cp_name || !*cp_name)
+       return CS_UTF8;
     return charset_from_localenc(cp_name);
 }