00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 # include <config.h>
00024 #endif
00025
00026 #if HAVE_STDDEF_H
00027 # include <stddef.h>
00028 #endif
00029
00030 #include <stdio.h>
00031 #if HAVE_STRING_H
00032 # include <string.h>
00033 #else
00034 # include <strings.h>
00035 #endif
00036 #if HAVE_STDLIB_H
00037 # include <stdlib.h>
00038 #endif
00039
00040 #if defined _WIN32 || defined __WIN32__
00041 # undef WIN32
00042 # define WIN32
00043 #endif
00044
00045 #ifndef WIN32
00046 # if HAVE_LANGINFO_CODESET
00047 # include <langinfo.h>
00048 # else
00049 # if HAVE_SETLOCALE
00050 # include <locale.h>
00051 # endif
00052 # endif
00053 #else
00054 # define WIN32_LEAN_AND_MEAN
00055 # include <windows.h>
00056 #endif
00057
00058 #include "gettextP.h"
00059
00060 #ifndef DIRECTORY_SEPARATOR
00061 # define DIRECTORY_SEPARATOR '/'
00062 #endif
00063
00064 #ifndef ISSLASH
00065 # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
00066 #endif
00067
00068
00069
00070
00071
00072
00073
00074 #if __STDC__ != 1
00075 # define volatile
00076 #endif
00077
00078
00079
00080 static const char * volatile charset_aliases;
00081
00082
00083 static const char *get_charset_aliases PARAMS ((void));
00084
00085
00086 static const char *
00087 get_charset_aliases ()
00088 {
00089 const char *cp;
00090
00091 cp = charset_aliases;
00092 if (cp == NULL)
00093 {
00094 #ifndef WIN32
00095 FILE *fp;
00096 const char *dir = LIBDIR;
00097 const char *base = "charset.alias";
00098 char *file_name;
00099
00100
00101 {
00102 size_t dir_len = strlen (dir);
00103 size_t base_len = strlen (base);
00104 int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
00105 file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
00106 if (file_name != NULL)
00107 {
00108 memcpy (file_name, dir, dir_len);
00109 if (add_slash)
00110 file_name[dir_len] = DIRECTORY_SEPARATOR;
00111 memcpy (file_name + dir_len + add_slash, base, base_len + 1);
00112 }
00113 }
00114
00115 if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
00116
00117 cp = "";
00118 else
00119 {
00120
00121 int c;
00122 char buf1[50+1];
00123 char buf2[50+1];
00124 char *res_ptr = NULL;
00125 size_t res_size = 0;
00126 size_t l1, l2;
00127
00128 for (;;)
00129 {
00130 c = getc (fp);
00131 if (c == EOF)
00132 break;
00133 if (c == '\n' || c == ' ' || c == '\t')
00134 continue;
00135 if (c == '#')
00136 {
00137
00138 do
00139 c = getc (fp);
00140 while (!(c == EOF || c == '\n'));
00141 if (c == EOF)
00142 break;
00143 continue;
00144 }
00145 ungetc (c, fp);
00146 if (fscanf(fp, "%50s %50s", buf1, buf2) < 2)
00147 break;
00148 l1 = strlen (buf1);
00149 l2 = strlen (buf2);
00150 if (res_size == 0)
00151 {
00152 res_size = l1 + 1 + l2 + 1;
00153 res_ptr = malloc (res_size + 1);
00154 }
00155 else
00156 {
00157 res_size += l1 + 1 + l2 + 1;
00158 res_ptr = realloc (res_ptr, res_size + 1);
00159 }
00160 if (res_ptr == NULL)
00161 {
00162
00163 res_size = 0;
00164 break;
00165 }
00166 strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
00167 strcpy (res_ptr + res_size - (l2 + 1), buf2);
00168 }
00169 fclose (fp);
00170 if (res_size == 0)
00171 cp = "";
00172 else
00173 {
00174 *(res_ptr + res_size) = '\0';
00175 cp = res_ptr;
00176 }
00177 }
00178
00179 if (file_name != NULL)
00180 free (file_name);
00181
00182 #else
00183
00184
00185
00186
00187
00188 cp = "CP936" "\0" "GBK" "\0"
00189 "CP1361" "\0" "JOHAB" "\0";
00190 #endif
00191
00192 charset_aliases = cp;
00193 }
00194
00195 return cp;
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205 const char *
00206 locale_charset ()
00207 {
00208 const char *codeset;
00209 const char *aliases;
00210
00211 #ifndef WIN32
00212
00213 # if HAVE_LANGINFO_CODESET
00214
00215
00216 codeset = nl_langinfo (CODESET);
00217
00218 # else
00219
00220
00221 const char *locale = NULL;
00222
00223
00224
00225
00226
00227 # if HAVE_SETLOCALE && 0
00228 locale = setlocale (LC_CTYPE, NULL);
00229 # endif
00230 if (locale == NULL || locale[0] == '\0')
00231 {
00232 locale = getenv ("LC_ALL");
00233 if (locale == NULL || locale[0] == '\0')
00234 {
00235 locale = getenv ("LC_CTYPE");
00236 if (locale == NULL || locale[0] == '\0')
00237 locale = getenv ("LANG");
00238 }
00239 }
00240
00241
00242
00243
00244 codeset = locale;
00245
00246 # endif
00247
00248 #else
00249
00250 static char buf[2 + 10 + 1];
00251
00252
00253 sprintf (buf, "CP%u", GetACP ());
00254 codeset = buf;
00255
00256 #endif
00257
00258 if (codeset == NULL)
00259
00260 codeset = "";
00261
00262
00263 for (aliases = get_charset_aliases ();
00264 *aliases != '\0';
00265 aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
00266 if (strcmp (codeset, aliases) == 0
00267 || (aliases[0] == '*' && aliases[1] == '\0'))
00268 {
00269 codeset = aliases + strlen (aliases) + 1;
00270 break;
00271 }
00272
00273 return codeset;
00274 }