X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..4c63d2152434d7a24cd627ef559f93b096274076:/locale/FreeBSD/none.c diff --git a/locale/FreeBSD/none.c b/locale/FreeBSD/none.c index 2fd072d..c3c75cf 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. * @@ -13,10 +14,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -38,62 +35,137 @@ 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.15 2007/10/13 16:28:22 ache Exp $"); +#include "xlocale_private.h" + +#include #include +#include #include #include -#include #include +#include +#include +#include "mblocal.h" + +/* setup defaults */ -rune_t _none_sgetrune(const char *, size_t, char const **); -int _none_sputrune(rune_t, char *, size_t, char **); +int __mb_cur_max = 1; +int __mb_sb_limit = 256; /* Expected to be <= _CACHED_RUNES */ -int -_none_init(rl) - _RuneLocale *rl; +__private_extern__ int +_none_init(struct __xlocale_st_runelocale *xrl) { - rl->sgetrune = _none_sgetrune; - rl->sputrune = _none_sputrune; - _CurrentRuneLocale = rl; - __mb_cur_max = 1; + + xrl->__mbrtowc = _none_mbrtowc; + xrl->__mbsinit = _none_mbsinit; + xrl->__mbsnrtowcs = _none_mbsnrtowcs; + xrl->__wcrtomb = _none_wcrtomb; + xrl->__wcsnrtombs = _none_wcsnrtombs; + xrl->__mb_cur_max = 1; + xrl->__mb_sb_limit = 256; return(0); } -rune_t -_none_sgetrune(string, n, result) - const char *string; - size_t n; - char const **result; +__private_extern__ int +_none_mbsinit(const mbstate_t *ps __unused, locale_t loc __unused) +{ + + /* + * Encoding is not state dependent - we are always in the + * initial state. + */ + return (1); +} + +__private_extern__ size_t +_none_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, + mbstate_t * __restrict ps __unused, locale_t loc __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); +} + +__private_extern__ size_t +_none_wcrtomb(char * __restrict s, wchar_t wc, + mbstate_t * __restrict ps __unused, locale_t loc __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); + } + *s = (unsigned char)wc; + return (1); +} + +__private_extern__ size_t +_none_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src, + size_t nms, size_t len, mbstate_t * __restrict ps __unused, locale_t loc __unused) { - if (n < 1) { - if (result) - *result = string; - return(_INVALID_RUNE); + 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++; } - if (result) - *result = string + 1; - return(*string & 0xff); + *src = s; + return (nchr); } -int -_none_sputrune(c, string, n, result) - rune_t c; - char *string, **result; - size_t n; +__private_extern__ size_t +_none_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, + size_t nwc, size_t len, mbstate_t * __restrict ps __unused, locale_t loc __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); }