1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
/*
* check_charset.c -- routines for character sets
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
#include <h/mh.h>
#include <langinfo.h>
/*
* Get the current character set
*/
char *
get_charset ()
{
return norm_charmap(nl_langinfo (CODESET));
}
/*
* Check if we can display a given character set natively.
* We are passed the length of the initial part of the
* string to check, since we want to allow the name of the
* character set to be a substring of a larger string.
*/
int
check_charset (char *str, int len)
{
static char *mm_charset = NULL;
static char *alt_charset = NULL;
static int mm_len;
static int alt_len;
/* Cache the name of our default character set */
if (!mm_charset) {
if (!(mm_charset = get_charset ()))
mm_charset = "US-ASCII";
mm_len = strlen (mm_charset);
/* US-ASCII is a subset of the ISO-8859-X and UTF-8 character sets */
if (!strncasecmp("ISO-8859-", mm_charset, 9) ||
!strcasecmp("UTF-8", mm_charset)) {
alt_charset = "US-ASCII";
alt_len = strlen (alt_charset);
}
}
/* Check if character set is OK */
if ((len == mm_len) && !strncasecmp(str, mm_charset, mm_len))
return 1;
if (alt_charset && (len == alt_len) && !strncasecmp(str, alt_charset, alt_len))
return 1;
return 0;
}
/*
* Return the name of the character set we are
* using for 8bit text.
*/
char *
write_charset_8bit (void)
{
static char *mm_charset = NULL;
/*
* Cache the name of the character set to
* use for 8bit text.
*/
if (!mm_charset && !(mm_charset = get_charset ()))
mm_charset = "x-unknown";
return mm_charset;
}
|