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