119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Determine a canonical name for the current locale's character encoding.
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 2000-2003 Free Software Foundation, Inc.
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is free software; you can redistribute it and/or modify it
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   under the terms of the GNU Library General Public License as published
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   by the Free Software Foundation; either version 2, or (at your option)
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   any later version.
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is distributed in the hope that it will be useful,
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Library General Public License for more details.
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   You should have received a copy of the GNU Library General Public
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   License along with this program; if not, write to the Free Software
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   USA.  */
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Written by Bruno Haible <bruno@clisp.org>.  */
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_CONFIG_H
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <config.h>
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Specification.  */
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "localcharset.h"
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_STDDEF_H
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <stddef.h>
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_STRING_H
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <string.h>
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <strings.h>
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_STDLIB_H
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <stdlib.h>
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined _WIN32 || defined __WIN32__
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# undef WIN32   /* avoid warning on mingw32 */
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define WIN32
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined __EMX__
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Assume EMX program runs on OS/2, even if compiled under DOS.  */
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define OS2
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !defined WIN32
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if HAVE_LANGINFO_CODESET
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  include <langinfo.h>
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  if HAVE_SETLOCALE
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#   include <locale.h>
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  endif
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#elif defined WIN32
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define WIN32_LEAN_AND_MEAN
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <windows.h>
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined OS2
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define INCL_DOS
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <os2.h>
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if ENABLE_RELOCATABLE
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include "relocatable.h"
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define relocate(pathname) (pathname)
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Win32, OS/2, DOS */
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define ISSLASH(C) ((C) == '/' || (C) == '\\')
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef DIRECTORY_SEPARATOR
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define DIRECTORY_SEPARATOR '/'
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef ISSLASH
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_DECL_GETC_UNLOCKED
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# undef getc
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define getc getc_unlocked
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* The following static variable is declared 'volatile' to avoid a
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   possible multithread problem in the function get_charset_aliases. If we
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   are running in a threaded environment, and if two threads initialize
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   'charset_aliases' simultaneously, both will produce the same value,
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   and everything will be ok if the two assignments to 'charset_aliases'
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   are atomic. But I don't know what will happen if the two assignments mix.  */
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if __STDC__ != 1
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define volatile /* empty */
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Pointer to the contents of the charset.alias file, if it has already been
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   read, else NULL.  Its format is:
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic const char * volatile charset_aliases;
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Return a pointer to the contents of the charset.alias file.  */
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic const char *
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectget_charset_aliases ()
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *cp;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  cp = charset_aliases;
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (cp == NULL)
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !(defined VMS || defined WIN32)
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      FILE *fp;
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      const char *dir = relocate (LIBDIR);
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      const char *base = "charset.alias";
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      char *file_name;
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* Concatenate dir and base into freshly allocated file_name.  */
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      {
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	size_t dir_len = strlen (dir);
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	size_t base_len = strlen (base);
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (file_name != NULL)
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    memcpy (file_name, dir, dir_len);
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    if (add_slash)
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      file_name[dir_len] = DIRECTORY_SEPARATOR;
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    memcpy (file_name + dir_len + add_slash, base, base_len + 1);
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      }
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/* Out of memory or file not found, treat it as empty.  */
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	cp = "";
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  /* Parse the file's contents.  */
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  int c;
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  char buf1[50+1];
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  char buf2[50+1];
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  char *res_ptr = NULL;
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  size_t res_size = 0;
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  size_t l1, l2;
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  for (;;)
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    {
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      c = getc (fp);
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (c == EOF)
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (c == '\n' || c == ' ' || c == '\t')
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		continue;
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (c == '#')
15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		{
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  /* Skip comment, to end of line.  */
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  do
16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		    c = getc (fp);
16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  while (!(c == EOF || c == '\n'));
16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  if (c == EOF)
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		    break;
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  continue;
16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      ungetc (c, fp);
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      l1 = strlen (buf1);
17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      l2 = strlen (buf2);
17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (res_size == 0)
17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		{
17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  res_size = l1 + 1 + l2 + 1;
17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  res_ptr = (char *) malloc (res_size + 1);
17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      else
17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		{
18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  res_size += l1 + 1 + l2 + 1;
18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  res_ptr = (char *) realloc (res_ptr, res_size + 1);
18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (res_ptr == NULL)
18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		{
18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  /* Out of memory. */
18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  res_size = 0;
18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		  break;
18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      strcpy (res_ptr + res_size - (l2 + 1), buf2);
19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    }
19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  fclose (fp);
19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (res_size == 0)
19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    cp = "";
19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  else
19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    {
19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      *(res_ptr + res_size) = '\0';
19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      cp = res_ptr;
19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    }
20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt      free (file_name);
20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if defined VMS
20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* To avoid the troubles of an extra file charset.alias_vms in the
20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 sources of many GNU packages, simply inline the aliases here.  */
20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 section 10.7 "Handling Different Character Sets".  */
21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "ISO8859-2" "\0" "ISO-8859-2" "\0"
21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "ISO8859-5" "\0" "ISO-8859-5" "\0"
21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "ISO8859-7" "\0" "ISO-8859-7" "\0"
21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "ISO8859-8" "\0" "ISO-8859-8" "\0"
21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "ISO8859-9" "\0" "ISO-8859-9" "\0"
21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   /* Japanese */
21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "eucJP" "\0" "EUC-JP" "\0"
22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "SJIS" "\0" "SHIFT_JIS" "\0"
22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "DECKANJI" "\0" "DEC-KANJI" "\0"
22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "SDECKANJI" "\0" "EUC-JP" "\0"
22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   /* Chinese */
22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "eucTW" "\0" "EUC-TW" "\0"
22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "DECHANYU" "\0" "DEC-HANYU" "\0"
22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "DECHANZI" "\0" "GB2312" "\0"
22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   /* Korean */
22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "DECKOREAN" "\0" "EUC-KR" "\0";
22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if defined WIN32
23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* To avoid the troubles of installing a separate file in the same
23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 directory as the DLL and of retrieving the DLL's directory at
23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 runtime, simply inline the aliases here.  */
23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      cp = "CP936" "\0" "GBK" "\0"
23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP1361" "\0" "JOHAB" "\0"
23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP20127" "\0" "ASCII" "\0"
23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP20866" "\0" "KOI8-R" "\0"
24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP21866" "\0" "KOI8-RU" "\0"
24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28591" "\0" "ISO-8859-1" "\0"
24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28592" "\0" "ISO-8859-2" "\0"
24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28593" "\0" "ISO-8859-3" "\0"
24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28594" "\0" "ISO-8859-4" "\0"
24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28595" "\0" "ISO-8859-5" "\0"
24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28596" "\0" "ISO-8859-6" "\0"
24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28597" "\0" "ISO-8859-7" "\0"
24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28598" "\0" "ISO-8859-8" "\0"
24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28599" "\0" "ISO-8859-9" "\0"
25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   "CP28605" "\0" "ISO-8859-15" "\0";
25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      charset_aliases = cp;
25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return cp;
25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Determine the current locale's character encoding, and canonicalize it
26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   into one of the canonical names listed in config.charset.
26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   The result must not be freed; it is statically allocated.
26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   If the canonical name cannot be determined, the result is a non-canonical
26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   name.  */
26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef STATIC
26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectSTATIC
26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char *
27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlocale_charset ()
27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *codeset;
27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *aliases;
27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !(defined WIN32 || defined OS2)
27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if HAVE_LANGINFO_CODESET
27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Most systems support nl_langinfo (CODESET) nowadays.  */
28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  codeset = nl_langinfo (CODESET);
28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else
28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* On old systems which lack it, use setlocale or getenv.  */
28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *locale = NULL;
28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* But most old systems don't have a complete set of locales.  Some
28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     (like SunOS 4 or DJGPP) have only the C locale.  Therefore we don't
28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     use setlocale here; it would return "C" when it doesn't support the
29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     locale name the user has set.  */
29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  if HAVE_SETLOCALE && 0
29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  locale = setlocale (LC_CTYPE, NULL);
29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  endif
29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (locale == NULL || locale[0] == '\0')
29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      locale = getenv ("LC_ALL");
29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (locale == NULL || locale[0] == '\0')
29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  locale = getenv ("LC_CTYPE");
30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (locale == NULL || locale[0] == '\0')
30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    locale = getenv ("LANG");
30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* On some old systems, one used to set locale = "iso8859_1". On others,
30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     you set it to "language_COUNTRY.charset". In any case, we resolve it
30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     through the charset.alias file.  */
30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  codeset = locale;
30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#elif defined WIN32
31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  static char buf[2 + 10 + 1];
31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Woe32 has a function returning the locale's codepage as a number.  */
31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  sprintf (buf, "CP%u", GetACP ());
31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  codeset = buf;
31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#elif defined OS2
32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *locale;
32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  static char buf[2 + 10 + 1];
32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  ULONG cp[3];
32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  ULONG cplen;
32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Allow user to override the codeset, as set in the operating system,
32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     with standard language environment variables.  */
32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  locale = getenv ("LC_ALL");
33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (locale == NULL || locale[0] == '\0')
33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      locale = getenv ("LC_CTYPE");
33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (locale == NULL || locale[0] == '\0')
33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	locale = getenv ("LANG");
33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (locale != NULL && locale[0] != '\0')
33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* If the locale name contains an encoding after the dot, return it.  */
33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      const char *dot = strchr (locale, '.');
34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (dot != NULL)
34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  const char *modifier;
34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  dot++;
34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  /* Look for the possible @... trailer and remove it, if any.  */
34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  modifier = strchr (dot, '@');
34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (modifier == NULL)
34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    return dot;
35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (modifier - dot < sizeof (buf))
35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    {
35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      memcpy (buf, dot, modifier - dot);
35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      buf [modifier - dot] = '\0';
35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      return buf;
35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    }
35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* Resolve through the charset.alias file.  */
35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      codeset = locale;
36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* OS/2 has a function returning the locale's codepage as a number.  */
36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (DosQueryCp (sizeof (cp), cp, &cplen))
36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	codeset = "";
36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  sprintf (buf, "CP%u", cp[0]);
36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  codeset = buf;
37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (codeset == NULL)
37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* The canonical name cannot be determined.  */
37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    codeset = "";
37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Resolve alias. */
38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  for (aliases = get_charset_aliases ();
38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project       *aliases != '\0';
38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (strcmp (codeset, aliases) == 0
38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	|| (aliases[0] == '*' && aliases[1] == '\0'))
38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      {
38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	codeset = aliases + strlen (aliases) + 1;
38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	break;
38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      }
38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Don't return an empty string.  GNU libc and GNU libiconv interpret
39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     the empty string as denoting "the locale's character encoding",
39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     thus GNU libiconv would call this function a second time.  */
39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (codeset[0] == '\0')
39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    codeset = "ASCII";
39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return codeset;
39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
398