X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..fbd86d4cc20b02a10edcca92fb7ae0a143e63cc4:/locale/FreeBSD/none.c diff --git a/locale/FreeBSD/none.c b/locale/FreeBSD/none.c index 2fd072d..0514bc4 100644 --- a/locale/FreeBSD/none.c +++ b/locale/FreeBSD/none.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved. * Copyright (c) 1993 * The Regents of the University of California. All rights reserved. * @@ -38,62 +39,141 @@ static char sccsid[] = "@(#)none.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include -__FBSDID("$FreeBSD: src/lib/libc/locale/none.c,v 1.6 2002/10/16 11:37:38 tjr Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/locale/none.c,v 1.12 2004/07/21 10:54:57 tjr Exp $"); +#include #include +#include #include #include -#include #include +#include +#include +#include "mblocal.h" -rune_t _none_sgetrune(const char *, size_t, char const **); -int _none_sputrune(rune_t, char *, size_t, char **); +int _none_init(_RuneLocale *); +size_t _none_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t, + mbstate_t * __restrict); +int _none_mbsinit(const mbstate_t *); +size_t _none_mbsnrtowcs(wchar_t * __restrict dst, + const char ** __restrict src, size_t nms, size_t len, + mbstate_t * __restrict ps __unused); +size_t _none_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict); +size_t _none_wcsnrtombs(char * __restrict, const wchar_t ** __restrict, + size_t, size_t, mbstate_t * __restrict); int -_none_init(rl) - _RuneLocale *rl; +_none_init(_RuneLocale *rl) { - rl->sgetrune = _none_sgetrune; - rl->sputrune = _none_sputrune; + + __mbrtowc = _none_mbrtowc; + __mbsinit = _none_mbsinit; + __mbsnrtowcs = _none_mbsnrtowcs; + __wcrtomb = _none_wcrtomb; + __wcsnrtombs = _none_wcsnrtombs; _CurrentRuneLocale = rl; __mb_cur_max = 1; return(0); } -rune_t -_none_sgetrune(string, n, result) - const char *string; - size_t n; - char const **result; +int +_none_mbsinit(const mbstate_t *ps __unused) { - if (n < 1) { - if (result) - *result = string; - return(_INVALID_RUNE); + + /* + * Encoding is not state dependent - we are always in the + * initial state. + */ + return (1); +} + +size_t +_none_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, + mbstate_t * __restrict ps __unused) +{ + + if (s == NULL) + /* Reset to initial shift state (no-op) */ + return (0); + if (n == 0) + /* Incomplete multibyte sequence */ + return ((size_t)-2); + if (pwc != NULL) + *pwc = (unsigned char)*s; + return (*s == '\0' ? 0 : 1); +} + +size_t +_none_wcrtomb(char * __restrict s, wchar_t wc, + mbstate_t * __restrict ps __unused) +{ + + if (s == NULL) + /* Reset to initial shift state (no-op) */ + return (1); + if (wc < 0 || wc > UCHAR_MAX) { + errno = EILSEQ; + return ((size_t)-1); } - if (result) - *result = string + 1; - return(*string & 0xff); + *s = (unsigned char)wc; + return (1); } -int -_none_sputrune(c, string, n, result) - rune_t c; - char *string, **result; - size_t n; +size_t +_none_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src, + size_t nms, size_t len, mbstate_t * __restrict ps __unused) +{ + const char *s; + size_t nchr; + + if (dst == NULL) { + s = memchr(*src, '\0', nms); + return (s != NULL ? s - *src : nms); + } + + s = *src; + nchr = 0; + while (len-- > 0 && nms-- > 0) { + if ((*dst++ = (unsigned char)*s++) == L'\0') { + *src = NULL; + return (nchr); + } + nchr++; + } + *src = s; + return (nchr); +} + +size_t +_none_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, + size_t nwc, size_t len, mbstate_t * __restrict ps __unused) { - if (n >= 1) { - if (string) { - if (c < 0 || c > UCHAR_MAX) { - if (result) - *result = NULL; - return (0); + const wchar_t *s; + size_t nchr; + + if (dst == NULL) { + for (s = *src; nwc > 0 && *s != L'\0'; s++, nwc--) { + if (*s < 0 || *s > UCHAR_MAX) { + errno = EILSEQ; + return ((size_t)-1); } - *string = c; } - if (result) - *result = string + 1; - } else if (result) - *result = (char *)0; - return(1); + return (s - *src); + } + + s = *src; + nchr = 0; + while (len-- > 0 && nwc-- > 0) { + if (*s < 0 || *s > UCHAR_MAX) { + errno = EILSEQ; + return ((size_t)-1); + } + if ((*dst++ = *s++) == '\0') { + *src = NULL; + return (nchr); + } + nchr++; + } + *src = s; + return (nchr); }