X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fi18n.c;h=69162f14f07c72b35e55537f2bd0623f2bb20d5c;hb=c94be33beb7085e1cbb1ec47f0e3a49c896d443b;hp=31f07ed8da0234d24bf8e53b5b77f377098ebaeb;hpb=bea279dad74479d86671f3acdc8c945d3ce5f2be;p=pspp diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index 31f07ed8da..69162f14f0 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -1,5 +1,6 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc. + Copyright (C) 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 2016, 2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -62,7 +63,7 @@ static struct hmapx map; /* A wrapper around iconv_open */ static struct converter * -create_iconv (const char* tocode, const char* fromcode) +create_iconv (const char* tocode, const char* fromcode, bool warn) { size_t hash; struct hmapx_node *node; @@ -89,10 +90,11 @@ create_iconv (const char* tocode, const char* fromcode) as the converters have not yet been set up */ if (error && strcmp (tocode, fromcode)) { - fprintf (stderr, - "Warning: " - "cannot create a converter for `%s' to `%s': %s\n", - fromcode, tocode, strerror (error)); + if (warn) + fprintf (stderr, + "Warning: " + "cannot create a converter for `%s' to `%s': %s\n", + fromcode, tocode, strerror (error)); free (converter->tocode); free (converter->fromcode); @@ -107,18 +109,15 @@ create_iconv (const char* tocode, const char* fromcode) iconv_t bconv = iconv_open (tocode, "ASCII"); if (bconv != (iconv_t) -1) { - ICONV_CONST char *nullstr = strdup (""); - ICONV_CONST char *outbuf = strdup ("XXXXXXXX"); - ICONV_CONST char *snullstr = nullstr; - ICONV_CONST char *soutbuf = outbuf; - - size_t inbytes = 1; - const size_t bytes = 8; - size_t outbytes = bytes; - if (-1 != iconv (bconv, &nullstr, &inbytes, &outbuf, &outbytes)) - converter->null_char_width = bytes - outbytes; - free (snullstr); - free (soutbuf); + ICONV_CONST char inbuf[1] = ""; + ICONV_CONST char *inptr = inbuf; + size_t inbytes = sizeof inbuf; + + char outbuf[8]; + char *outptr = outbuf; + size_t outbytes = sizeof outbuf; + if (-1 != iconv (bconv, &inptr, &inbytes, &outptr, &outbytes)) + converter->null_char_width = outptr - outbuf; iconv_close (bconv); } @@ -562,7 +561,7 @@ recode_substring_pool__ (const char *to, const char *from, if (from == NULL) from = default_encoding; - conv = create_iconv (to, from); + conv = create_iconv (to, from, true); if (NULL == conv) { @@ -644,7 +643,9 @@ void i18n_init (void) { setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, relocate(locale_dir)); + char *allocated; + bindtextdomain (PACKAGE, relocate2 (locale_dir, &allocated)); + free (allocated); textdomain (PACKAGE); assert (default_encoding == NULL); @@ -1056,8 +1057,8 @@ is_encoding_ebcdic_compatible (const char *encoding) bool is_encoding_supported (const char *encoding) { - return (create_iconv ("UTF-8", encoding) - && create_iconv (encoding, "UTF-8")); + return (create_iconv ("UTF-8", encoding, false) + && create_iconv (encoding, "UTF-8", false)); } /* Returns true if E is the name of a UTF-8 encoding.