158f0484fSRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni *
47b247341SBaptiste Daroussin * Copyright 2013 Garrett D'Amore <garrett@damore.org>
57b247341SBaptiste Daroussin * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
6ca2dae42STim J. Robbins * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved.
758f0484fSRodney W. Grimes * Copyright (c) 1993
858f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved.
958f0484fSRodney W. Grimes *
1058f0484fSRodney W. Grimes * This code is derived from software contributed to Berkeley by
1158f0484fSRodney W. Grimes * Paul Borman at Krystal Technologies.
1258f0484fSRodney W. Grimes *
133c87aa1dSDavid Chisnall * Copyright (c) 2011 The FreeBSD Foundation
14*5b5fa75aSEd Maste *
153c87aa1dSDavid Chisnall * Portions of this software were developed by David Chisnall
163c87aa1dSDavid Chisnall * under sponsorship from the FreeBSD Foundation.
173c87aa1dSDavid Chisnall *
1858f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without
1958f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions
2058f0484fSRodney W. Grimes * are met:
2158f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright
2258f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer.
2358f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright
2458f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the
2558f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution.
26fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors
2758f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software
2858f0484fSRodney W. Grimes * without specific prior written permission.
2958f0484fSRodney W. Grimes *
3058f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
3158f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
3258f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
3358f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
3458f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3558f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3658f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3758f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3858f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3958f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4058f0484fSRodney W. Grimes * SUCH DAMAGE.
4158f0484fSRodney W. Grimes */
4258f0484fSRodney W. Grimes
43d4f6cd06STim J. Robbins #include <errno.h>
449acd2d9bSTim J. Robbins #include <limits.h>
45d4f6cd06STim J. Robbins #include <runetype.h>
4658f0484fSRodney W. Grimes #include <stddef.h>
4758f0484fSRodney W. Grimes #include <stdio.h>
4858f0484fSRodney W. Grimes #include <stdlib.h>
49ea4ac135STim J. Robbins #include <string.h>
50d4f6cd06STim J. Robbins #include <wchar.h>
512051a8f2STim J. Robbins #include "mblocal.h"
52d4f6cd06STim J. Robbins
53e94c6cb4SAlexey Zelkin static size_t _none_mbrtowc(wchar_t * __restrict, const char * __restrict,
54e94c6cb4SAlexey Zelkin size_t, mbstate_t * __restrict);
55e94c6cb4SAlexey Zelkin static int _none_mbsinit(const mbstate_t *);
56e94c6cb4SAlexey Zelkin static size_t _none_mbsnrtowcs(wchar_t * __restrict dst,
571949a347STim J. Robbins const char ** __restrict src, size_t nms, size_t len,
581949a347STim J. Robbins mbstate_t * __restrict ps __unused);
59e94c6cb4SAlexey Zelkin static size_t _none_wcrtomb(char * __restrict, wchar_t,
60e94c6cb4SAlexey Zelkin mbstate_t * __restrict);
61e94c6cb4SAlexey Zelkin static size_t _none_wcsnrtombs(char * __restrict, const wchar_t ** __restrict,
621949a347STim J. Robbins size_t, size_t, mbstate_t * __restrict);
6358f0484fSRodney W. Grimes
64367ed4e1SAndrey A. Chernov /* setup defaults */
65367ed4e1SAndrey A. Chernov
66367ed4e1SAndrey A. Chernov int __mb_cur_max = 1;
67367ed4e1SAndrey A. Chernov int __mb_sb_limit = 256; /* Expected to be <= _CACHED_RUNES */
68367ed4e1SAndrey A. Chernov
6958f0484fSRodney W. Grimes int
_none_init(struct xlocale_ctype * l,_RuneLocale * rl)703c87aa1dSDavid Chisnall _none_init(struct xlocale_ctype *l, _RuneLocale *rl)
7158f0484fSRodney W. Grimes {
72d4f6cd06STim J. Robbins
733c87aa1dSDavid Chisnall l->__mbrtowc = _none_mbrtowc;
743c87aa1dSDavid Chisnall l->__mbsinit = _none_mbsinit;
753c87aa1dSDavid Chisnall l->__mbsnrtowcs = _none_mbsnrtowcs;
763c87aa1dSDavid Chisnall l->__wcrtomb = _none_wcrtomb;
773c87aa1dSDavid Chisnall l->__wcsnrtombs = _none_wcsnrtombs;
783c87aa1dSDavid Chisnall l->runes = rl;
793c87aa1dSDavid Chisnall l->__mb_cur_max = 1;
803c87aa1dSDavid Chisnall l->__mb_sb_limit = 256;
8158f0484fSRodney W. Grimes return(0);
8258f0484fSRodney W. Grimes }
8358f0484fSRodney W. Grimes
84e94c6cb4SAlexey Zelkin static int
_none_mbsinit(const mbstate_t * ps __unused)85ca2dae42STim J. Robbins _none_mbsinit(const mbstate_t *ps __unused)
86ca2dae42STim J. Robbins {
87ca2dae42STim J. Robbins
88ca2dae42STim J. Robbins /*
89ca2dae42STim J. Robbins * Encoding is not state dependent - we are always in the
90ca2dae42STim J. Robbins * initial state.
91ca2dae42STim J. Robbins */
92ca2dae42STim J. Robbins return (1);
93ca2dae42STim J. Robbins }
94ca2dae42STim J. Robbins
95e94c6cb4SAlexey Zelkin static size_t
_none_mbrtowc(wchar_t * __restrict pwc,const char * __restrict s,size_t n,mbstate_t * __restrict ps __unused)96d4f6cd06STim J. Robbins _none_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
97d4f6cd06STim J. Robbins mbstate_t * __restrict ps __unused)
9858f0484fSRodney W. Grimes {
99d4f6cd06STim J. Robbins
100d4f6cd06STim J. Robbins if (s == NULL)
101d4f6cd06STim J. Robbins /* Reset to initial shift state (no-op) */
102d4f6cd06STim J. Robbins return (0);
103d4f6cd06STim J. Robbins if (n == 0)
104d4f6cd06STim J. Robbins /* Incomplete multibyte sequence */
105d4f6cd06STim J. Robbins return ((size_t)-2);
106d4f6cd06STim J. Robbins if (pwc != NULL)
107d4f6cd06STim J. Robbins *pwc = (unsigned char)*s;
108d4f6cd06STim J. Robbins return (*s == '\0' ? 0 : 1);
10958f0484fSRodney W. Grimes }
11058f0484fSRodney W. Grimes
111e94c6cb4SAlexey Zelkin static size_t
_none_wcrtomb(char * __restrict s,wchar_t wc,mbstate_t * __restrict ps __unused)112d4f6cd06STim J. Robbins _none_wcrtomb(char * __restrict s, wchar_t wc,
113d4f6cd06STim J. Robbins mbstate_t * __restrict ps __unused)
11458f0484fSRodney W. Grimes {
115d4f6cd06STim J. Robbins
116d4f6cd06STim J. Robbins if (s == NULL)
117d4f6cd06STim J. Robbins /* Reset to initial shift state (no-op) */
118d4f6cd06STim J. Robbins return (1);
119d4f6cd06STim J. Robbins if (wc < 0 || wc > UCHAR_MAX) {
120d4f6cd06STim J. Robbins errno = EILSEQ;
121d4f6cd06STim J. Robbins return ((size_t)-1);
1229acd2d9bSTim J. Robbins }
123d4f6cd06STim J. Robbins *s = (unsigned char)wc;
12458f0484fSRodney W. Grimes return (1);
12558f0484fSRodney W. Grimes }
126ea4ac135STim J. Robbins
127e94c6cb4SAlexey Zelkin static size_t
_none_mbsnrtowcs(wchar_t * __restrict dst,const char ** __restrict src,size_t nms,size_t len,mbstate_t * __restrict ps __unused)1281949a347STim J. Robbins _none_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src,
1291949a347STim J. Robbins size_t nms, size_t len, mbstate_t * __restrict ps __unused)
130ea4ac135STim J. Robbins {
131ea4ac135STim J. Robbins const char *s;
132ea4ac135STim J. Robbins size_t nchr;
133ea4ac135STim J. Robbins
1341949a347STim J. Robbins if (dst == NULL) {
1351949a347STim J. Robbins s = memchr(*src, '\0', nms);
1361949a347STim J. Robbins return (s != NULL ? s - *src : nms);
1371949a347STim J. Robbins }
138ea4ac135STim J. Robbins
139ea4ac135STim J. Robbins s = *src;
140ea4ac135STim J. Robbins nchr = 0;
1411949a347STim J. Robbins while (len-- > 0 && nms-- > 0) {
142ea4ac135STim J. Robbins if ((*dst++ = (unsigned char)*s++) == L'\0') {
143ea4ac135STim J. Robbins *src = NULL;
144ea4ac135STim J. Robbins return (nchr);
145ea4ac135STim J. Robbins }
146ea4ac135STim J. Robbins nchr++;
147ea4ac135STim J. Robbins }
148ea4ac135STim J. Robbins *src = s;
149ea4ac135STim J. Robbins return (nchr);
150ea4ac135STim J. Robbins }
151ea4ac135STim J. Robbins
152e94c6cb4SAlexey Zelkin static size_t
_none_wcsnrtombs(char * __restrict dst,const wchar_t ** __restrict src,size_t nwc,size_t len,mbstate_t * __restrict ps __unused)1531949a347STim J. Robbins _none_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src,
1541949a347STim J. Robbins size_t nwc, size_t len, mbstate_t * __restrict ps __unused)
155ea4ac135STim J. Robbins {
156ea4ac135STim J. Robbins const wchar_t *s;
157ea4ac135STim J. Robbins size_t nchr;
158ea4ac135STim J. Robbins
15918b20312STim J. Robbins if (dst == NULL) {
1601949a347STim J. Robbins for (s = *src; nwc > 0 && *s != L'\0'; s++, nwc--) {
16118b20312STim J. Robbins if (*s < 0 || *s > UCHAR_MAX) {
16218b20312STim J. Robbins errno = EILSEQ;
16318b20312STim J. Robbins return ((size_t)-1);
16418b20312STim J. Robbins }
16518b20312STim J. Robbins }
16618b20312STim J. Robbins return (s - *src);
16718b20312STim J. Robbins }
168ea4ac135STim J. Robbins
169ea4ac135STim J. Robbins s = *src;
170ea4ac135STim J. Robbins nchr = 0;
1711949a347STim J. Robbins while (len-- > 0 && nwc-- > 0) {
172ea4ac135STim J. Robbins if (*s < 0 || *s > UCHAR_MAX) {
1732f423a26SAndrey A. Chernov *src = s;
174ea4ac135STim J. Robbins errno = EILSEQ;
175ea4ac135STim J. Robbins return ((size_t)-1);
176ea4ac135STim J. Robbins }
177ea4ac135STim J. Robbins if ((*dst++ = *s++) == '\0') {
178ea4ac135STim J. Robbins *src = NULL;
179ea4ac135STim J. Robbins return (nchr);
180ea4ac135STim J. Robbins }
181ea4ac135STim J. Robbins nchr++;
182ea4ac135STim J. Robbins }
183ea4ac135STim J. Robbins *src = s;
184ea4ac135STim J. Robbins return (nchr);
185ea4ac135STim J. Robbins }
186e94c6cb4SAlexey Zelkin
187e94c6cb4SAlexey Zelkin /* setup defaults */
188e94c6cb4SAlexey Zelkin
1893c87aa1dSDavid Chisnall struct xlocale_ctype __xlocale_global_ctype = {
1903c87aa1dSDavid Chisnall {{0}, "C"},
1913c87aa1dSDavid Chisnall (_RuneLocale*)&_DefaultRuneLocale,
1923c87aa1dSDavid Chisnall _none_mbrtowc,
1933c87aa1dSDavid Chisnall _none_mbsinit,
1943c87aa1dSDavid Chisnall _none_mbsnrtowcs,
1953c87aa1dSDavid Chisnall _none_wcrtomb,
1963c87aa1dSDavid Chisnall _none_wcsnrtombs,
1973c87aa1dSDavid Chisnall 1, /* __mb_cur_max, */
1983c87aa1dSDavid Chisnall 256 /* __mb_sb_limit */
1993c87aa1dSDavid Chisnall };
2003c87aa1dSDavid Chisnall
201710ec77eSDavid Chisnall struct xlocale_ctype __xlocale_C_ctype = {
2023c87aa1dSDavid Chisnall {{0}, "C"},
2033c87aa1dSDavid Chisnall (_RuneLocale*)&_DefaultRuneLocale,
2043c87aa1dSDavid Chisnall _none_mbrtowc,
2053c87aa1dSDavid Chisnall _none_mbsinit,
2063c87aa1dSDavid Chisnall _none_mbsnrtowcs,
2073c87aa1dSDavid Chisnall _none_wcrtomb,
2083c87aa1dSDavid Chisnall _none_wcsnrtombs,
2093c87aa1dSDavid Chisnall 1, /* __mb_cur_max, */
2103c87aa1dSDavid Chisnall 256 /* __mb_sb_limit */
2113c87aa1dSDavid Chisnall };
212