1/* $FreeBSD$ */ 2/* $NetBSD: citrus_stdenc_template.h,v 1.4 2008/02/09 14:56:20 junyoung Exp $ */ 3 4/*- 5 * SPDX-License-Identifier: BSD-2-Clause 6 * 7 * Copyright (c)2003 Citrus Project, 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include <iconv.h> 33 34/* 35 * CAUTION: THIS IS NOT STANDALONE FILE 36 * 37 * function templates of iconv standard encoding handler for each encodings. 38 * 39 */ 40 41/* 42 * macros 43 */ 44 45#undef _TO_EI 46#undef _CE_TO_EI 47#undef _TO_STATE 48#define _TO_EI(_cl_) ((_ENCODING_INFO*)(_cl_)) 49#define _CE_TO_EI(_ce_) (_TO_EI((_ce_)->ce_closure)) 50#define _TO_STATE(_ps_) ((_ENCODING_STATE*)(_ps_)) 51 52/* ---------------------------------------------------------------------- 53 * templates for public functions 54 */ 55 56int 57_FUNCNAME(stdenc_getops)(struct _citrus_stdenc_ops *ops, 58 size_t lenops __unused) 59{ 60 61 memcpy(ops, &_FUNCNAME(stdenc_ops), sizeof(_FUNCNAME(stdenc_ops))); 62 63 return (0); 64} 65 66static int 67_FUNCNAME(stdenc_init)(struct _citrus_stdenc * __restrict ce, 68 const void * __restrict var, size_t lenvar, 69 struct _citrus_stdenc_traits * __restrict et) 70{ 71 _ENCODING_INFO *ei; 72 int ret; 73 74 ei = NULL; 75 if (sizeof(_ENCODING_INFO) > 0) { 76 ei = calloc(1, sizeof(_ENCODING_INFO)); 77 if (ei == NULL) 78 return (errno); 79 } 80 81 ret = _FUNCNAME(encoding_module_init)(ei, var, lenvar); 82 if (ret) { 83 free((void *)ei); 84 return (ret); 85 } 86 87 ce->ce_closure = ei; 88 et->et_state_size = sizeof(_ENCODING_STATE); 89 et->et_mb_cur_max = _ENCODING_MB_CUR_MAX(_CE_TO_EI(ce)); 90 91 return (0); 92} 93 94static void 95_FUNCNAME(stdenc_uninit)(struct _citrus_stdenc * __restrict ce) 96{ 97 98 if (ce) { 99 _FUNCNAME(encoding_module_uninit)(_CE_TO_EI(ce)); 100 free(ce->ce_closure); 101 } 102} 103 104static int 105_FUNCNAME(stdenc_init_state)(struct _citrus_stdenc * __restrict ce, 106 void * __restrict ps) 107{ 108 109 _FUNCNAME(init_state)(_CE_TO_EI(ce), _TO_STATE(ps)); 110 111 return (0); 112} 113 114static int 115_FUNCNAME(stdenc_mbtocs)(struct _citrus_stdenc * __restrict ce, 116 _citrus_csid_t * __restrict csid, _citrus_index_t * __restrict idx, 117 char ** __restrict s, size_t n, void * __restrict ps, 118 size_t * __restrict nresult, struct iconv_hooks *hooks) 119{ 120 wchar_t wc; 121 int ret; 122 123 ret = _FUNCNAME(mbrtowc_priv)(_CE_TO_EI(ce), &wc, s, n, 124 _TO_STATE(ps), nresult); 125 126 if ((ret == 0) && *nresult != (size_t)-2) 127 ret = _FUNCNAME(stdenc_wctocs)(_CE_TO_EI(ce), csid, idx, wc); 128 129 if ((ret == 0) && (hooks != NULL) && (hooks->uc_hook != NULL)) 130 hooks->uc_hook((unsigned int)*idx, hooks->data); 131 return (ret); 132} 133 134static int 135_FUNCNAME(stdenc_cstomb)(struct _citrus_stdenc * __restrict ce, 136 char * __restrict s, size_t n, _citrus_csid_t csid, _citrus_index_t idx, 137 void * __restrict ps, size_t * __restrict nresult, 138 struct iconv_hooks *hooks __unused) 139{ 140 wchar_t wc; 141 int ret; 142 143 wc = ret = 0; 144 145 if (csid != _CITRUS_CSID_INVALID) 146 ret = _FUNCNAME(stdenc_cstowc)(_CE_TO_EI(ce), &wc, csid, idx); 147 148 if (ret == 0) 149 ret = _FUNCNAME(wcrtomb_priv)(_CE_TO_EI(ce), s, n, wc, 150 _TO_STATE(ps), nresult); 151 return (ret); 152} 153 154static int 155_FUNCNAME(stdenc_mbtowc)(struct _citrus_stdenc * __restrict ce, 156 _citrus_wc_t * __restrict wc, char ** __restrict s, size_t n, 157 void * __restrict ps, size_t * __restrict nresult, 158 struct iconv_hooks *hooks) 159{ 160 int ret; 161 162 ret = _FUNCNAME(mbrtowc_priv)(_CE_TO_EI(ce), wc, s, n, 163 _TO_STATE(ps), nresult); 164 if ((ret == 0) && (hooks != NULL) && (hooks->wc_hook != NULL)) 165 hooks->wc_hook(*wc, hooks->data); 166 return (ret); 167} 168 169static int 170_FUNCNAME(stdenc_wctomb)(struct _citrus_stdenc * __restrict ce, 171 char * __restrict s, size_t n, _citrus_wc_t wc, void * __restrict ps, 172 size_t * __restrict nresult, struct iconv_hooks *hooks __unused) 173{ 174 int ret; 175 176 ret = _FUNCNAME(wcrtomb_priv)(_CE_TO_EI(ce), s, n, wc, _TO_STATE(ps), 177 nresult); 178 return (ret); 179} 180 181static int 182_FUNCNAME(stdenc_put_state_reset)(struct _citrus_stdenc * __restrict ce __unused, 183 char * __restrict s __unused, size_t n __unused, 184 void * __restrict ps __unused, size_t * __restrict nresult) 185{ 186 187#if _ENCODING_IS_STATE_DEPENDENT 188 return ((_FUNCNAME(put_state_reset)(_CE_TO_EI(ce), s, n, _TO_STATE(ps), 189 nresult))); 190#else 191 *nresult = 0; 192 return (0); 193#endif 194} 195 196static int 197_FUNCNAME(stdenc_get_state_desc)(struct _citrus_stdenc * __restrict ce, 198 void * __restrict ps, int id, 199 struct _citrus_stdenc_state_desc * __restrict d) 200{ 201 int ret; 202 203 switch (id) { 204 case _STDENC_SDID_GENERIC: 205 ret = _FUNCNAME(stdenc_get_state_desc_generic)( 206 _CE_TO_EI(ce), _TO_STATE(ps), &d->u.generic.state); 207 break; 208 default: 209 ret = EOPNOTSUPP; 210 } 211 212 return (ret); 213} 214