1 /* $NetBSD: citrus_none.c,v 1.18 2008/06/14 16:01:07 tnozaki 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.18 2008/06/14 16:01:07 tnozaki 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
;
188 _citrus_NONE_ctype_mbstowcs(void * __restrict cl
, wchar_t * __restrict wcs
,
189 const char * __restrict s
, size_t n
,
190 size_t * __restrict nresult
)
194 return (_citrus_NONE_ctype_mbsrtowcs(cl
, wcs
, &rs
, n
, NULL
, nresult
));
199 _citrus_NONE_ctype_mbtowc(void * __restrict cl
, wchar_t * __restrict pwc
,
200 const char * __restrict s
, size_t n
,
201 int * __restrict nresult
)
205 *nresult
= 0; /* state independent */
220 *pwc
= (wchar_t)(unsigned char)*s
;
221 *nresult
= *s
== '\0' ? 0 : 1;
228 _citrus_NONE_ctype_wcrtomb(void * __restrict cl
, char * __restrict s
,
229 wchar_t wc
, void * __restrict pspriv
,
230 size_t * __restrict nresult
)
232 if ((wc
&~0xFFU
) != 0) {
233 *nresult
= (size_t)-1;
246 _citrus_NONE_ctype_wcsrtombs(void * __restrict cl
, char * __restrict s
,
247 const wchar_t ** __restrict pwcs
, size_t n
,
248 void * __restrict pspriv
,
249 size_t * __restrict nresult
)
252 const wchar_t *pwcs0
;
261 if ((*pwcs0
& ~0xFFU
) != 0) {
262 *nresult
= (size_t)-1;
269 if (*pwcs0
== L
'\0') {
285 _citrus_NONE_ctype_wcstombs(void * __restrict cl
, char * __restrict s
,
286 const wchar_t * __restrict pwcs
, size_t n
,
287 size_t * __restrict nresult
)
289 const wchar_t *rpwcs
= pwcs
;
291 return (_citrus_NONE_ctype_wcsrtombs(cl
, s
, &rpwcs
, n
, NULL
, nresult
));
295 _citrus_NONE_ctype_wctomb(void * __restrict cl
, char * __restrict s
,
296 wchar_t wc
, int * __restrict nresult
)
303 * initialize state here.
304 * (nothing to do for us.)
306 *nresult
= 0; /* we're state independent */
310 ret
= _citrus_NONE_ctype_wcrtomb(cl
, s
, wc
, NULL
, &nr
);
318 _citrus_NONE_ctype_btowc(_citrus_ctype_rec_t
* __restrict cc
,
319 int c
, wint_t * __restrict wcresult
)
321 if (c
== EOF
|| c
& ~0xFF)
324 *wcresult
= (wint_t)c
;
330 _citrus_NONE_ctype_wctob(_citrus_ctype_rec_t
* __restrict cc
,
331 wint_t wc
, int * __restrict cresult
)
333 if (wc
== WEOF
|| wc
& ~0xFF)
340 /* ---------------------------------------------------------------------- */
342 _CITRUS_STDENC_DECLS(NONE
);
343 _CITRUS_STDENC_DEF_OPS(NONE
);
344 struct _citrus_stdenc_traits _citrus_NONE_stdenc_traits
= {
345 0, /* et_state_size */
351 _citrus_NONE_stdenc_init(struct _citrus_stdenc
* __restrict ce
,
352 const void *var
, size_t lenvar
,
353 struct _citrus_stdenc_traits
* __restrict et
)
356 et
->et_state_size
= 0;
357 et
->et_mb_cur_max
= 1;
359 ce
->ce_closure
= NULL
;
366 _citrus_NONE_stdenc_uninit(struct _citrus_stdenc
*ce
)
372 _citrus_NONE_stdenc_init_state(struct _citrus_stdenc
* __restrict ce
,
373 void * __restrict ps
)
380 _citrus_NONE_stdenc_mbtocs(struct _citrus_stdenc
* __restrict ce
,
381 _csid_t
*csid
, _index_t
*idx
,
382 const char **s
, size_t n
,
383 void *ps
, size_t *nresult
)
386 _DIAGASSERT(csid
!= NULL
&& idx
!= NULL
);
389 *nresult
= (size_t)-2;
394 *idx
= (_index_t
)(unsigned char)*(*s
)++;
395 *nresult
= *idx
== 0 ? 0 : 1;
402 _citrus_NONE_stdenc_cstomb(struct _citrus_stdenc
* __restrict ce
,
404 _csid_t csid
, _index_t idx
,
405 void *ps
, size_t *nresult
)
408 if (csid
== _CITRUS_CSID_INVALID
) {
413 *nresult
= (size_t)-1;
416 if (csid
!= 0 || (idx
&0xFF) != idx
)
427 _citrus_NONE_stdenc_mbtowc(struct _citrus_stdenc
* __restrict ce
,
428 _wc_t
* __restrict pwc
,
429 const char ** __restrict s
, size_t n
,
430 void * __restrict pspriv
,
431 size_t * __restrict nresult
)
438 *nresult
= (size_t)-2;
443 *pwc
= (_wc_t
)(unsigned char) **s
;
445 *nresult
= *s
== '\0' ? 0 : 1;
451 _citrus_NONE_stdenc_wctomb(struct _citrus_stdenc
* __restrict ce
,
452 char * __restrict s
, size_t n
,
453 _wc_t wc
, void * __restrict pspriv
,
454 size_t * __restrict nresult
)
456 if ((wc
&~0xFFU
) != 0) {
457 *nresult
= (size_t)-1;
461 *nresult
= (size_t)-1;
474 _citrus_NONE_stdenc_put_state_reset(struct _citrus_stdenc
* __restrict ce
,
475 char * __restrict s
, size_t n
,
476 void * __restrict pspriv
,
477 size_t * __restrict nresult
)
487 _citrus_NONE_stdenc_get_state_desc(struct _stdenc
* __restrict ce
,
488 void * __restrict ps
,
490 struct _stdenc_state_desc
* __restrict d
)
495 case _STDENC_SDID_GENERIC
:
496 d
->u
.generic
.state
= _STDENC_SDGEN_INITIAL
;