1 /* $NetBSD: citrus_none.c,v 1.19 2013/05/28 16:57:56 joerg Exp $ */
4 * Copyright (c)2002 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: citrus_none.c,v 1.19 2013/05/28 16:57:56 joerg Exp $");
32 #endif /* LIBC_SCCS and not lint */
41 #include <sys/types.h>
43 #include "citrus_namespace.h"
44 #include "citrus_types.h"
45 #include "citrus_module.h"
46 #include "citrus_ctype.h"
47 #include "citrus_none.h"
48 #include "citrus_stdenc.h"
50 /* ---------------------------------------------------------------------- */
52 _CITRUS_CTYPE_DECLS(NONE
);
53 _CITRUS_CTYPE_DEF_OPS(NONE
);
56 /* ---------------------------------------------------------------------- */
60 _citrus_NONE_ctype_init(void ** __restrict cl
, void * __restrict var
,
61 size_t lenvar
, size_t lenps
)
69 _citrus_NONE_ctype_uninit(void *cl
)
75 _citrus_NONE_ctype_get_mb_cur_max(void *cl
)
82 _citrus_NONE_ctype_mblen(void * __restrict cl
, const char * __restrict s
,
83 size_t n
, int * __restrict nresult
)
86 *nresult
= 0; /* state independent */
93 *nresult
= (*s
== 0) ? 0 : 1;
99 _citrus_NONE_ctype_mbrlen(void * __restrict cl
, const char * __restrict s
,
100 size_t n
, void * __restrict pspriv
,
101 size_t * __restrict nresult
)
108 *nresult
= (size_t)-2;
111 *nresult
= (*s
== 0) ? 0 : 1;
117 _citrus_NONE_ctype_mbrtowc(void * __restrict cl
, wchar_t * __restrict pwc
,
118 const char * __restrict s
, size_t n
,
119 void * __restrict pspriv
,
120 size_t * __restrict nresult
)
127 *nresult
= (size_t)-2;
132 *pwc
= (wchar_t)(unsigned char) *s
;
134 *nresult
= *s
== '\0' ? 0 : 1;
140 _citrus_NONE_ctype_mbsinit(void * __restrict cl
,
141 const void * __restrict pspriv
,
142 int * __restrict nresult
)
144 *nresult
= 1; /* always initial state */
150 _citrus_NONE_ctype_mbsrtowcs(void * __restrict cl
, wchar_t * __restrict pwcs
,
151 const char ** __restrict s
, size_t n
,
152 void * __restrict pspriv
,
153 size_t * __restrict nresult
)
158 /* if pwcs is NULL, ignore n */
160 n
= 1; /* arbitrary >0 value */
163 s0
= *s
; /* to keep *s unchanged for now, use copy instead. */
166 *pwcs
= (wchar_t)(unsigned char)*s0
;
182 *nresult
= (size_t)cnt
;
189 _citrus_NONE_ctype_mbsnrtowcs(_citrus_ctype_rec_t
* __restrict cc
,
190 wchar_t * __restrict pwcs
,
191 const char ** __restrict s
, size_t in
, size_t n
,
192 void * __restrict pspriv
,
193 size_t * __restrict nresult
)
198 /* if pwcs is NULL, ignore n */
200 n
= 1; /* arbitrary >0 value */
203 s0
= *s
; /* to keep *s unchanged for now, use copy instead. */
204 while (in
> 0 && n
> 0) {
206 *pwcs
= (wchar_t)(unsigned char)*s0
;
223 *nresult
= (size_t)cnt
;
229 _citrus_NONE_ctype_mbstowcs(void * __restrict cl
, wchar_t * __restrict wcs
,
230 const char * __restrict s
, size_t n
,
231 size_t * __restrict nresult
)
235 return (_citrus_NONE_ctype_mbsrtowcs(cl
, wcs
, &rs
, n
, NULL
, nresult
));
240 _citrus_NONE_ctype_mbtowc(void * __restrict cl
, wchar_t * __restrict pwc
,
241 const char * __restrict s
, size_t n
,
242 int * __restrict nresult
)
246 *nresult
= 0; /* state independent */
261 *pwc
= (wchar_t)(unsigned char)*s
;
262 *nresult
= *s
== '\0' ? 0 : 1;
269 _citrus_NONE_ctype_wcrtomb(void * __restrict cl
, char * __restrict s
,
270 wchar_t wc
, void * __restrict pspriv
,
271 size_t * __restrict nresult
)
273 if ((wc
&~0xFFU
) != 0) {
274 *nresult
= (size_t)-1;
287 _citrus_NONE_ctype_wcsrtombs(void * __restrict cl
, char * __restrict s
,
288 const wchar_t ** __restrict pwcs
, size_t n
,
289 void * __restrict pspriv
,
290 size_t * __restrict nresult
)
293 const wchar_t *pwcs0
;
302 if ((*pwcs0
& ~0xFFU
) != 0) {
303 *nresult
= (size_t)-1;
310 if (*pwcs0
== L
'\0') {
327 _citrus_NONE_ctype_wcsnrtombs(_citrus_ctype_rec_t
* __restrict cc
,
329 const wchar_t ** __restrict pwcs
, size_t in
,
330 size_t n
, void * __restrict pspriv
,
331 size_t * __restrict nresult
)
334 const wchar_t *pwcs0
;
342 while (in
> 0 && n
> 0) {
343 if ((*pwcs0
& ~0xFFU
) != 0) {
344 *nresult
= (size_t)-1;
351 if (*pwcs0
== L
'\0') {
368 _citrus_NONE_ctype_wcstombs(void * __restrict cl
, char * __restrict s
,
369 const wchar_t * __restrict pwcs
, size_t n
,
370 size_t * __restrict nresult
)
372 const wchar_t *rpwcs
= pwcs
;
374 return (_citrus_NONE_ctype_wcsrtombs(cl
, s
, &rpwcs
, n
, NULL
, nresult
));
378 _citrus_NONE_ctype_wctomb(void * __restrict cl
, char * __restrict s
,
379 wchar_t wc
, int * __restrict nresult
)
386 * initialize state here.
387 * (nothing to do for us.)
389 *nresult
= 0; /* we're state independent */
393 ret
= _citrus_NONE_ctype_wcrtomb(cl
, s
, wc
, NULL
, &nr
);
401 _citrus_NONE_ctype_btowc(_citrus_ctype_rec_t
* __restrict cc
,
402 int c
, wint_t * __restrict wcresult
)
404 if (c
== EOF
|| c
& ~0xFF)
407 *wcresult
= (wint_t)c
;
413 _citrus_NONE_ctype_wctob(_citrus_ctype_rec_t
* __restrict cc
,
414 wint_t wc
, int * __restrict cresult
)
416 if (wc
== WEOF
|| wc
& ~0xFF)
423 /* ---------------------------------------------------------------------- */
425 _CITRUS_STDENC_DECLS(NONE
);
426 _CITRUS_STDENC_DEF_OPS(NONE
);
427 struct _citrus_stdenc_traits _citrus_NONE_stdenc_traits
= {
428 0, /* et_state_size */
434 _citrus_NONE_stdenc_init(struct _citrus_stdenc
* __restrict ce
,
435 const void *var
, size_t lenvar
,
436 struct _citrus_stdenc_traits
* __restrict et
)
439 et
->et_state_size
= 0;
440 et
->et_mb_cur_max
= 1;
442 ce
->ce_closure
= NULL
;
449 _citrus_NONE_stdenc_uninit(struct _citrus_stdenc
*ce
)
455 _citrus_NONE_stdenc_init_state(struct _citrus_stdenc
* __restrict ce
,
456 void * __restrict ps
)
463 _citrus_NONE_stdenc_mbtocs(struct _citrus_stdenc
* __restrict ce
,
464 _csid_t
*csid
, _index_t
*idx
,
465 const char **s
, size_t n
,
466 void *ps
, size_t *nresult
)
469 _DIAGASSERT(csid
!= NULL
&& idx
!= NULL
);
472 *nresult
= (size_t)-2;
477 *idx
= (_index_t
)(unsigned char)*(*s
)++;
478 *nresult
= *idx
== 0 ? 0 : 1;
485 _citrus_NONE_stdenc_cstomb(struct _citrus_stdenc
* __restrict ce
,
487 _csid_t csid
, _index_t idx
,
488 void *ps
, size_t *nresult
)
491 if (csid
== _CITRUS_CSID_INVALID
) {
496 *nresult
= (size_t)-1;
499 if (csid
!= 0 || (idx
&0xFF) != idx
)
510 _citrus_NONE_stdenc_mbtowc(struct _citrus_stdenc
* __restrict ce
,
511 _wc_t
* __restrict pwc
,
512 const char ** __restrict s
, size_t n
,
513 void * __restrict pspriv
,
514 size_t * __restrict nresult
)
521 *nresult
= (size_t)-2;
526 *pwc
= (_wc_t
)(unsigned char) **s
;
528 *nresult
= *s
== '\0' ? 0 : 1;
534 _citrus_NONE_stdenc_wctomb(struct _citrus_stdenc
* __restrict ce
,
535 char * __restrict s
, size_t n
,
536 _wc_t wc
, void * __restrict pspriv
,
537 size_t * __restrict nresult
)
539 if ((wc
&~0xFFU
) != 0) {
540 *nresult
= (size_t)-1;
544 *nresult
= (size_t)-1;
557 _citrus_NONE_stdenc_put_state_reset(struct _citrus_stdenc
* __restrict ce
,
558 char * __restrict s
, size_t n
,
559 void * __restrict pspriv
,
560 size_t * __restrict nresult
)
570 _citrus_NONE_stdenc_get_state_desc(struct _stdenc
* __restrict ce
,
571 void * __restrict ps
,
573 struct _stdenc_state_desc
* __restrict d
)
578 case _STDENC_SDID_GENERIC
:
579 d
->u
.generic
.state
= _STDENC_SDGEN_INITIAL
;