X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fi18n.c;h=ac195cc517529da246ed333cbd640b6be5ff084d;hb=refs%2Fheads%2Fmatrix2;hp=d553e135540c263e9eccf630073c96f31272b9ec;hpb=35cf05a2036e9c3562d275ed812059dd7b2b5d01;p=pspp diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index d553e13554..ac195cc517 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); @@ -559,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) { @@ -827,7 +829,15 @@ utf8_hash_case_bytes (const char *s, size_t n, unsigned int basis) 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. @@ -835,7 +845,13 @@ utf8_hash_case_string (const char *s, unsigned int basis) 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) @@ -1055,8 +1071,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.