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