none.c revision 281927
1/*-
2 * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved.
3 * Copyright (c) 1993
4 *	The Regents of the University of California.  All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * Paul Borman at Krystal Technologies.
8 *
9 * Copyright (c) 2011 The FreeBSD Foundation
10 * All rights reserved.
11 * Portions of this software were developed by David Chisnall
12 * under sponsorship from the FreeBSD Foundation.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 * 4. Neither the name of the University nor the names of its contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39#if defined(LIBC_SCCS) && !defined(lint)
40static char sccsid[] = "@(#)none.c	8.1 (Berkeley) 6/4/93";
41#endif /* LIBC_SCCS and not lint */
42#include <sys/cdefs.h>
43__FBSDID("$FreeBSD: head/lib/libc/locale/none.c 281927 2015-04-24 10:21:20Z theraven $");
44
45#include <errno.h>
46#include <limits.h>
47#include <runetype.h>
48#include <stddef.h>
49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <wchar.h>
53#include "mblocal.h"
54
55static size_t	_none_mbrtowc(wchar_t * __restrict, const char * __restrict,
56		    size_t, mbstate_t * __restrict);
57static int	_none_mbsinit(const mbstate_t *);
58static size_t	_none_mbsnrtowcs(wchar_t * __restrict dst,
59		    const char ** __restrict src, size_t nms, size_t len,
60		    mbstate_t * __restrict ps __unused);
61static size_t	_none_wcrtomb(char * __restrict, wchar_t,
62		    mbstate_t * __restrict);
63static size_t	_none_wcsnrtombs(char * __restrict, const wchar_t ** __restrict,
64		    size_t, size_t, mbstate_t * __restrict);
65
66/* setup defaults */
67
68int __mb_cur_max = 1;
69int __mb_sb_limit = 256; /* Expected to be <= _CACHED_RUNES */
70
71int
72_none_init(struct xlocale_ctype *l, _RuneLocale *rl)
73{
74
75	l->__mbrtowc = _none_mbrtowc;
76	l->__mbsinit = _none_mbsinit;
77	l->__mbsnrtowcs = _none_mbsnrtowcs;
78	l->__wcrtomb = _none_wcrtomb;
79	l->__wcsnrtombs = _none_wcsnrtombs;
80	l->runes = rl;
81	l->__mb_cur_max = 1;
82	l->__mb_sb_limit = 256;
83	return(0);
84}
85
86static int
87_none_mbsinit(const mbstate_t *ps __unused)
88{
89
90	/*
91	 * Encoding is not state dependent - we are always in the
92	 * initial state.
93	 */
94	return (1);
95}
96
97static size_t
98_none_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
99    mbstate_t * __restrict ps __unused)
100{
101
102	if (s == NULL)
103		/* Reset to initial shift state (no-op) */
104		return (0);
105	if (n == 0)
106		/* Incomplete multibyte sequence */
107		return ((size_t)-2);
108	if (pwc != NULL)
109		*pwc = (unsigned char)*s;
110	return (*s == '\0' ? 0 : 1);
111}
112
113static size_t
114_none_wcrtomb(char * __restrict s, wchar_t wc,
115    mbstate_t * __restrict ps __unused)
116{
117
118	if (s == NULL)
119		/* Reset to initial shift state (no-op) */
120		return (1);
121	if (wc < 0 || wc > UCHAR_MAX) {
122		errno = EILSEQ;
123		return ((size_t)-1);
124	}
125	*s = (unsigned char)wc;
126	return (1);
127}
128
129static size_t
130_none_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src,
131    size_t nms, size_t len, mbstate_t * __restrict ps __unused)
132{
133	const char *s;
134	size_t nchr;
135
136	if (dst == NULL) {
137		s = memchr(*src, '\0', nms);
138		return (s != NULL ? s - *src : nms);
139	}
140
141	s = *src;
142	nchr = 0;
143	while (len-- > 0 && nms-- > 0) {
144		if ((*dst++ = (unsigned char)*s++) == L'\0') {
145			*src = NULL;
146			return (nchr);
147		}
148		nchr++;
149	}
150	*src = s;
151	return (nchr);
152}
153
154static size_t
155_none_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src,
156    size_t nwc, size_t len, mbstate_t * __restrict ps __unused)
157{
158	const wchar_t *s;
159	size_t nchr;
160
161	if (dst == NULL) {
162		for (s = *src; nwc > 0 && *s != L'\0'; s++, nwc--) {
163			if (*s < 0 || *s > UCHAR_MAX) {
164				errno = EILSEQ;
165				return ((size_t)-1);
166			}
167		}
168		return (s - *src);
169	}
170
171	s = *src;
172	nchr = 0;
173	while (len-- > 0 && nwc-- > 0) {
174		if (*s < 0 || *s > UCHAR_MAX) {
175			errno = EILSEQ;
176			return ((size_t)-1);
177		}
178		if ((*dst++ = *s++) == '\0') {
179			*src = NULL;
180			return (nchr);
181		}
182		nchr++;
183	}
184	*src = s;
185	return (nchr);
186}
187
188/* setup defaults */
189
190size_t (*__mbrtowc)(wchar_t * __restrict, const char * __restrict, size_t,
191    mbstate_t * __restrict) = _none_mbrtowc;
192int (*__mbsinit)(const mbstate_t *) = _none_mbsinit;
193size_t (*__mbsnrtowcs)(wchar_t * __restrict, const char ** __restrict,
194    size_t, size_t, mbstate_t * __restrict) = _none_mbsnrtowcs;
195size_t (*__wcrtomb)(char * __restrict, wchar_t, mbstate_t * __restrict) =
196    _none_wcrtomb;
197size_t (*__wcsnrtombs)(char * __restrict, const wchar_t ** __restrict,
198    size_t, size_t, mbstate_t * __restrict) = _none_wcsnrtombs;
199
200struct xlocale_ctype __xlocale_global_ctype = {
201	{{0}, "C"},
202	(_RuneLocale*)&_DefaultRuneLocale,
203	_none_mbrtowc,
204	_none_mbsinit,
205	_none_mbsnrtowcs,
206	_none_wcrtomb,
207	_none_wcsnrtombs,
208	1, /* __mb_cur_max, */
209	256 /* __mb_sb_limit */
210};
211
212struct xlocale_ctype __xlocale_C_ctype = {
213	{{0}, "C"},
214	(_RuneLocale*)&_DefaultRuneLocale,
215	_none_mbrtowc,
216	_none_mbsinit,
217	_none_mbsnrtowcs,
218	_none_wcrtomb,
219	_none_wcsnrtombs,
220	1, /* __mb_cur_max, */
221	256 /* __mb_sb_limit */
222};
223