1 1.23 christos /* $NetBSD: citrus_none.c,v 1.23 2019/07/28 13:52:23 christos Exp $ */ 2 1.1 tshiozak 3 1.1 tshiozak /*- 4 1.1 tshiozak * Copyright (c)2002 Citrus Project, 5 1.1 tshiozak * All rights reserved. 6 1.1 tshiozak * 7 1.1 tshiozak * Redistribution and use in source and binary forms, with or without 8 1.1 tshiozak * modification, are permitted provided that the following conditions 9 1.1 tshiozak * are met: 10 1.1 tshiozak * 1. Redistributions of source code must retain the above copyright 11 1.1 tshiozak * notice, this list of conditions and the following disclaimer. 12 1.1 tshiozak * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 tshiozak * notice, this list of conditions and the following disclaimer in the 14 1.1 tshiozak * documentation and/or other materials provided with the distribution. 15 1.1 tshiozak * 16 1.1 tshiozak * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.1 tshiozak * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 tshiozak * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 tshiozak * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.1 tshiozak * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 tshiozak * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 tshiozak * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 tshiozak * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 tshiozak * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 tshiozak * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 tshiozak * SUCH DAMAGE. 27 1.1 tshiozak */ 28 1.1 tshiozak 29 1.1 tshiozak #include <sys/cdefs.h> 30 1.1 tshiozak #if defined(LIBC_SCCS) && !defined(lint) 31 1.23 christos __RCSID("$NetBSD: citrus_none.c,v 1.23 2019/07/28 13:52:23 christos Exp $"); 32 1.1 tshiozak #endif /* LIBC_SCCS and not lint */ 33 1.1 tshiozak 34 1.1 tshiozak #include <assert.h> 35 1.1 tshiozak #include <errno.h> 36 1.1 tshiozak #include <string.h> 37 1.1 tshiozak #include <stdio.h> 38 1.1 tshiozak #include <stdlib.h> 39 1.1 tshiozak #include <stddef.h> 40 1.1 tshiozak #include <wchar.h> 41 1.1 tshiozak #include <sys/types.h> 42 1.9 tshiozak 43 1.9 tshiozak #include "citrus_namespace.h" 44 1.9 tshiozak #include "citrus_types.h" 45 1.1 tshiozak #include "citrus_module.h" 46 1.1 tshiozak #include "citrus_ctype.h" 47 1.1 tshiozak #include "citrus_none.h" 48 1.9 tshiozak #include "citrus_stdenc.h" 49 1.1 tshiozak 50 1.1 tshiozak /* ---------------------------------------------------------------------- */ 51 1.1 tshiozak 52 1.1 tshiozak _CITRUS_CTYPE_DECLS(NONE); 53 1.1 tshiozak _CITRUS_CTYPE_DEF_OPS(NONE); 54 1.1 tshiozak 55 1.1 tshiozak 56 1.1 tshiozak /* ---------------------------------------------------------------------- */ 57 1.1 tshiozak 58 1.1 tshiozak static int 59 1.1 tshiozak /*ARGSUSED*/ 60 1.1 tshiozak _citrus_NONE_ctype_init(void ** __restrict cl, void * __restrict var, 61 1.1 tshiozak size_t lenvar, size_t lenps) 62 1.1 tshiozak { 63 1.1 tshiozak *cl = NULL; 64 1.1 tshiozak return (0); 65 1.1 tshiozak } 66 1.1 tshiozak 67 1.1 tshiozak static void 68 1.1 tshiozak /*ARGSUSED*/ 69 1.1 tshiozak _citrus_NONE_ctype_uninit(void *cl) 70 1.1 tshiozak { 71 1.1 tshiozak } 72 1.1 tshiozak 73 1.1 tshiozak static unsigned 74 1.1 tshiozak /*ARGSUSED*/ 75 1.1 tshiozak _citrus_NONE_ctype_get_mb_cur_max(void *cl) 76 1.1 tshiozak { 77 1.1 tshiozak return (1); 78 1.1 tshiozak } 79 1.1 tshiozak 80 1.1 tshiozak static int 81 1.1 tshiozak /*ARGSUSED*/ 82 1.1 tshiozak _citrus_NONE_ctype_mblen(void * __restrict cl, const char * __restrict s, 83 1.1 tshiozak size_t n, int * __restrict nresult) 84 1.1 tshiozak { 85 1.1 tshiozak if (!s) { 86 1.1 tshiozak *nresult = 0; /* state independent */ 87 1.1 tshiozak return (0); 88 1.1 tshiozak } 89 1.1 tshiozak if (n==0) { 90 1.1 tshiozak *nresult = -1; 91 1.1 tshiozak return (EILSEQ); 92 1.1 tshiozak } 93 1.1 tshiozak *nresult = (*s == 0) ? 0 : 1; 94 1.1 tshiozak return (0); 95 1.1 tshiozak } 96 1.1 tshiozak 97 1.1 tshiozak static int 98 1.1 tshiozak /*ARGSUSED*/ 99 1.1 tshiozak _citrus_NONE_ctype_mbrlen(void * __restrict cl, const char * __restrict s, 100 1.1 tshiozak size_t n, void * __restrict pspriv, 101 1.1 tshiozak size_t * __restrict nresult) 102 1.1 tshiozak { 103 1.1 tshiozak if (!s) { 104 1.1 tshiozak *nresult = 0; 105 1.1 tshiozak return (0); 106 1.1 tshiozak } 107 1.1 tshiozak if (n==0) { 108 1.1 tshiozak *nresult = (size_t)-2; 109 1.1 tshiozak return (0); 110 1.1 tshiozak } 111 1.1 tshiozak *nresult = (*s == 0) ? 0 : 1; 112 1.1 tshiozak return (0); 113 1.1 tshiozak } 114 1.1 tshiozak 115 1.1 tshiozak static int 116 1.1 tshiozak /*ARGSUSED*/ 117 1.1 tshiozak _citrus_NONE_ctype_mbrtowc(void * __restrict cl, wchar_t * __restrict pwc, 118 1.1 tshiozak const char * __restrict s, size_t n, 119 1.1 tshiozak void * __restrict pspriv, 120 1.1 tshiozak size_t * __restrict nresult) 121 1.1 tshiozak { 122 1.1 tshiozak if (s == NULL) { 123 1.1 tshiozak *nresult = 0; 124 1.1 tshiozak return (0); 125 1.1 tshiozak } 126 1.1 tshiozak if (n == 0) { 127 1.1 tshiozak *nresult = (size_t)-2; 128 1.1 tshiozak return (0); 129 1.1 tshiozak } 130 1.1 tshiozak 131 1.1 tshiozak if (pwc != NULL) 132 1.1 tshiozak *pwc = (wchar_t)(unsigned char) *s; 133 1.1 tshiozak 134 1.1 tshiozak *nresult = *s == '\0' ? 0 : 1; 135 1.1 tshiozak return (0); 136 1.1 tshiozak } 137 1.1 tshiozak 138 1.1 tshiozak static int 139 1.1 tshiozak /*ARGSUSED*/ 140 1.1 tshiozak _citrus_NONE_ctype_mbsinit(void * __restrict cl, 141 1.1 tshiozak const void * __restrict pspriv, 142 1.1 tshiozak int * __restrict nresult) 143 1.1 tshiozak { 144 1.1 tshiozak *nresult = 1; /* always initial state */ 145 1.1 tshiozak return (0); 146 1.1 tshiozak } 147 1.1 tshiozak 148 1.1 tshiozak static int 149 1.1 tshiozak /*ARGSUSED*/ 150 1.6 yamt _citrus_NONE_ctype_mbsrtowcs(void * __restrict cl, wchar_t * __restrict pwcs, 151 1.1 tshiozak const char ** __restrict s, size_t n, 152 1.1 tshiozak void * __restrict pspriv, 153 1.1 tshiozak size_t * __restrict nresult) 154 1.1 tshiozak { 155 1.6 yamt int cnt; 156 1.1 tshiozak const char *s0; 157 1.1 tshiozak 158 1.6 yamt /* if pwcs is NULL, ignore n */ 159 1.6 yamt if (pwcs == NULL) 160 1.6 yamt n = 1; /* arbitrary >0 value */ 161 1.6 yamt 162 1.6 yamt cnt = 0; 163 1.6 yamt s0 = *s; /* to keep *s unchanged for now, use copy instead. */ 164 1.6 yamt while (n > 0) { 165 1.6 yamt if (pwcs != NULL) { 166 1.6 yamt *pwcs = (wchar_t)(unsigned char)*s0; 167 1.6 yamt } 168 1.1 tshiozak if (*s0 == '\0') { 169 1.1 tshiozak s0 = NULL; 170 1.1 tshiozak break; 171 1.1 tshiozak } 172 1.1 tshiozak s0++; 173 1.6 yamt if (pwcs != NULL) { 174 1.6 yamt pwcs++; 175 1.6 yamt n--; 176 1.6 yamt } 177 1.6 yamt cnt++; 178 1.1 tshiozak } 179 1.6 yamt if (pwcs) 180 1.1 tshiozak *s = s0; 181 1.1 tshiozak 182 1.6 yamt *nresult = (size_t)cnt; 183 1.1 tshiozak 184 1.1 tshiozak return (0); 185 1.1 tshiozak } 186 1.1 tshiozak 187 1.1 tshiozak static int 188 1.19 joerg /*ARGSUSED*/ 189 1.19 joerg _citrus_NONE_ctype_mbsnrtowcs(_citrus_ctype_rec_t * __restrict cc, 190 1.19 joerg wchar_t * __restrict pwcs, 191 1.19 joerg const char ** __restrict s, size_t in, size_t n, 192 1.19 joerg void * __restrict pspriv, 193 1.19 joerg size_t * __restrict nresult) 194 1.19 joerg { 195 1.19 joerg int cnt; 196 1.19 joerg const char *s0; 197 1.19 joerg 198 1.19 joerg /* if pwcs is NULL, ignore n */ 199 1.19 joerg if (pwcs == NULL) 200 1.19 joerg n = 1; /* arbitrary >0 value */ 201 1.19 joerg 202 1.19 joerg cnt = 0; 203 1.19 joerg s0 = *s; /* to keep *s unchanged for now, use copy instead. */ 204 1.19 joerg while (in > 0 && n > 0) { 205 1.19 joerg if (pwcs != NULL) { 206 1.19 joerg *pwcs = (wchar_t)(unsigned char)*s0; 207 1.19 joerg } 208 1.19 joerg if (*s0 == '\0') { 209 1.19 joerg s0 = NULL; 210 1.19 joerg break; 211 1.19 joerg } 212 1.19 joerg s0++; 213 1.19 joerg --in; 214 1.19 joerg if (pwcs != NULL) { 215 1.19 joerg pwcs++; 216 1.19 joerg n--; 217 1.19 joerg } 218 1.19 joerg cnt++; 219 1.19 joerg } 220 1.19 joerg if (pwcs) 221 1.19 joerg *s = s0; 222 1.19 joerg 223 1.19 joerg *nresult = (size_t)cnt; 224 1.19 joerg 225 1.19 joerg return (0); 226 1.19 joerg } 227 1.19 joerg 228 1.19 joerg static int 229 1.1 tshiozak _citrus_NONE_ctype_mbstowcs(void * __restrict cl, wchar_t * __restrict wcs, 230 1.1 tshiozak const char * __restrict s, size_t n, 231 1.1 tshiozak size_t * __restrict nresult) 232 1.1 tshiozak { 233 1.16 christos const char *rs = s; 234 1.17 yamt 235 1.17 yamt return (_citrus_NONE_ctype_mbsrtowcs(cl, wcs, &rs, n, NULL, nresult)); 236 1.1 tshiozak } 237 1.1 tshiozak 238 1.1 tshiozak static int 239 1.2 tshiozak /*ARGSUSED*/ 240 1.1 tshiozak _citrus_NONE_ctype_mbtowc(void * __restrict cl, wchar_t * __restrict pwc, 241 1.1 tshiozak const char * __restrict s, size_t n, 242 1.1 tshiozak int * __restrict nresult) 243 1.1 tshiozak { 244 1.1 tshiozak 245 1.2 tshiozak if (s == NULL) { 246 1.2 tshiozak *nresult = 0; /* state independent */ 247 1.2 tshiozak return (0); 248 1.2 tshiozak } 249 1.2 tshiozak if (n == 0) { 250 1.2 tshiozak return (EILSEQ); 251 1.2 tshiozak } 252 1.2 tshiozak if (pwc == NULL) { 253 1.2 tshiozak if (*s == '\0') { 254 1.2 tshiozak *nresult = 0; 255 1.2 tshiozak } else { 256 1.2 tshiozak *nresult = 1; 257 1.2 tshiozak } 258 1.2 tshiozak return (0); 259 1.2 tshiozak } 260 1.1 tshiozak 261 1.13 christos *pwc = (wchar_t)(unsigned char)*s; 262 1.2 tshiozak *nresult = *s == '\0' ? 0 : 1; 263 1.1 tshiozak 264 1.2 tshiozak return (0); 265 1.1 tshiozak } 266 1.1 tshiozak 267 1.1 tshiozak static int 268 1.1 tshiozak /*ARGSUSED*/ 269 1.1 tshiozak _citrus_NONE_ctype_wcrtomb(void * __restrict cl, char * __restrict s, 270 1.1 tshiozak wchar_t wc, void * __restrict pspriv, 271 1.1 tshiozak size_t * __restrict nresult) 272 1.1 tshiozak { 273 1.1 tshiozak if ((wc&~0xFFU) != 0) { 274 1.1 tshiozak *nresult = (size_t)-1; 275 1.1 tshiozak return (EILSEQ); 276 1.1 tshiozak } 277 1.1 tshiozak 278 1.1 tshiozak *nresult = 1; 279 1.1 tshiozak if (s!=NULL) 280 1.1 tshiozak *s = (char)wc; 281 1.1 tshiozak 282 1.1 tshiozak return (0); 283 1.1 tshiozak } 284 1.1 tshiozak 285 1.1 tshiozak static int 286 1.1 tshiozak /*ARGSUSED*/ 287 1.1 tshiozak _citrus_NONE_ctype_wcsrtombs(void * __restrict cl, char * __restrict s, 288 1.1 tshiozak const wchar_t ** __restrict pwcs, size_t n, 289 1.1 tshiozak void * __restrict pspriv, 290 1.1 tshiozak size_t * __restrict nresult) 291 1.1 tshiozak { 292 1.1 tshiozak size_t count; 293 1.1 tshiozak const wchar_t *pwcs0; 294 1.1 tshiozak 295 1.1 tshiozak pwcs0 = *pwcs; 296 1.1 tshiozak count = 0; 297 1.4 yamt 298 1.4 yamt if (s == NULL) 299 1.4 yamt n = 1; 300 1.4 yamt 301 1.4 yamt while (n > 0) { 302 1.1 tshiozak if ((*pwcs0 & ~0xFFU) != 0) { 303 1.23 christos *pwcs = pwcs0; 304 1.4 yamt *nresult = (size_t)-1; 305 1.1 tshiozak return (EILSEQ); 306 1.1 tshiozak } 307 1.4 yamt if (s != NULL) { 308 1.1 tshiozak *s++ = (char)*pwcs0; 309 1.4 yamt n--; 310 1.4 yamt } 311 1.1 tshiozak if (*pwcs0 == L'\0') { 312 1.1 tshiozak pwcs0 = NULL; 313 1.1 tshiozak break; 314 1.1 tshiozak } 315 1.1 tshiozak count++; 316 1.1 tshiozak pwcs0++; 317 1.1 tshiozak } 318 1.1 tshiozak if (s != NULL) 319 1.1 tshiozak *pwcs = pwcs0; 320 1.1 tshiozak 321 1.1 tshiozak *nresult = count; 322 1.1 tshiozak 323 1.1 tshiozak return (0); 324 1.1 tshiozak } 325 1.1 tshiozak 326 1.1 tshiozak static int 327 1.19 joerg /*ARGSUSED*/ 328 1.19 joerg _citrus_NONE_ctype_wcsnrtombs(_citrus_ctype_rec_t * __restrict cc, 329 1.19 joerg char * __restrict s, 330 1.19 joerg const wchar_t ** __restrict pwcs, size_t in, 331 1.19 joerg size_t n, void * __restrict pspriv, 332 1.19 joerg size_t * __restrict nresult) 333 1.19 joerg { 334 1.19 joerg size_t count; 335 1.19 joerg const wchar_t *pwcs0; 336 1.19 joerg 337 1.19 joerg pwcs0 = *pwcs; 338 1.19 joerg count = 0; 339 1.19 joerg 340 1.19 joerg if (s == NULL) 341 1.19 joerg n = 1; 342 1.19 joerg 343 1.19 joerg while (in > 0 && n > 0) { 344 1.19 joerg if ((*pwcs0 & ~0xFFU) != 0) { 345 1.19 joerg *nresult = (size_t)-1; 346 1.19 joerg return (EILSEQ); 347 1.19 joerg } 348 1.19 joerg if (s != NULL) { 349 1.19 joerg *s++ = (char)*pwcs0; 350 1.19 joerg n--; 351 1.19 joerg } 352 1.19 joerg if (*pwcs0 == L'\0') { 353 1.19 joerg pwcs0 = NULL; 354 1.19 joerg break; 355 1.19 joerg } 356 1.19 joerg count++; 357 1.19 joerg pwcs0++; 358 1.19 joerg --in; 359 1.19 joerg } 360 1.19 joerg if (s != NULL) 361 1.19 joerg *pwcs = pwcs0; 362 1.19 joerg 363 1.19 joerg *nresult = count; 364 1.19 joerg 365 1.19 joerg return (0); 366 1.19 joerg } 367 1.19 joerg 368 1.19 joerg static int 369 1.1 tshiozak _citrus_NONE_ctype_wcstombs(void * __restrict cl, char * __restrict s, 370 1.1 tshiozak const wchar_t * __restrict pwcs, size_t n, 371 1.1 tshiozak size_t * __restrict nresult) 372 1.1 tshiozak { 373 1.16 christos const wchar_t *rpwcs = pwcs; 374 1.17 yamt 375 1.17 yamt return (_citrus_NONE_ctype_wcsrtombs(cl, s, &rpwcs, n, NULL, nresult)); 376 1.1 tshiozak } 377 1.1 tshiozak 378 1.1 tshiozak static int 379 1.1 tshiozak _citrus_NONE_ctype_wctomb(void * __restrict cl, char * __restrict s, 380 1.1 tshiozak wchar_t wc, int * __restrict nresult) 381 1.1 tshiozak { 382 1.1 tshiozak int ret; 383 1.1 tshiozak size_t nr; 384 1.7 yamt 385 1.7 yamt if (s == 0) { 386 1.7 yamt /* 387 1.7 yamt * initialize state here. 388 1.7 yamt * (nothing to do for us.) 389 1.7 yamt */ 390 1.7 yamt *nresult = 0; /* we're state independent */ 391 1.7 yamt return (0); 392 1.7 yamt } 393 1.1 tshiozak 394 1.1 tshiozak ret = _citrus_NONE_ctype_wcrtomb(cl, s, wc, NULL, &nr); 395 1.1 tshiozak *nresult = (int)nr; 396 1.1 tshiozak 397 1.1 tshiozak return (ret); 398 1.8 tshiozak } 399 1.8 tshiozak 400 1.8 tshiozak static int 401 1.8 tshiozak /*ARGSUSED*/ 402 1.8 tshiozak _citrus_NONE_ctype_btowc(_citrus_ctype_rec_t * __restrict cc, 403 1.8 tshiozak int c, wint_t * __restrict wcresult) 404 1.8 tshiozak { 405 1.8 tshiozak if (c == EOF || c & ~0xFF) 406 1.8 tshiozak *wcresult = WEOF; 407 1.8 tshiozak else 408 1.8 tshiozak *wcresult = (wint_t)c; 409 1.8 tshiozak return (0); 410 1.8 tshiozak } 411 1.8 tshiozak 412 1.8 tshiozak static int 413 1.8 tshiozak /*ARGSUSED*/ 414 1.8 tshiozak _citrus_NONE_ctype_wctob(_citrus_ctype_rec_t * __restrict cc, 415 1.8 tshiozak wint_t wc, int * __restrict cresult) 416 1.8 tshiozak { 417 1.8 tshiozak if (wc == WEOF || wc & ~0xFF) 418 1.8 tshiozak *cresult = EOF; 419 1.8 tshiozak else 420 1.8 tshiozak *cresult = (int)wc; 421 1.9 tshiozak return (0); 422 1.9 tshiozak } 423 1.9 tshiozak 424 1.9 tshiozak /* ---------------------------------------------------------------------- */ 425 1.9 tshiozak 426 1.9 tshiozak _CITRUS_STDENC_DECLS(NONE); 427 1.9 tshiozak _CITRUS_STDENC_DEF_OPS(NONE); 428 1.9 tshiozak struct _citrus_stdenc_traits _citrus_NONE_stdenc_traits = { 429 1.9 tshiozak 0, /* et_state_size */ 430 1.9 tshiozak 1, /* mb_cur_max */ 431 1.9 tshiozak }; 432 1.9 tshiozak 433 1.9 tshiozak static int 434 1.9 tshiozak /*ARGSUSED*/ 435 1.9 tshiozak _citrus_NONE_stdenc_init(struct _citrus_stdenc * __restrict ce, 436 1.9 tshiozak const void *var, size_t lenvar, 437 1.9 tshiozak struct _citrus_stdenc_traits * __restrict et) 438 1.9 tshiozak { 439 1.9 tshiozak 440 1.9 tshiozak et->et_state_size = 0; 441 1.9 tshiozak et->et_mb_cur_max = 1; 442 1.9 tshiozak 443 1.9 tshiozak ce->ce_closure = NULL; 444 1.9 tshiozak 445 1.9 tshiozak return (0); 446 1.9 tshiozak } 447 1.9 tshiozak 448 1.9 tshiozak static void 449 1.9 tshiozak /*ARGSUSED*/ 450 1.9 tshiozak _citrus_NONE_stdenc_uninit(struct _citrus_stdenc *ce) 451 1.9 tshiozak { 452 1.9 tshiozak } 453 1.9 tshiozak 454 1.9 tshiozak static int 455 1.9 tshiozak /*ARGSUSED*/ 456 1.9 tshiozak _citrus_NONE_stdenc_init_state(struct _citrus_stdenc * __restrict ce, 457 1.9 tshiozak void * __restrict ps) 458 1.9 tshiozak { 459 1.9 tshiozak return (0); 460 1.9 tshiozak } 461 1.9 tshiozak 462 1.9 tshiozak static int 463 1.9 tshiozak /*ARGSUSED*/ 464 1.9 tshiozak _citrus_NONE_stdenc_mbtocs(struct _citrus_stdenc * __restrict ce, 465 1.9 tshiozak _csid_t *csid, _index_t *idx, 466 1.9 tshiozak const char **s, size_t n, 467 1.9 tshiozak void *ps, size_t *nresult) 468 1.9 tshiozak { 469 1.9 tshiozak 470 1.9 tshiozak _DIAGASSERT(csid != NULL && idx != NULL); 471 1.9 tshiozak 472 1.9 tshiozak if (n<1) { 473 1.9 tshiozak *nresult = (size_t)-2; 474 1.9 tshiozak return (0); 475 1.9 tshiozak } 476 1.9 tshiozak 477 1.9 tshiozak *csid = 0; 478 1.9 tshiozak *idx = (_index_t)(unsigned char)*(*s)++; 479 1.9 tshiozak *nresult = *idx == 0 ? 0 : 1; 480 1.9 tshiozak 481 1.9 tshiozak return (0); 482 1.9 tshiozak } 483 1.9 tshiozak 484 1.9 tshiozak static int 485 1.9 tshiozak /*ARGSUSED*/ 486 1.9 tshiozak _citrus_NONE_stdenc_cstomb(struct _citrus_stdenc * __restrict ce, 487 1.9 tshiozak char *s, size_t n, 488 1.9 tshiozak _csid_t csid, _index_t idx, 489 1.9 tshiozak void *ps, size_t *nresult) 490 1.9 tshiozak { 491 1.9 tshiozak 492 1.9 tshiozak if (csid == _CITRUS_CSID_INVALID) { 493 1.9 tshiozak *nresult = 0; 494 1.9 tshiozak return (0); 495 1.9 tshiozak } 496 1.9 tshiozak if (n<1) { 497 1.11 yamt *nresult = (size_t)-1; 498 1.11 yamt return (E2BIG); 499 1.9 tshiozak } 500 1.9 tshiozak if (csid != 0 || (idx&0xFF) != idx) 501 1.9 tshiozak return (EILSEQ); 502 1.9 tshiozak 503 1.9 tshiozak *s = (char)idx; 504 1.9 tshiozak *nresult = 1; 505 1.9 tshiozak 506 1.9 tshiozak return (0); 507 1.9 tshiozak } 508 1.9 tshiozak 509 1.9 tshiozak static int 510 1.9 tshiozak /*ARGSUSED*/ 511 1.9 tshiozak _citrus_NONE_stdenc_mbtowc(struct _citrus_stdenc * __restrict ce, 512 1.9 tshiozak _wc_t * __restrict pwc, 513 1.9 tshiozak const char ** __restrict s, size_t n, 514 1.9 tshiozak void * __restrict pspriv, 515 1.9 tshiozak size_t * __restrict nresult) 516 1.9 tshiozak { 517 1.22 christos 518 1.22 christos _DIAGASSERT(s != NULL); 519 1.22 christos 520 1.22 christos if (*s == NULL) { 521 1.9 tshiozak *nresult = 0; 522 1.9 tshiozak return (0); 523 1.9 tshiozak } 524 1.9 tshiozak if (n == 0) { 525 1.9 tshiozak *nresult = (size_t)-2; 526 1.9 tshiozak return (0); 527 1.9 tshiozak } 528 1.9 tshiozak 529 1.9 tshiozak if (pwc != NULL) 530 1.9 tshiozak *pwc = (_wc_t)(unsigned char) **s; 531 1.9 tshiozak 532 1.21 joerg *nresult = **s == '\0' ? 0 : 1; 533 1.9 tshiozak return (0); 534 1.9 tshiozak } 535 1.9 tshiozak 536 1.9 tshiozak static int 537 1.9 tshiozak /*ARGSUSED*/ 538 1.9 tshiozak _citrus_NONE_stdenc_wctomb(struct _citrus_stdenc * __restrict ce, 539 1.9 tshiozak char * __restrict s, size_t n, 540 1.9 tshiozak _wc_t wc, void * __restrict pspriv, 541 1.9 tshiozak size_t * __restrict nresult) 542 1.9 tshiozak { 543 1.9 tshiozak if ((wc&~0xFFU) != 0) { 544 1.9 tshiozak *nresult = (size_t)-1; 545 1.9 tshiozak return (EILSEQ); 546 1.9 tshiozak } 547 1.9 tshiozak if (n==0) { 548 1.12 yamt *nresult = (size_t)-1; 549 1.12 yamt return (E2BIG); 550 1.9 tshiozak } 551 1.9 tshiozak 552 1.9 tshiozak *nresult = 1; 553 1.9 tshiozak if (s!=NULL && n>0) 554 1.9 tshiozak *s = (char)wc; 555 1.10 tshiozak 556 1.10 tshiozak return (0); 557 1.10 tshiozak } 558 1.10 tshiozak 559 1.10 tshiozak static int 560 1.10 tshiozak /*ARGSUSED*/ 561 1.10 tshiozak _citrus_NONE_stdenc_put_state_reset(struct _citrus_stdenc * __restrict ce, 562 1.10 tshiozak char * __restrict s, size_t n, 563 1.10 tshiozak void * __restrict pspriv, 564 1.10 tshiozak size_t * __restrict nresult) 565 1.10 tshiozak { 566 1.10 tshiozak 567 1.10 tshiozak *nresult = 0; 568 1.9 tshiozak 569 1.8 tshiozak return (0); 570 1.1 tshiozak } 571 1.14 tshiozak 572 1.14 tshiozak static int 573 1.14 tshiozak /*ARGSUSED*/ 574 1.14 tshiozak _citrus_NONE_stdenc_get_state_desc(struct _stdenc * __restrict ce, 575 1.14 tshiozak void * __restrict ps, 576 1.14 tshiozak int id, 577 1.14 tshiozak struct _stdenc_state_desc * __restrict d) 578 1.14 tshiozak { 579 1.15 martin int ret = 0; 580 1.14 tshiozak 581 1.14 tshiozak switch (id) { 582 1.14 tshiozak case _STDENC_SDID_GENERIC: 583 1.14 tshiozak d->u.generic.state = _STDENC_SDGEN_INITIAL; 584 1.14 tshiozak break; 585 1.14 tshiozak default: 586 1.14 tshiozak ret = EOPNOTSUPP; 587 1.14 tshiozak } 588 1.14 tshiozak 589 1.14 tshiozak return ret; 590 1.14 tshiozak } 591