/* Determine a canonical name for the current locale's character encoding.
Copyright (C) 2000-2006, 2008-2012 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
by the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>. */
#include "config.h"
/* Specification. */
#include "localcharset.h"
#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
#endif
#if defined _WIN32 || defined __WIN32__
# define WINDOWS_NATIVE
# include <locale.h>
#endif
#if defined __EMX__
/* Assume EMX program runs on OS/2, even if compiled under DOS. */
# ifndef OS2
# define OS2
# endif
#endif
#if !defined WINDOWS_NATIVE
# include <unistd.h>
# if HAVE_LANGINFO_CODESET
# include <langinfo.h>
# else
# if 0 /* see comment below */
# include <locale.h>
# endif
# endif
# ifdef __CYGWIN__
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# endif
#elif defined WINDOWS_NATIVE
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#endif
#if defined OS2
# define INCL_DOS
# include <os2.h>
#endif
/* For MB_CUR_MAX_L */
#if defined DARWIN7
# include <xlocale.h>
#endif
#if ENABLE_RELOCATABLE
# include "relocatable.h"
#else
# define relocate(pathname) (pathname)
#endif
/* Get LIBDIR. */
#ifndef LIBDIR
//# include "configmake.h"
#endif
/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */
#ifndef O_NOFOLLOW
# define O_NOFOLLOW 0
#endif
#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
/* Native Windows, Cygwin, OS/2, DOS */
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
#endif
#ifndef DIRECTORY_SEPARATOR
# define DIRECTORY_SEPARATOR '/'
#endif
#ifndef ISSLASH
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
#endif
#if HAVE_DECL_GETC_UNLOCKED
# undef getc
# define getc getc_unlocked
#endif
/* The following static variable is declared 'volatile' to avoid a
possible multithread problem in the function get_charset_aliases. If we
are running in a threaded environment, and if two threads initialize
'charset_aliases' simultaneously, both will produce the same value,
and everything will be ok if the two assignments to 'charset_aliases'
are atomic. But I don't know what will happen if the two assignments mix. */
#if __STDC__ != 1
# define volatile /* empty */
#endif
/* Pointer to the contents of the charset.alias file, if it has already been
read, else NULL. Its format is:
ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
static const char * volatile charset_aliases;
/* Return a pointer to the contents of the charset.alias file. */
static const char *
get_charset_aliases (void)
{
const char *cp;
cp = charset_aliases;
if (cp == NULL)
{
#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__ || defined OS2)
const char *dir;
const char *base = "charset.alias";
char *file_name;
/* Make it possible to override the charset.alias location. This is
necessary for running the testsuite before "make install". */
dir = getenv ("CHARSETALIASDIR");
if (dir == NULL || dir[0] == '\0')
dir = relocate (LIBDIR);
/* Concatenate dir and base into freshly allocated file_name. */
{
size_t dir_len = strlen (dir);
size_t base_len = strlen (base);
int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
if (file_name != NULL)
{
memcpy (file_name, dir, dir_len);
if (add_slash)
file_name[dir_len] = DIRECTORY_SEPARATOR;
memcpy (file_name + dir_len + add_slash, base, base_len + 1);
}
}
if (file_name == NULL)
/* Out of memory. Treat the file as empty. */
cp = "";
else
{
int fd;
/* Open the file. Reject symbolic links on platforms that support
O_NOFOLLOW. This is a security feature. Without it, an attacker
could retrieve parts of the contents (namely, the tail of the
first line that starts with "* ") of an arbitrary file by placing
a symbolic link to that file under the name "charset.alias" in
some writable directory and defining the environment variable
CHARSETALIASDIR to point to that directory. */
fd = open (file_name,
O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
if (fd < 0)
/* File not found. Treat it as empty. */
cp = "";
else
{
FILE *fp;
fp = fdopen (fd, "r");
if (fp == NULL)
{
/* Out of memory. Treat the file as empty. */
close (fd);
cp = "";
}
else
{
/* Parse the file's contents. */
char *res_ptr = NULL;
size_t res_size = 0;
for (;;)
{
int c;
char buf1[50+1];
char buf2[50+1];
size_t l1, l2;
char *old_res_ptr;
c = getc (fp);
if (c == EOF)
break;
if (c == '\n' || c == ' ' || c == '\t')
continue;
if (c == '#')
{
/* Skip comment, to end of line. */
do
c = getc (fp);
while (!(c == EOF || c == '\n'));
if (c == EOF)
break;
continue;
}
ungetc (c, fp);
if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
break;
l1 = strlen (buf1);
l2 = strlen (buf2);
old_res_ptr = res_ptr;
if (res_size == 0)
{
res_size = l1 + 1 + l2 + 1;
res_ptr = (char *) malloc (res_size + 1);
}
else
{
res_size += l1 + 1 + l2 + 1;
res_ptr = (char *) realloc (res_ptr, res_size + 1);
}
if (res_ptr == NULL)
{
/* Out of memory. */
res_size = 0;
free (old_res_ptr);
break;
}
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
strcpy (res_ptr + res_size - (l2 + 1), buf2);
}
fclose (fp);
if (res_size == 0)
cp = "";
else
{
*(res_ptr + res_size) = '\0';
c
没有合适的资源?快使用搜索试试~ 我知道了~
libiconv-1.15 for win10
共296个文件
h:222个
tlog:22个
def:7个
4星 · 超过85%的资源 需积分: 9 119 下载量 128 浏览量
2018-06-06
11:38:37
上传
评论 2
收藏 15.75MB ZIP 举报
温馨提示
把libiconv-1.15源码移植到win10平台上,里面包含完整的VS2015工程,可以按照需要编译出自己的libiconv库
资源推荐
资源详情
资源评论
收起资源包目录
libiconv-1.15 for win10 (296个子文件)
localcharset.c 20KB
relocatable.c 17KB
iconv.c 16KB
gentranslit.c 8KB
genaliases.c 4KB
genflags.c 4KB
genaliases2.c 3KB
libiconv.VC.db 27.24MB
translit.def 156KB
encodings.def 38KB
encodings_dos.def 5KB
encodings_aix.def 3KB
encodings_extra.def 2KB
encodings_osf1.def 1KB
encodings_local.def 1KB
libiconv.dll 905KB
libiconv.vcxproj.filters 1KB
aliases_syshpux.gperf 8KB
aliases_sysaix.gperf 8KB
aliases_syssolaris.gperf 8KB
aliases_sysosf1.gperf 8KB
aliases.gperf 8KB
cns11643_inv.h 935KB
jisx0213.h 275KB
big5.h 256KB
cjk_variants.h 248KB
ksc5601.h 182KB
hkscs1999.h 182KB
gb2312.h 154KB
gbkext_inv.h 147KB
jisx0208.h 145KB
jisx0212.h 131KB
gb12345ext.h 105KB
translit.h 96KB
uhc_1.h 82KB
cns11643_5.h 74KB
aliases_syshpux.h 74KB
aliases_syssolaris.h 73KB
aliases_sysaix.h 73KB
aliases_sysosf1.h 72KB
gbkext2.h 69KB
aliases.h 68KB
cns11643_2.h 64KB
cns11643_15.h 63KB
cns11643_7.h 57KB
cns11643_3.h 56KB
cns11643_6.h 56KB
gbkext1.h 51KB
cns11643_1.h 51KB
uhc_2.h 47KB
isoir165ext.h 45KB
cns11643_4b.h 39KB
cp932ext.h 39KB
hkscs2001.h 33KB
hkscs2004.h 32KB
cns11643_4a.h 27KB
hkscs2008.h 21KB
big5_2003.h 20KB
iso2022_jp2.h 18KB
loop_unicode.h 17KB
iso2022_cnext.h 16KB
iso2022_jp3.h 15KB
loop_wchar.h 15KB
gb18030ext.h 14KB
gb18030.h 14KB
cp1255.h 13KB
iso2022_jpms.h 12KB
vietcomb.h 12KB
gb18030uni.h 12KB
tcvn.h 11KB
cp950.h 11KB
cp1258.h 10KB
utf7.h 10KB
johab_hangul.h 10KB
shift_jisx0213.h 10KB
iconv.h 9KB
euc_jisx0213.h 9KB
iso2022_cn.h 8KB
converters.h 8KB
flags.h 8KB
cp864.h 8KB
koi8_u.h 7KB
koi8_ru.h 7KB
cp932.h 7KB
mac_croatian.h 7KB
mac_romania.h 7KB
cp50221_0212_ext.h 7KB
mac_roman.h 7KB
mac_turkish.h 7KB
big5hkscs2008.h 7KB
mac_iceland.h 7KB
atarist.h 7KB
canonical_syshpux.h 7KB
canonical.h 7KB
canonical_sysosf1.h 7KB
cp865.h 7KB
cp861.h 7KB
cp437.h 7KB
cp863.h 7KB
koi8_r.h 7KB
共 296 条
- 1
- 2
- 3
资源评论
- mhb_10242019-09-22可以是使用还行吧
Nani_xiao
- 粉丝: 1169
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功