Home | History | Annotate | Line # | Download | only in iconv
iconv.c revision 1.4.2.1
      1  1.4.2.1      tron /*	$NetBSD: iconv.c,v 1.4.2.1 2005/05/01 18:29:12 tron Exp $	*/
      2      1.1  tshiozak 
      3      1.1  tshiozak /*-
      4      1.1  tshiozak  * Copyright (c)2003 Citrus Project,
      5      1.1  tshiozak  * All rights reserved.
      6      1.1  tshiozak  *
      7      1.1  tshiozak  * Redistribution and use in source and binary forms, with or without
      8      1.1  tshiozak  * modification, are permitted provided that the following conditions
      9      1.1  tshiozak  * are met:
     10      1.1  tshiozak  * 1. Redistributions of source code must retain the above copyright
     11      1.1  tshiozak  *    notice, this list of conditions and the following disclaimer.
     12      1.1  tshiozak  * 2. Redistributions in binary form must reproduce the above copyright
     13      1.1  tshiozak  *    notice, this list of conditions and the following disclaimer in the
     14      1.1  tshiozak  *    documentation and/or other materials provided with the distribution.
     15      1.1  tshiozak  *
     16      1.1  tshiozak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17      1.1  tshiozak  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18      1.1  tshiozak  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19      1.1  tshiozak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20      1.1  tshiozak  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21      1.1  tshiozak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22      1.1  tshiozak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23      1.1  tshiozak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24      1.1  tshiozak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25      1.1  tshiozak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26      1.1  tshiozak  * SUCH DAMAGE.
     27      1.1  tshiozak  */
     28      1.1  tshiozak 
     29      1.1  tshiozak #include <sys/cdefs.h>
     30      1.1  tshiozak #if defined(LIBC_SCCS) && !defined(lint)
     31  1.4.2.1      tron __RCSID("$NetBSD: iconv.c,v 1.4.2.1 2005/05/01 18:29:12 tron Exp $");
     32      1.1  tshiozak #endif /* LIBC_SCCS and not lint */
     33      1.1  tshiozak 
     34      1.1  tshiozak #include "namespace.h"
     35      1.1  tshiozak #include <assert.h>
     36      1.1  tshiozak #include <errno.h>
     37      1.1  tshiozak #include <paths.h>
     38      1.2  tshiozak #include <sys/queue.h>
     39      1.1  tshiozak 
     40      1.1  tshiozak #include <iconv.h>
     41      1.1  tshiozak 
     42      1.1  tshiozak #ifdef CITRUS_ICONV
     43      1.1  tshiozak #include <sys/types.h>
     44      1.1  tshiozak #include <citrus/citrus_types.h>
     45      1.1  tshiozak #include <citrus/citrus_module.h>
     46      1.1  tshiozak #include <citrus/citrus_esdb.h>
     47      1.2  tshiozak #include <citrus/citrus_hash.h>
     48      1.1  tshiozak #include <citrus/citrus_iconv.h>
     49      1.1  tshiozak 
     50      1.1  tshiozak #define ISBADF(_h_)	(!(_h_) || (_h_) == (iconv_t)-1)
     51      1.1  tshiozak 
     52      1.1  tshiozak #ifdef __weak_alias
     53      1.1  tshiozak __weak_alias(iconv, _iconv)
     54      1.1  tshiozak __weak_alias(iconv_open, _iconv_open)
     55      1.1  tshiozak __weak_alias(iconv_close, _iconv_close)
     56      1.1  tshiozak #endif
     57      1.1  tshiozak 
     58      1.1  tshiozak iconv_t
     59      1.1  tshiozak _iconv_open(const char *out, const char *in)
     60      1.1  tshiozak {
     61      1.1  tshiozak 	int ret;
     62      1.1  tshiozak 	struct _citrus_iconv *handle;
     63      1.1  tshiozak 
     64      1.1  tshiozak 	ret = _citrus_iconv_open(&handle, _PATH_ICONV, in, out);
     65      1.1  tshiozak 	if (ret) {
     66  1.4.2.1      tron 		errno = ret == ENOENT? EINVAL : ret;
     67      1.1  tshiozak 		return ((iconv_t)-1);
     68      1.1  tshiozak 	}
     69      1.1  tshiozak 
     70      1.2  tshiozak 	return ((iconv_t)(void *)handle);
     71      1.1  tshiozak }
     72      1.1  tshiozak 
     73      1.1  tshiozak int
     74      1.1  tshiozak _iconv_close(iconv_t handle)
     75      1.1  tshiozak {
     76      1.1  tshiozak 	if (ISBADF(handle)) {
     77      1.1  tshiozak 		errno = EBADF;
     78      1.1  tshiozak 		return (-1);
     79      1.1  tshiozak 	}
     80      1.1  tshiozak 
     81      1.2  tshiozak 	_citrus_iconv_close((struct _citrus_iconv *)(void *)handle);
     82      1.1  tshiozak 
     83      1.1  tshiozak 	return (0);
     84      1.1  tshiozak }
     85      1.1  tshiozak 
     86      1.1  tshiozak size_t
     87      1.4  tshiozak _iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout)
     88      1.1  tshiozak {
     89      1.1  tshiozak 	int err;
     90      1.1  tshiozak 	size_t ret;
     91      1.1  tshiozak 
     92      1.1  tshiozak 	if (ISBADF(handle)) {
     93      1.1  tshiozak 		errno = EBADF;
     94      1.1  tshiozak 		return ((size_t)-1);
     95      1.1  tshiozak 	}
     96      1.1  tshiozak 
     97      1.1  tshiozak 	err = _citrus_iconv_convert(
     98      1.4  tshiozak 		(struct _citrus_iconv *)(void *)handle, in, szin, out, szout,
     99      1.2  tshiozak 		0, &ret);
    100      1.1  tshiozak 	if (err) {
    101      1.1  tshiozak 		errno = err;
    102      1.1  tshiozak 		ret = (size_t)-1;
    103      1.1  tshiozak 	}
    104      1.1  tshiozak 
    105      1.1  tshiozak 	return (ret);
    106      1.1  tshiozak }
    107      1.1  tshiozak 
    108      1.1  tshiozak size_t
    109      1.1  tshiozak __iconv(iconv_t handle, const char **in, size_t *szin, char **out,
    110      1.1  tshiozak 	size_t *szout, u_int32_t flags, size_t *invalids)
    111      1.1  tshiozak {
    112      1.1  tshiozak 	int err;
    113      1.1  tshiozak 	size_t ret;
    114      1.1  tshiozak 
    115      1.1  tshiozak 	if (ISBADF(handle)) {
    116      1.1  tshiozak 		errno = EBADF;
    117      1.1  tshiozak 		return ((size_t)-1);
    118      1.1  tshiozak 	}
    119      1.1  tshiozak 
    120      1.1  tshiozak 	err = _citrus_iconv_convert(
    121      1.2  tshiozak 		(struct _citrus_iconv *)(void *)handle, in, szin, out, szout,
    122      1.1  tshiozak 		flags, &ret);
    123      1.1  tshiozak 	if (invalids)
    124      1.1  tshiozak 		*invalids = ret;
    125      1.1  tshiozak 	if (err) {
    126      1.1  tshiozak 		errno = err;
    127      1.1  tshiozak 		ret = (size_t)-1;
    128      1.1  tshiozak 	}
    129      1.1  tshiozak 
    130      1.1  tshiozak 	return (ret);
    131      1.1  tshiozak }
    132      1.1  tshiozak 
    133      1.1  tshiozak int
    134      1.1  tshiozak __iconv_get_list(char ***rlist, size_t *rsz)
    135      1.1  tshiozak {
    136      1.1  tshiozak 	int ret;
    137      1.1  tshiozak 
    138      1.1  tshiozak 	ret = _citrus_esdb_get_list(rlist, rsz);
    139      1.1  tshiozak 	if (ret) {
    140      1.1  tshiozak 		errno = ret;
    141      1.1  tshiozak 		return -1;
    142      1.1  tshiozak 	}
    143      1.1  tshiozak 
    144      1.1  tshiozak 	return 0;
    145      1.1  tshiozak }
    146      1.1  tshiozak 
    147      1.1  tshiozak void
    148      1.1  tshiozak __iconv_free_list(char **list, size_t sz)
    149      1.1  tshiozak {
    150      1.1  tshiozak 	_citrus_esdb_free_list(list, sz);
    151      1.1  tshiozak }
    152      1.1  tshiozak 
    153      1.1  tshiozak #else
    154      1.1  tshiozak iconv_t
    155      1.1  tshiozak /*ARGSUSED*/
    156      1.1  tshiozak _iconv_open(const char *in, const char *out)
    157      1.1  tshiozak {
    158      1.1  tshiozak 	errno = EINVAL;
    159      1.1  tshiozak 	return ((iconv_t)-1);
    160      1.1  tshiozak }
    161      1.1  tshiozak int
    162      1.1  tshiozak /*ARGSUSED*/
    163      1.1  tshiozak _iconv_close(iconv_t handle)
    164      1.1  tshiozak {
    165      1.1  tshiozak 	errno = EBADF;
    166      1.1  tshiozak 	return (-1);
    167      1.1  tshiozak }
    168      1.1  tshiozak size_t
    169      1.1  tshiozak /*ARGSUSED*/
    170      1.1  tshiozak _iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout)
    171      1.1  tshiozak {
    172      1.1  tshiozak 	errno = EBADF;
    173      1.1  tshiozak 	return ((size_t)-1);
    174      1.1  tshiozak }
    175      1.1  tshiozak int
    176      1.1  tshiozak /*ARGSUSED*/
    177      1.1  tshiozak __iconv_get_list(char ***rlist, size_t *rsz)
    178      1.1  tshiozak {
    179      1.1  tshiozak 	errno = EINVAL;
    180      1.1  tshiozak 	return -1;
    181      1.1  tshiozak }
    182      1.1  tshiozak void
    183      1.1  tshiozak /*ARGSUSED*/
    184      1.1  tshiozak __iconv_free_list(char **list, size_t sz)
    185      1.1  tshiozak {
    186      1.1  tshiozak }
    187      1.1  tshiozak #endif
    188