/* 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
#include "gl/c-ctype.h"
#include "gl/c-strcase.h"
#include "gl/localcharset.h"
+#include <gl/localename.h>
#include "gl/minmax.h"
#include "gl/xalloc.h"
#include "gl/relocatable.h"
/* 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;
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);
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);
}
{
struct substring out;
- if ( text == NULL )
+ if (text == NULL)
return NULL;
- if ( length == -1 )
+ if (length == -1)
length = strlen (text);
out = recode_substring_pool (to, from, ss_buffer (text, length), pool);
if (from == NULL)
from = default_encoding;
- conv = create_iconv (to, from);
+ conv = create_iconv (to, from, true);
- if ( NULL == conv )
+ if (NULL == conv)
{
if (fallbackchar)
{
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);
default_encoding = xstrdup (enc);
}
+/* Return the ISO two letter code for the current LC_MESSAGES
+ locale category. */
+char *
+get_language (void)
+{
+ const char *localename = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
+ if (0 == strcmp (localename, "C"))
+ return NULL;
+ char *ln = xstrdup (localename);
+ char *end = strchr (ln, '_');
+ if (end)
+ *end = '\0';
+ return ln;
+}
+
/* Attempts to set the encoding from a locale name
- returns true if successfull.
+ returns true if successful.
This function does not (should not!) alter the current locale.
*/
bool
loc_encoding = xstrdup (locale_charset ());
- if ( 0 == strcmp (loc_encoding, c_encoding))
+ if (0 == strcmp (loc_encoding, c_encoding))
{
ok = false;
}
{
iconv_t conv = iconv_open (UTF8, enc);
- if ( conv == (iconv_t) -1)
+ if (conv == (iconv_t) -1)
return false;
iconv_close (conv);
/* Return the system local's idea of the
- decimal seperator character */
+ decimal separator character */
char
get_system_decimal (void)
{
{
return utf8_casemap (s, u8_tolower);
}
+
+char *
+utf8_to_title (const char *s)
+{
+ return utf8_casemap (s, u8_totitle);
+}
\f
bool
get_encoding_info (struct encoding_info *e, const char *name)
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.