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 56 int 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 66 static 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 94 static 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 104 static 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 114 static 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 134 static 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 154 static 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 169 static 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 181 static 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 196 static 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