/* 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
/* 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);
if (from == NULL)
from = default_encoding;
- conv = create_iconv (to, from);
+ conv = create_iconv (to, from, true);
if (NULL == conv)
{
unsigned int
utf8_hash_case_string (const char *s, unsigned int basis)
{
- return utf8_hash_case_bytes (s, strlen (s), basis);
+ return utf8_hash_case_substring (ss_cstr (s), basis);
+}
+
+/* Returns a hash value for UTF-8 string S, with lowercase and uppercase
+ letters treated as equal, starting from BASIS. */
+unsigned int
+utf8_hash_case_substring (struct substring s, unsigned int basis)
+{
+ return utf8_hash_case_bytes (s.string, s.length, basis);
}
/* Compares UTF-8 strings A and B case-insensitively.
int
utf8_strcasecmp (const char *a, const char *b)
{
- return utf8_strncasecmp (a, strlen (a), b, strlen (b));
+ return utf8_sscasecmp (ss_cstr (a), ss_cstr (b));
+}
+
+int
+utf8_sscasecmp (struct substring a, struct substring b)
+{
+ return utf8_strncasecmp (a.string, a.length, b.string, b.length);
}
/* Compares UTF-8 strings A (with length AN) and B (with length BN)
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.