1 1.3 joerg /* $NetBSD: citrus_iconv_none.c,v 1.3 2011/05/23 14:45:44 joerg 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.3 joerg __RCSID("$NetBSD: citrus_iconv_none.c,v 1.3 2011/05/23 14:45:44 joerg Exp $"); 32 1.1 tshiozak #endif /* LIBC_SCCS and not lint */ 33 1.1 tshiozak 34 1.1 tshiozak #include <assert.h> 35 1.1 tshiozak #include <errno.h> 36 1.1 tshiozak #include <stdlib.h> 37 1.1 tshiozak #include <string.h> 38 1.2 tshiozak #include <sys/queue.h> 39 1.2 tshiozak 40 1.1 tshiozak #include "citrus_types.h" 41 1.1 tshiozak #include "citrus_module.h" 42 1.2 tshiozak #include "citrus_hash.h" 43 1.1 tshiozak #include "citrus_iconv.h" 44 1.1 tshiozak #include "citrus_iconv_none.h" 45 1.1 tshiozak 46 1.1 tshiozak /* ---------------------------------------------------------------------- */ 47 1.1 tshiozak 48 1.1 tshiozak _CITRUS_ICONV_DECLS(iconv_none); 49 1.1 tshiozak _CITRUS_ICONV_DEF_OPS(iconv_none); 50 1.1 tshiozak 51 1.1 tshiozak 52 1.1 tshiozak /* ---------------------------------------------------------------------- */ 53 1.1 tshiozak 54 1.1 tshiozak int 55 1.1 tshiozak _citrus_iconv_none_iconv_getops(struct _citrus_iconv_ops *ops, size_t lenops, 56 1.1 tshiozak uint32_t expected_version) 57 1.1 tshiozak { 58 1.1 tshiozak if (expected_version<_CITRUS_ICONV_ABI_VERSION || lenops<sizeof(*ops)) 59 1.1 tshiozak return (EINVAL); 60 1.1 tshiozak 61 1.1 tshiozak memcpy(ops, &_citrus_iconv_none_iconv_ops, 62 1.1 tshiozak sizeof(_citrus_iconv_none_iconv_ops)); 63 1.1 tshiozak 64 1.1 tshiozak return (0); 65 1.1 tshiozak } 66 1.1 tshiozak 67 1.1 tshiozak static int 68 1.1 tshiozak /*ARGSUSED*/ 69 1.2 tshiozak _citrus_iconv_none_iconv_init_shared( 70 1.2 tshiozak struct _citrus_iconv_shared * __restrict ci, 71 1.2 tshiozak const char * __restrict curdir, 72 1.2 tshiozak const char * __restrict in, const char * __restrict out, 73 1.2 tshiozak const void * __restrict var, size_t lenvar) 74 1.1 tshiozak { 75 1.1 tshiozak ci->ci_closure = NULL; 76 1.2 tshiozak return 0; 77 1.2 tshiozak } 78 1.2 tshiozak 79 1.2 tshiozak static void 80 1.2 tshiozak /*ARGSUSED*/ 81 1.2 tshiozak _citrus_iconv_none_iconv_uninit_shared(struct _citrus_iconv_shared *ci) 82 1.2 tshiozak { 83 1.2 tshiozak } 84 1.2 tshiozak 85 1.2 tshiozak static int 86 1.2 tshiozak /*ARGSUSED*/ 87 1.2 tshiozak _citrus_iconv_none_iconv_init_context(struct _citrus_iconv *cv) 88 1.2 tshiozak { 89 1.2 tshiozak cv->cv_closure = NULL; 90 1.3 joerg return 0; 91 1.1 tshiozak } 92 1.1 tshiozak 93 1.1 tshiozak static void 94 1.1 tshiozak /*ARGSUSED*/ 95 1.2 tshiozak _citrus_iconv_none_iconv_uninit_context(struct _citrus_iconv *cv) 96 1.1 tshiozak { 97 1.1 tshiozak } 98 1.1 tshiozak 99 1.1 tshiozak static int 100 1.1 tshiozak /*ARGSUSED*/ 101 1.1 tshiozak _citrus_iconv_none_iconv_convert(struct _citrus_iconv * __restrict ci, 102 1.1 tshiozak const char * __restrict * __restrict in, 103 1.1 tshiozak size_t * __restrict inbytes, 104 1.1 tshiozak char * __restrict * __restrict out, 105 1.1 tshiozak size_t * __restrict outbytes, 106 1.1 tshiozak u_int32_t flags, size_t * __restrict invalids) 107 1.1 tshiozak { 108 1.1 tshiozak int e2big; 109 1.1 tshiozak size_t len; 110 1.1 tshiozak 111 1.1 tshiozak len = *inbytes; 112 1.1 tshiozak e2big = 0; 113 1.1 tshiozak if (*outbytes<len) { 114 1.1 tshiozak e2big = 1; 115 1.1 tshiozak len = *outbytes; 116 1.1 tshiozak } 117 1.1 tshiozak memcpy(*out, *in, len); 118 1.1 tshiozak in += len; 119 1.1 tshiozak *inbytes -= len; 120 1.1 tshiozak out+=len; 121 1.1 tshiozak *outbytes -= len; 122 1.1 tshiozak *invalids = 0; 123 1.1 tshiozak if (e2big) { 124 1.1 tshiozak return (E2BIG); 125 1.1 tshiozak } 126 1.1 tshiozak 127 1.1 tshiozak return (0); 128 1.1 tshiozak } 129