1 /* $NetBSD: multibyte_amd1.c,v 1.14 2013/08/18 20:03:48 joerg Exp $ */
4 * Copyright (c)2002, 2008 Citrus Project,
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <sys/cdefs.h>
30 #if defined(LIBC_SCCS) && !defined(lint)
31 __RCSID("$NetBSD: multibyte_amd1.c,v 1.14 2013/08/18 20:03:48 joerg Exp $");
32 #endif /* LIBC_SCCS and not lint */
34 #include <sys/types.h>
39 #define __SETLOCALE_SOURCE__
43 #include "setlocale_local.h"
45 #include "citrus_module.h"
46 #include "citrus_ctype.h"
47 #include "runetype_local.h"
48 #include "multibyte.h"
51 mbrlen_l(const char *s
, size_t n
, mbstate_t *ps
, locale_t loc
)
56 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
58 err0
= _citrus_ctype_mbrlen(_ps_to_ctype(ps
, loc
), s
, n
,
59 _ps_to_private(ps
), &ret
);
67 mbrlen(const char *s
, size_t n
, mbstate_t *ps
)
69 return mbrlen_l(s
, n
, ps
, _current_locale());
73 mbsinit_l(const mbstate_t *ps
, locale_t loc
)
82 if (_ps_to_runelocale(ps
) == NULL
)
83 rl
= _RUNE_LOCALE(loc
);
85 rl
= _ps_to_runelocale(ps
);
87 /* mbsinit should cause no error... */
88 err0
= _citrus_ctype_mbsinit(rl
->rl_citrus_ctype
,
89 _ps_to_private_const(ps
), &ret
);
97 mbsinit(const mbstate_t *ps
)
99 return mbsinit_l(ps
, _current_locale());
103 mbrtowc_l(wchar_t *pwc
, const char *s
, size_t n
, mbstate_t *ps
, locale_t loc
)
108 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
110 err0
= _citrus_ctype_mbrtowc(_ps_to_ctype(ps
, loc
), pwc
, s
, n
,
111 _ps_to_private(ps
), &ret
);
119 mbrtowc(wchar_t *pwc
, const char *s
, size_t n
, mbstate_t *ps
)
121 return mbrtowc_l(pwc
, s
, n
, ps
, _current_locale());
125 mbsrtowcs_l(wchar_t *pwcs
, const char **s
, size_t n
, mbstate_t *ps
,
131 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
133 err0
= _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps
, loc
), pwcs
, s
, n
,
134 _ps_to_private(ps
), &ret
);
142 mbsrtowcs(wchar_t *pwcs
, const char **s
, size_t n
, mbstate_t *ps
)
144 return mbsrtowcs_l(pwcs
, s
, n
, ps
, _current_locale());
148 mbsnrtowcs_l(wchar_t *pwcs
, const char **s
, size_t in
, size_t n
, mbstate_t *ps
,
154 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
156 err0
= _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps
, loc
), pwcs
, s
, in
, n
,
157 _ps_to_private(ps
), &ret
);
165 mbsnrtowcs(wchar_t *pwcs
, const char **s
, size_t in
, size_t n
, mbstate_t *ps
)
167 return mbsnrtowcs_l(pwcs
, s
, in
, n
, ps
, _current_locale());
171 wcrtomb_l(char *s
, wchar_t wc
, mbstate_t *ps
, locale_t loc
)
176 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
178 err0
= _citrus_ctype_wcrtomb(_ps_to_ctype(ps
, loc
), s
, wc
,
179 _ps_to_private(ps
), &ret
);
187 wcrtomb(char *s
, wchar_t wc
, mbstate_t *ps
)
189 return wcrtomb_l(s
, wc
, ps
, _current_locale());
193 wcsrtombs_l(char *s
, const wchar_t **ppwcs
, size_t n
, mbstate_t *ps
,
199 _fixup_ps(_RUNE_LOCALE(loc
), ps
, s
== NULL
);
201 err0
= _citrus_ctype_wcsrtombs(_ps_to_ctype(ps
, loc
), s
, ppwcs
, n
,
202 _ps_to_private(ps
), &ret
);
210 wcsrtombs(char *s
, const wchar_t **ppwcs
, size_t n
, mbstate_t *ps
)
212 return wcsrtombs_l(s
, ppwcs
, n
, ps
, _current_locale());
216 btowc_l(int c
, locale_t loc
)
221 err0
= _citrus_ctype_btowc(_CITRUS_CTYPE(loc
), c
, &ret
);
231 return btowc_l(c
, _current_locale());
235 wctob_l(wint_t wc
, locale_t loc
)
240 err0
= _citrus_ctype_wctob(_CITRUS_CTYPE(loc
), wc
, &ret
);
250 return wctob_l(wc
, _current_locale());
254 _mb_cur_max_l(locale_t loc
)
257 return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc
));