1 1.14 joerg /* $NetBSD: multibyte_amd1.c,v 1.14 2013/08/18 20:03:48 joerg Exp $ */ 2 1.1 tshiozak 3 1.1 tshiozak /*- 4 1.6 tnozaki * Copyright (c)2002, 2008 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.14 joerg __RCSID("$NetBSD: multibyte_amd1.c,v 1.14 2013/08/18 20:03:48 joerg Exp $"); 32 1.1 tshiozak #endif /* LIBC_SCCS and not lint */ 33 1.1 tshiozak 34 1.6 tnozaki #include <sys/types.h> 35 1.1 tshiozak #include <assert.h> 36 1.6 tnozaki #include <errno.h> 37 1.6 tnozaki #include <langinfo.h> 38 1.11 joerg #include <stdlib.h> 39 1.6 tnozaki #define __SETLOCALE_SOURCE__ 40 1.6 tnozaki #include <locale.h> 41 1.1 tshiozak #include <wchar.h> 42 1.6 tnozaki 43 1.6 tnozaki #include "setlocale_local.h" 44 1.6 tnozaki 45 1.6 tnozaki #include "citrus_module.h" 46 1.6 tnozaki #include "citrus_ctype.h" 47 1.9 tnozaki #include "runetype_local.h" 48 1.1 tshiozak #include "multibyte.h" 49 1.1 tshiozak 50 1.1 tshiozak size_t 51 1.10 joerg mbrlen_l(const char *s, size_t n, mbstate_t *ps, locale_t loc) 52 1.1 tshiozak { 53 1.1 tshiozak size_t ret; 54 1.2 yamt int err0; 55 1.1 tshiozak 56 1.10 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 57 1.1 tshiozak 58 1.14 joerg err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps, loc), s, n, 59 1.1 tshiozak _ps_to_private(ps), &ret); 60 1.2 yamt if (err0) 61 1.2 yamt errno = err0; 62 1.1 tshiozak 63 1.1 tshiozak return ret; 64 1.1 tshiozak } 65 1.1 tshiozak 66 1.10 joerg size_t 67 1.10 joerg mbrlen(const char *s, size_t n, mbstate_t *ps) 68 1.10 joerg { 69 1.12 joerg return mbrlen_l(s, n, ps, _current_locale()); 70 1.10 joerg } 71 1.10 joerg 72 1.1 tshiozak int 73 1.10 joerg mbsinit_l(const mbstate_t *ps, locale_t loc) 74 1.1 tshiozak { 75 1.1 tshiozak int ret; 76 1.2 yamt int err0; 77 1.1 tshiozak _RuneLocale *rl; 78 1.1 tshiozak 79 1.1 tshiozak if (ps == NULL) 80 1.1 tshiozak return 1; 81 1.1 tshiozak 82 1.1 tshiozak if (_ps_to_runelocale(ps) == NULL) 83 1.10 joerg rl = _RUNE_LOCALE(loc); 84 1.1 tshiozak else 85 1.1 tshiozak rl = _ps_to_runelocale(ps); 86 1.1 tshiozak 87 1.1 tshiozak /* mbsinit should cause no error... */ 88 1.2 yamt err0 = _citrus_ctype_mbsinit(rl->rl_citrus_ctype, 89 1.1 tshiozak _ps_to_private_const(ps), &ret); 90 1.3 yamt if (err0) 91 1.3 yamt errno = err0; 92 1.3 yamt 93 1.3 yamt return ret; 94 1.3 yamt } 95 1.3 yamt 96 1.10 joerg int 97 1.10 joerg mbsinit(const mbstate_t *ps) 98 1.10 joerg { 99 1.12 joerg return mbsinit_l(ps, _current_locale()); 100 1.10 joerg } 101 1.10 joerg 102 1.3 yamt size_t 103 1.10 joerg mbrtowc_l(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps, locale_t loc) 104 1.3 yamt { 105 1.3 yamt size_t ret; 106 1.3 yamt int err0; 107 1.3 yamt 108 1.10 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 109 1.3 yamt 110 1.14 joerg err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps, loc), pwc, s, n, 111 1.3 yamt _ps_to_private(ps), &ret); 112 1.2 yamt if (err0) 113 1.2 yamt errno = err0; 114 1.1 tshiozak 115 1.1 tshiozak return ret; 116 1.1 tshiozak } 117 1.1 tshiozak 118 1.1 tshiozak size_t 119 1.10 joerg mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) 120 1.10 joerg { 121 1.12 joerg return mbrtowc_l(pwc, s, n, ps, _current_locale()); 122 1.10 joerg } 123 1.10 joerg 124 1.10 joerg size_t 125 1.10 joerg mbsrtowcs_l(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps, 126 1.10 joerg locale_t loc) 127 1.1 tshiozak { 128 1.1 tshiozak size_t ret; 129 1.2 yamt int err0; 130 1.1 tshiozak 131 1.10 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 132 1.1 tshiozak 133 1.14 joerg err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps, loc), pwcs, s, n, 134 1.1 tshiozak _ps_to_private(ps), &ret); 135 1.2 yamt if (err0) 136 1.2 yamt errno = err0; 137 1.1 tshiozak 138 1.1 tshiozak return ret; 139 1.1 tshiozak } 140 1.1 tshiozak 141 1.1 tshiozak size_t 142 1.10 joerg mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps) 143 1.10 joerg { 144 1.12 joerg return mbsrtowcs_l(pwcs, s, n, ps, _current_locale()); 145 1.10 joerg } 146 1.10 joerg 147 1.10 joerg size_t 148 1.13 joerg mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps, 149 1.13 joerg locale_t loc) 150 1.13 joerg { 151 1.13 joerg size_t ret; 152 1.13 joerg int err0; 153 1.13 joerg 154 1.13 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 155 1.13 joerg 156 1.14 joerg err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps, loc), pwcs, s, in, n, 157 1.13 joerg _ps_to_private(ps), &ret); 158 1.13 joerg if (err0) 159 1.13 joerg errno = err0; 160 1.13 joerg 161 1.13 joerg return ret; 162 1.13 joerg } 163 1.13 joerg 164 1.13 joerg size_t 165 1.13 joerg mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps) 166 1.13 joerg { 167 1.13 joerg return mbsnrtowcs_l(pwcs, s, in, n, ps, _current_locale()); 168 1.13 joerg } 169 1.13 joerg 170 1.13 joerg size_t 171 1.10 joerg wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc) 172 1.1 tshiozak { 173 1.1 tshiozak size_t ret; 174 1.2 yamt int err0; 175 1.1 tshiozak 176 1.10 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 177 1.1 tshiozak 178 1.14 joerg err0 = _citrus_ctype_wcrtomb(_ps_to_ctype(ps, loc), s, wc, 179 1.1 tshiozak _ps_to_private(ps), &ret); 180 1.2 yamt if (err0) 181 1.2 yamt errno = err0; 182 1.1 tshiozak 183 1.1 tshiozak return ret; 184 1.1 tshiozak } 185 1.1 tshiozak 186 1.1 tshiozak size_t 187 1.10 joerg wcrtomb(char *s, wchar_t wc, mbstate_t *ps) 188 1.10 joerg { 189 1.12 joerg return wcrtomb_l(s, wc, ps, _current_locale()); 190 1.10 joerg } 191 1.10 joerg 192 1.10 joerg size_t 193 1.10 joerg wcsrtombs_l(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps, 194 1.10 joerg locale_t loc) 195 1.1 tshiozak { 196 1.1 tshiozak size_t ret; 197 1.2 yamt int err0; 198 1.2 yamt 199 1.10 joerg _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL); 200 1.1 tshiozak 201 1.14 joerg err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps, loc), s, ppwcs, n, 202 1.1 tshiozak _ps_to_private(ps), &ret); 203 1.5 tshiozak if (err0) 204 1.5 tshiozak errno = err0; 205 1.5 tshiozak 206 1.5 tshiozak return ret; 207 1.5 tshiozak } 208 1.5 tshiozak 209 1.10 joerg size_t 210 1.10 joerg wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps) 211 1.10 joerg { 212 1.12 joerg return wcsrtombs_l(s, ppwcs, n, ps, _current_locale()); 213 1.10 joerg } 214 1.10 joerg 215 1.5 tshiozak wint_t 216 1.10 joerg btowc_l(int c, locale_t loc) 217 1.5 tshiozak { 218 1.5 tshiozak wint_t ret; 219 1.5 tshiozak int err0; 220 1.5 tshiozak 221 1.10 joerg err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &ret); 222 1.5 tshiozak if (err0) 223 1.5 tshiozak errno = err0; 224 1.5 tshiozak 225 1.5 tshiozak return ret; 226 1.5 tshiozak } 227 1.5 tshiozak 228 1.10 joerg wint_t 229 1.10 joerg btowc(int c) 230 1.10 joerg { 231 1.12 joerg return btowc_l(c, _current_locale()); 232 1.10 joerg } 233 1.10 joerg 234 1.5 tshiozak int 235 1.10 joerg wctob_l(wint_t wc, locale_t loc) 236 1.5 tshiozak { 237 1.5 tshiozak int ret; 238 1.5 tshiozak int err0; 239 1.5 tshiozak 240 1.10 joerg err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &ret); 241 1.2 yamt if (err0) 242 1.2 yamt errno = err0; 243 1.1 tshiozak 244 1.1 tshiozak return ret; 245 1.1 tshiozak } 246 1.10 joerg 247 1.10 joerg int 248 1.10 joerg wctob(wint_t wc) 249 1.10 joerg { 250 1.12 joerg return wctob_l(wc, _current_locale()); 251 1.11 joerg } 252 1.11 joerg 253 1.11 joerg size_t 254 1.11 joerg _mb_cur_max_l(locale_t loc) 255 1.11 joerg { 256 1.11 joerg 257 1.11 joerg return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc)); 258 1.11 joerg } 259