#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"
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);
conv = create_iconv (to, from);
- if ( NULL == conv )
+ if (NULL == conv)
{
if (fallbackchar)
{
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)