Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/gbk.c
/*- | /*- | ||||
* Copyright 2013 Garrett D'Amore <garrett@damore.org> | |||||
* Copyright 2010 Nexenta Systems, Inc. All rights reserved. | |||||
* Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved. | * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved. | ||||
* Copyright (c) 1993 | * Copyright (c) 1993 | ||||
* The Regents of the University of California. All rights reserved. | * The Regents of the University of California. All rights reserved. | ||||
* | * | ||||
* This code is derived from software contributed to Berkeley by | * This code is derived from software contributed to Berkeley by | ||||
* Paul Borman at Krystal Technologies. | * Paul Borman at Krystal Technologies. | ||||
* | * | ||||
* Copyright (c) 2011 The FreeBSD Foundation | * Copyright (c) 2011 The FreeBSD Foundation | ||||
Show All 39 Lines | |||||
extern int __mb_sb_limit; | extern int __mb_sb_limit; | ||||
static size_t _GBK_mbrtowc(wchar_t * __restrict, const char * __restrict, | static size_t _GBK_mbrtowc(wchar_t * __restrict, const char * __restrict, | ||||
size_t, mbstate_t * __restrict); | size_t, mbstate_t * __restrict); | ||||
static int _GBK_mbsinit(const mbstate_t *); | static int _GBK_mbsinit(const mbstate_t *); | ||||
static size_t _GBK_wcrtomb(char * __restrict, wchar_t, | static size_t _GBK_wcrtomb(char * __restrict, wchar_t, | ||||
mbstate_t * __restrict); | mbstate_t * __restrict); | ||||
static size_t _GBK_mbsnrtowcs(wchar_t * __restrict, | |||||
const char ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _GBK_wcsnrtombs(char * __restrict, | |||||
const wchar_t ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
typedef struct { | typedef struct { | ||||
wchar_t ch; | wchar_t ch; | ||||
} _GBKState; | } _GBKState; | ||||
int | int | ||||
_GBK_init(struct xlocale_ctype *l, _RuneLocale *rl) | _GBK_init(struct xlocale_ctype *l, _RuneLocale *rl) | ||||
{ | { | ||||
l->__mbrtowc = _GBK_mbrtowc; | l->__mbrtowc = _GBK_mbrtowc; | ||||
l->__wcrtomb = _GBK_wcrtomb; | l->__wcrtomb = _GBK_wcrtomb; | ||||
l->__mbsinit = _GBK_mbsinit; | l->__mbsinit = _GBK_mbsinit; | ||||
l->__mbsnrtowcs = _GBK_mbsnrtowcs; | |||||
l->__wcsnrtombs = _GBK_wcsnrtombs; | |||||
l->runes = rl; | l->runes = rl; | ||||
l->__mb_cur_max = 2; | l->__mb_cur_max = 2; | ||||
l->__mb_sb_limit = 128; | l->__mb_sb_limit = 128; | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
_GBK_mbsinit(const mbstate_t *ps) | _GBK_mbsinit(const mbstate_t *ps) | ||||
{ | { | ||||
return (ps == NULL || ((const _GBKState *)ps)->ch == 0); | return (ps == NULL || ((const _GBKState *)ps)->ch == 0); | ||||
} | } | ||||
static __inline int | static int | ||||
_gbk_check(u_int c) | _gbk_check(u_int c) | ||||
{ | { | ||||
c &= 0xff; | c &= 0xff; | ||||
return ((c >= 0x81 && c <= 0xfe) ? 2 : 1); | return ((c >= 0x81 && c <= 0xfe) ? 2 : 1); | ||||
} | } | ||||
static size_t | static size_t | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | if (len == 2) { | ||||
} | } | ||||
if (*s == '\0') { | if (*s == '\0') { | ||||
errno = EILSEQ; | errno = EILSEQ; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
wc = (wc << 8) | (*s++ & 0xff); | wc = (wc << 8) | (*s++ & 0xff); | ||||
if (pwc != NULL) | if (pwc != NULL) | ||||
*pwc = wc; | *pwc = wc; | ||||
return (2); | return (2); | ||||
} else { | } else { | ||||
if (pwc != NULL) | if (pwc != NULL) | ||||
*pwc = wc; | *pwc = wc; | ||||
return (wc == L'\0' ? 0 : 1); | return (wc == L'\0' ? 0 : 1); | ||||
} | } | ||||
} | } | ||||
static size_t | static size_t | ||||
Show All 13 Lines | if (s == NULL) | ||||
return (1); | return (1); | ||||
if (wc & 0x8000) { | if (wc & 0x8000) { | ||||
*s++ = (wc >> 8) & 0xff; | *s++ = (wc >> 8) & 0xff; | ||||
*s = wc & 0xff; | *s = wc & 0xff; | ||||
return (2); | return (2); | ||||
} | } | ||||
*s = wc & 0xff; | *s = wc & 0xff; | ||||
return (1); | return (1); | ||||
} | |||||
static size_t | |||||
_GBK_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src, | |||||
size_t nms, size_t len, mbstate_t * __restrict ps) | |||||
{ | |||||
return (__mbsnrtowcs_std(dst, src, nms, len, ps, _GBK_mbrtowc)); | |||||
} | |||||
static size_t | |||||
_GBK_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, | |||||
size_t nwc, size_t len, mbstate_t * __restrict ps) | |||||
{ | |||||
return (__wcsnrtombs_std(dst, src, nwc, len, ps, _GBK_wcrtomb)); | |||||
} | } |