X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fi18n.c;h=d553e135540c263e9eccf630073c96f31272b9ec;hb=855eaf1506f0ea76a8bbfb3bbfd456524f4edeca;hp=55b2d67fab0665a9605254964daf73c51bc7a7ba;hpb=76c790067446eb993f615813069936887fbb4fc8;p=pspp diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index 55b2d67fab..d553e13554 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -40,6 +40,7 @@ #include "gl/c-ctype.h" #include "gl/c-strcase.h" #include "gl/localcharset.h" +#include #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/relocatable.h" @@ -106,21 +107,18 @@ 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); } - + hmapx_insert (&map, converter, hash); return converter; @@ -242,7 +240,7 @@ try_recode (struct converter *cvtr, char fallbackchar, for (i = 0 ; i < null_bytes ; ++i) *out++ = '\0'; - + return out - 1 - out_; } @@ -264,10 +262,10 @@ recode_string_pool (const char *to, const char *from, { 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); @@ -563,7 +561,7 @@ recode_substring_pool__ (const char *to, const char *from, conv = create_iconv (to, from); - if ( NULL == conv ) + if (NULL == conv) { if (fallbackchar) { @@ -643,7 +641,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); @@ -665,9 +665,24 @@ set_default_encoding (const char *enc) 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 @@ -685,7 +700,7 @@ set_encoding_from_locale (const char *loc) loc_encoding = xstrdup (locale_charset ()); - if ( 0 == strcmp (loc_encoding, c_encoding)) + if (0 == strcmp (loc_encoding, c_encoding)) { ok = false; } @@ -737,7 +752,7 @@ valid_encoding (const char *enc) { iconv_t conv = iconv_open (UTF8, enc); - if ( conv == (iconv_t) -1) + if (conv == (iconv_t) -1) return false; iconv_close (conv); @@ -747,7 +762,7 @@ valid_encoding (const char *enc) /* Return the system local's idea of the - decimal seperator character */ + decimal separator character */ char get_system_decimal (void) { @@ -952,6 +967,12 @@ utf8_to_lower (const char *s) { return utf8_casemap (s, u8_tolower); } + +char * +utf8_to_title (const char *s) +{ + return utf8_casemap (s, u8_totitle); +} bool get_encoding_info (struct encoding_info *e, const char *name)