mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-17 12:01:53 +08:00
660dade387
* acinclude.m4: Move iconv options into configure.in. * aclocal.m4: Regenerated. * configure: Ditto. * configure.in: Add iconv options. * newlib.hin: Add new iconv encodings and remove deleted ones. * doc/aclocal.m4: Regenerated. * doc/configure: Ditto. * iconvdata/aclocal.m4: Ditto. * iconvdata/configure: Ditto. * libc/iconv: Design change. New size-optimized ccs format. * libc/iconv/AUTHORS: Removed. * libc/iconv/COPYING: Ditto. * libc/iconv/README.ORIGINAL: Ditto. * libc/iconv/README.TODO: Ditto. * libc/iconv/charset.aliases: Ditto. * libc/iconv/encoding.aliases: New file. * libc/iconv/Makefile.am: Updated. * libc/iconv/Makefile.in: Regenerated. * libc/iconv/iconv.tex: Updated. * libc/iconv/ccs/Makefile.am: Ditto. * libc/iconv/ccs/Makefile.in: Regenerated. * libc/iconv/ccs/big5.c: Updated. * libc/iconv/ccs/cns11643_plane1.c: Ditto. * libc/iconv/ccs/cns11643_plane14.c: Ditto. * libc/iconv/ccs/cns11643_plane2.c: Ditto. * libc/iconv/ccs/cp775.c: Ditto. * libc/iconv/ccs/cp850.c: Ditto. * libc/iconv/ccs/cp852.c: Ditto. * libc/iconv/ccs/cp855.c: Ditto. * libc/iconv/ccs/cp866.c: Ditto. * libc/iconv/ccs/iso_8859_1.c: Ditto. * libc/iconv/ccs/README.CCS.SOURCES: Removed. * libc/iconv/ccs/gb_2312_80.c: Ditto. * libc/iconv/ccs/iconv_mktbl: Ditto. * libc/iconv/ccs/jis_x0201.c: Ditto. * libc/iconv/ccs/jis_x0208_1983.c: Ditto. * libc/iconv/ccs/shift_jis.c: Ditto. * libc/iconv/ccs/us_ascii.c: Ditto. * libc/iconv/ccs/ccs.h: New file. * libc/iconv/ccs/ccsbi.c: Ditto. * libc/iconv/ccs/ccsbi.h: Ditto. * libc/iconv/ccs/ccsnames.h: Ditto. * libc/iconv/ccs/iso_8859_10.c: Ditto. * libc/iconv/ccs/iso_8859_11.c: Ditto. * libc/iconv/ccs/iso_8859_13.c: Ditto. * libc/iconv/ccs/iso_8859_14.c: Ditto. * libc/iconv/ccs/iso_8859_3.c: Ditto. * libc/iconv/ccs/iso_8859_6.c: Ditto. * libc/iconv/ccs/iso_8859_7.c: Ditto. * libc/iconv/ccs/iso_8859_8.c: Ditto. * libc/iconv/ccs/iso_8859_9.c: Ditto. * libc/iconv/ccs/iso_ir_111.c: Ditto. * libc/iconv/ccs/jis_x0201_1976.c: Ditto. * libc/iconv/ccs/jis_x0208_1990.c: Ditto. * libc/iconv/ccs/koi8_ru.c: Ditto. * libc/iconv/ccs/koi8_uni.c: Ditto. * libc/iconv/ccs/mktbl.pl: Ditto. * libc/iconv/ccs/win_1250.c: Ditto. * libc/iconv/ccs/win_1251.c: Ditto. * libc/iconv/ccs/win_1252.c: Ditto. * libc/iconv/ccs/win_1253.c: Ditto. * libc/iconv/ccs/win_1254.c: Ditto. * libc/iconv/ccs/win_1255.c: Ditto. * libc/iconv/ccs/win_1256.c: Ditto. * libc/iconv/ccs/win_1257.c: Ditto. * libc/iconv/ccs/win_1258.c: Ditto. * libc/iconv/ccs/iso_8859_15.c * libc/iconv/ccs/iso_8859_2.c * libc/iconv/ccs/iso_8859_4.c * libc/iconv/ccs/iso_8859_5.c * libc/iconv/ccs/jis_x0212_1990.c * libc/iconv/ccs/koi8_r.c * libc/iconv/ccs/koi8_u.c * libc/iconv/ccs/ksx1001.c * libc/iconv/ccs/binary/gb_2312_80.cct: Removed. * libc/iconv/ccs/binary/jis_x0201.cct: Ditto. * libc/iconv/ccs/binary/shift_jis.cct: Ditto. * libc/iconv/ccs/binary/us_ascii.cct: Ditto. * libc/iconv/ccs/binary/jis_x0208_1983.cct: Ditto. * libc/iconv/ccs/binary/Makefile.am: Updated. * libc/iconv/ccs/binary/Makefile.in: Regenerated. * libc/iconv/ccs/binary/big5.cct: Updated. * libc/iconv/ccs/binary/cns11643_plane1.cct: Ditto. * libc/iconv/ccs/binary/cns11643_plane14.cct: Ditto. * libc/iconv/ccs/binary/cns11643_plane2.cct: Ditto. * libc/iconv/ccs/binary/cp775.cct: Updated.: Ditto. * libc/iconv/ccs/binary/cp850.cct: Ditto.: Ditto. * libc/iconv/ccs/binary/cp852.cct: Ditto.: Ditto. * libc/iconv/ccs/binary/cp855.cct: Ditto.: Ditto. * libc/iconv/ccs/binary/cp866.cct: Ditto.: Ditto. * libc/iconv/ccs/binary/iso_8859_1.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_15.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_4.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_5.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_2.cct: Ditto. * libc/iconv/ccs/binary/jis_x0212_1990.cct: Ditto. * libc/iconv/ccs/binary/koi8_r.cct: Ditto. * libc/iconv/ccs/binary/koi8_u.cct: Ditto. * libc/iconv/ccs/binary/ksx1001.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_10.cct: New file. * libc/iconv/ccs/binary/iso_8859_11.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_13.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_14.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_3.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_6.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_7.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_8.cct: Ditto. * libc/iconv/ccs/binary/iso_8859_9.cct: Ditto. * libc/iconv/ccs/binary/iso_ir_111.cct: Ditto. * libc/iconv/ccs/binary/jis_x0201_1976.cct: Ditto. * libc/iconv/ccs/binary/jis_x0208_1990.cct: Ditto. * libc/iconv/ccs/binary/koi8_ru.cct: Ditto. * libc/iconv/ccs/binary/koi8_uni.cct: Ditto. * libc/iconv/ccs/binary/win_1250.cct: Ditto. * libc/iconv/ccs/binary/win_1251.cct: Ditto. * libc/iconv/ccs/binary/win_1252.cct: Ditto. * libc/iconv/ccs/binary/win_1253.cct: Ditto. * libc/iconv/ccs/binary/win_1254.cct: Ditto. * libc/iconv/ccs/binary/win_1255.cct: Ditto. * libc/iconv/ccs/binary/win_1256.cct: Ditto. * libc/iconv/ccs/binary/win_1257.cct: Ditto. * libc/iconv/ccs/binary/win_1258.cct: Ditto. * libc/iconv/ces/Makefile.am: Updated. * libc/iconv/ces/Makefile.in: Regenerated. * libc/iconv/ces/ucs-2-internal.c: Updated. * libc/iconv/ces/ucs-4-internal.c: Ditto. * libc/iconv/ces/utf-16.c: Ditto. * libc/iconv/ces/utf-8.c: Ditto. * libc/iconv/ces/cesbi.c: New file. * libc/iconv/ces/cesbi.h: Ditto. * libc/iconv/ces/cesdeps.h: Ditto. * libc/iconv/ces/euc.c: Ditto. * libc/iconv/ces/mkdeps.pl: Ditto. * libc/iconv/ces/table-pcs.c: Ditto. * libc/iconv/ces/table.c: Ditto. * libc/iconv/ces/ucs-2.c: Ditto. * libc/iconv/ces/ucs-4.c: Ditto. * libc/iconv/ces/us-ascii.c: Ditto. * libc/iconv/ces/euc-jp.c: Removed. * libc/iconv/ces/euc-kr.c: Ditto. * libc/iconv/ces/euc-tw.c: Ditto. * libc/iconv/ces/gb2312.c: Ditto. * libc/iconv/ces/iso-10646-ucs-2.: Ditto.c * libc/iconv/ces/iso-10646-ucs-4.c: Ditto. * libc/iconv/lib/Makefile.am: Updated. * libc/iconv/lib/Makefile.in: Regenerated. * libc/iconv/lib/endian.h: Updated. * libc/iconv/lib/iconv.c: Ditto. * libc/iconv/lib/local.h: Ditto. * libc/iconv/lib/aliases.c: Removed. * libc/iconv/lib/bialiasesi.c: Ditto. * libc/iconv/lib/biccs.c: Ditto. * libc/iconv/lib/bices.c: Ditto. * libc/iconv/lib/ccs.c: Ditto. * libc/iconv/lib/ces.c: Ditto. * libc/iconv/lib/ces_euc.c: Ditto. * libc/iconv/lib/ces_iso2022.c: Ditto. * libc/iconv/lib/ces_table.c: Ditto. * libc/iconv/lib/converter.c: Ditto. * libc/iconv/lib/deps.h: Ditto. * libc/iconv/lib/aliasesbi.c: Ditto. * libc/iconv/lib/aliasesi.c: Ditto. * libc/iconv/lib/conv.h: Ditto. * libc/iconv/lib/encnames.h: Ditto. * libc/iconv/lib/encoding.deps: Ditto. * libc/iconv/lib/iconvnls.c: Ditto. * libc/iconv/lib/iconvnls.h: Ditto. * libc/iconv/lib/loaddata.c: Ditto. * libc/iconv/lib/nullconv.c: Ditto. * libc/iconv/lib/ucsconv.c: Ditto. * libc/iconv/lib/ucsconv.h: Ditto. * libc/include/iconv.h: Update copyright. * libc/*/aclocal.m4: Regenerated. * libc/*/configure: Ditto. * libm/*/aclocal.m4: Ditto. * libm/*/configure: Ditto.
363 lines
11 KiB
C
363 lines
11 KiB
C
/*
|
|
* Copyright (c) 2003-2004, Artem B. Bityuckiy
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
#include <_ansi.h>
|
|
#include <reent.h>
|
|
#include <newlib.h>
|
|
#include <sys/types.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/iconvnls.h>
|
|
#ifdef _MB_CAPABLE
|
|
#include <wchar.h>
|
|
#include <iconv.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include "local.h"
|
|
#include "conv.h"
|
|
#include "ucsconv.h"
|
|
#include "iconvnls.h"
|
|
#endif
|
|
|
|
/*
|
|
* _iconv_nls_construct_filename -- constructs full file name.
|
|
*
|
|
* PARAMETERS:
|
|
* struct _reent *rptr - reent structure of current thread/process.
|
|
* _CONST char *file - the name of file.
|
|
* _CONST char *dir - the name of subdirectory;
|
|
* _CONST char *ext - file extension.
|
|
*
|
|
* DESCRIPTION:
|
|
* Function constructs patch to icionv-related file.
|
|
* 'file' shouldn't be NULL. Doesn't use extension if 'ext' is NULL.
|
|
*
|
|
* RETURN:
|
|
* The pointer to file name if success, In case of error returns NULL
|
|
* and sets current thread's/process's errno.
|
|
*/
|
|
_CONST char *
|
|
_DEFUN(_iconv_nls_construct_filename, (rptr, file, ext),
|
|
struct _reent *rptr _AND
|
|
_CONST char *file _AND
|
|
_CONST char *dir _AND
|
|
_CONST char *ext)
|
|
{
|
|
int len1, len2, len3;
|
|
char *path;
|
|
char *p;
|
|
int dirlen = strlen (dir);
|
|
|
|
if ((path = _getenv_r (rptr, NLS_ENVVAR_NAME)) == NULL || *path == '\0')
|
|
path = NLS_DEFAULT_NLSPATH;
|
|
|
|
len1 = strlen (path);
|
|
len2 = strlen (file);
|
|
len3 = strlen (ext);
|
|
|
|
if ((p = _malloc_r (rptr, len1 + dirlen + len2 + len3 + 3)) == NULL)
|
|
return (_CONST char *)NULL;
|
|
|
|
memcpy (p, path, len1);
|
|
if (p[len1 - 1] != '/')
|
|
p[len1++] = '/';
|
|
memcpy (p + len1, dir, dirlen);
|
|
len1 += dirlen;
|
|
p[len1++] = '/';
|
|
memcpy (p + len1, file, len2);
|
|
len1 += len2;
|
|
if (ext != NULL)
|
|
{
|
|
memcpy (p + len1, ext, len3);
|
|
len1 += len3;
|
|
}
|
|
p[len1] = '\0';
|
|
|
|
return (_CONST char *)p;
|
|
}
|
|
|
|
|
|
#ifdef _MB_CAPABLE
|
|
/*
|
|
* _iconv_nls_get_mb_cur_max -- return encoding's maximum length
|
|
* of a multi-byte character.
|
|
*
|
|
* PARAMETERS:
|
|
* iconv_t cd - opened iconv conversion descriptor;
|
|
* int direction - "from encoding" or "to encoding" direction.
|
|
*
|
|
* DESCRIPTION:
|
|
* Return maximum length of a multi-byte character in one of 'cd's
|
|
* encoding. Return "from" encoding's value if 'direction' is 0 and
|
|
* "to" encoding's value if 'direction' isn't 0.
|
|
*/
|
|
int
|
|
_DEFUN(_iconv_nls_get_mb_cur_max, (cd, direction),
|
|
iconv_t cd _AND
|
|
int direction)
|
|
{
|
|
iconv_conversion_t *ic = (iconv_conversion_t *)cd;
|
|
|
|
return ic->handlers->get_mb_cur_max (ic->data, direction);
|
|
}
|
|
|
|
/*
|
|
* _iconv_nls_is_stateful -- is encoding stateful?
|
|
*
|
|
* PARAMETERS:
|
|
* iconv_t cd - opened iconv conversion descriptor;
|
|
* int direction - "from encoding" or "to encoding" direction.
|
|
*
|
|
* DESCRIPTION:
|
|
* Returns 0 if encoding is stateless or 1 if stateful.
|
|
* Tests "from" encoding if 'direction' is 0 and
|
|
* "to" encoding's value if 'direction' isn't 0.
|
|
|
|
*/
|
|
int
|
|
_DEFUN(_iconv_nls_is_stateful, (cd, direction),
|
|
iconv_t cd _AND
|
|
int direction)
|
|
{
|
|
iconv_conversion_t *ic = (iconv_conversion_t *)cd;
|
|
|
|
return ic->handlers->is_stateful (ic->data, direction);
|
|
}
|
|
|
|
/*
|
|
* _iconv_nls_conv - special version of iconv for NLS.
|
|
*
|
|
* PARAMETERS:
|
|
* Same as _iconv_r.
|
|
*
|
|
* DESCRIPTION:
|
|
* Function behaves as _iconv_r but:
|
|
* 1. Don't handle reset/return shift states queries
|
|
* (like iconv does when 'inbuf' == NULL, etc);
|
|
* 2. Don't save result if 'outbuf' == NULL or
|
|
* '*outbuf' == NULL;
|
|
* 3. Don't perform default conversion if there is no character
|
|
* in "to" encoding that corresponds to character from "from"
|
|
* encoding.
|
|
*
|
|
* RETURN:
|
|
* Same as _iconv_r.
|
|
*/
|
|
size_t
|
|
_DEFUN(_iconv_nls_conv, (rptr, cd, inbuf, inbytesleft, outbuf, outbytesleft),
|
|
struct _reent *rptr _AND
|
|
iconv_t cd _AND
|
|
_CONST char **inbuf _AND
|
|
size_t *inbytesleft _AND
|
|
char **outbuf _AND
|
|
size_t *outbytesleft)
|
|
{
|
|
iconv_conversion_t *ic = (iconv_conversion_t *)cd;
|
|
int flags = ICONV_FAIL_BIT;
|
|
|
|
if ((_VOID_PTR)cd == NULL || cd == (iconv_t)-1 || ic->data == NULL
|
|
|| (ic->handlers != &_iconv_null_conversion_handlers
|
|
&& ic->handlers != &_iconv_ucs_conversion_handlers))
|
|
{
|
|
__errno_r (rptr) = EBADF;
|
|
return (size_t)-1;
|
|
}
|
|
|
|
if (inbytesleft == NULL || *inbytesleft == 0)
|
|
return (size_t)0;
|
|
|
|
if (outbuf == NULL || *outbuf == NULL)
|
|
flags |= ICONV_DONT_SAVE_BIT;
|
|
|
|
if (outbytesleft == NULL || *outbytesleft == 0)
|
|
{
|
|
__errno_r (rptr) = E2BIG;
|
|
return (size_t)-1;
|
|
}
|
|
|
|
return ic->handlers->convert (rptr,
|
|
ic->data,
|
|
(_CONST unsigned char**)inbuf,
|
|
inbytesleft,
|
|
(unsigned char**)outbuf,
|
|
outbytesleft,
|
|
flags);
|
|
}
|
|
|
|
/*
|
|
* _iconv_nls_get_state -- get encoding's current shift state value.
|
|
*
|
|
* PARAMETERS:
|
|
* iconv_t cd - iconv descriptor;
|
|
* mbstate_t *ps - where to save shift state;
|
|
* int direction - "from" encoding if 0, "to" encoding if 1.
|
|
*
|
|
* DESCRIPTION:
|
|
* Save encoding's current shift state to 'ps'. Save "from" encoding's
|
|
* shift state if 'direction' is 0 and "to" encodings's shift state
|
|
* if 'direction' isn't 0.
|
|
*/
|
|
_VOID
|
|
_DEFUN(_iconv_nls_get_state, (cd, ps, direction),
|
|
iconv_t cd _AND
|
|
mbstate_t *ps _AND
|
|
int direction)
|
|
{
|
|
iconv_conversion_t *ic = (iconv_conversion_t *)cd;
|
|
|
|
ic->handlers->get_state (ic->data, ps, direction);
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* _iconv_nls_set_state -- set encoding's current shift state value.
|
|
*
|
|
* PARAMETERS:
|
|
* iconv_t cd - iconv descriptor;
|
|
* mbstate_t *ps - where to save shift state.
|
|
* int direction - "from" encoding if 0, "to" encoding if 1.
|
|
*
|
|
* DESCRIPTION:
|
|
* Set encoding's current shift state.
|
|
*
|
|
* RETURN:
|
|
* 0 if success, -1 if failure.
|
|
*/
|
|
int
|
|
_DEFUN(_iconv_nls_set_state, (cd, ps, direction),
|
|
iconv_t cd _AND
|
|
mbstate_t *ps _AND
|
|
int direction)
|
|
{
|
|
iconv_conversion_t *ic = (iconv_conversion_t *)cd;
|
|
|
|
return ic->handlers->set_state (ic->data, ps, direction);
|
|
}
|
|
|
|
/* Same as iconv_open() but don't perform name resolving */
|
|
static iconv_t
|
|
_DEFUN(iconv_open1, (rptr, to, from),
|
|
struct _reent *rptr _AND
|
|
_CONST char *to _AND
|
|
_CONST char *from)
|
|
{
|
|
iconv_conversion_t *ic;
|
|
|
|
if (to == NULL || from == NULL || *to == '\0' || *from == '\0')
|
|
return (iconv_t)-1;
|
|
|
|
ic = (iconv_conversion_t *)_malloc_r (rptr, sizeof (iconv_conversion_t));
|
|
if (ic == NULL)
|
|
return (iconv_t)-1;
|
|
|
|
/* Select which conversion type to use */
|
|
if (strcmp (from, to) == 0)
|
|
{
|
|
/* Use null conversion */
|
|
ic->handlers = &_iconv_null_conversion_handlers;
|
|
ic->data = ic->handlers->open (rptr, to, from);
|
|
}
|
|
else
|
|
{
|
|
/* Use UCS-based conversion */
|
|
ic->handlers = &_iconv_ucs_conversion_handlers;
|
|
ic->data = ic->handlers->open (rptr, to, from);
|
|
}
|
|
|
|
if (ic->data == NULL)
|
|
{
|
|
_free_r (rptr, (_VOID_PTR)ic);
|
|
return (iconv_t)-1;
|
|
}
|
|
|
|
return (_VOID_PTR)ic;
|
|
}
|
|
|
|
/*
|
|
* _iconv_nls_open - open iconv descriptors for NLS.
|
|
*
|
|
* PARAMETERS:
|
|
* struct _reent *rptr - process's reent structure;
|
|
* _CONST char *encoding - encoding name;
|
|
* iconv_t *tomb - wchar -> encoding iconv descriptor pointer;
|
|
* iconv_t *towc - encoding -> wchar iconv descriptor pointer;
|
|
* int flag - perform encoding name resolving flag.
|
|
*
|
|
* DESCRIPTION:
|
|
* Opens two iconv descriptors for 'encoding' -> wchar and
|
|
* wchar -> 'encoding' iconv conversions. Function is used when locale or
|
|
* wide-oriented stream is opened. If 'flag' is 0, don't perform encoding
|
|
* name resolving ('encoding' must not be alias in this case).
|
|
*
|
|
* RETURN:
|
|
* If successful - return 0, else set errno and return -1.
|
|
*/
|
|
int
|
|
_DEFUN(_iconv_nls_open, (rptr, encoding, towc, tomb),
|
|
struct _reent *rptr _AND
|
|
_CONST char *encoding _AND
|
|
iconv_t *tomb _AND
|
|
iconv_t *towc _AND
|
|
int flag)
|
|
{
|
|
_CONST char *wchar_encoding;
|
|
|
|
if (sizeof (wchar_t) > 2 && WCHAR_MAX > 0xFFFF)
|
|
wchar_encoding = "ucs_4_internal";
|
|
else if (sizeof (wchar_t) > 1 && WCHAR_MAX > 0xFF)
|
|
wchar_encoding = "ucs_2_internal";
|
|
else
|
|
wchar_encoding = ""; /* This shuldn't happen */
|
|
|
|
if (flag)
|
|
{
|
|
if ((*towc = _iconv_open_r (rptr, wchar_encoding, encoding)) == (iconv_t)-1)
|
|
return -1;
|
|
|
|
if ((*tomb = _iconv_open_r (rptr, encoding, wchar_encoding)) == (iconv_t)-1)
|
|
{
|
|
_iconv_close_r (rptr, *towc);
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((*towc = iconv_open1 (rptr, wchar_encoding, encoding)) == (iconv_t)-1)
|
|
return -1;
|
|
|
|
if ((*tomb = iconv_open1 (rptr, encoding, wchar_encoding)) == (iconv_t)-1)
|
|
{
|
|
_iconv_close_r (rptr, *towc);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif /* _MB_CAPABLE */
|
|
|