locales: Enforce US-ASCII encoding (limited to 7-bit)

The US-ASCII format was getting treated identically to POSIX.  It is
supposed to throw an ILSEQ errno if a value of 0x80 or greater is
encountered, so let's bring back the "ASCII" handling.

While here, change nl_codeset to return US-ASCII only when the encoding
really is "US-ASCII".  Before "C" and "POSIX" encoding returned this
string, so now they return "POSIX".

Discussed with:	ache
Submitted by:	marino
Obtained from:	DragonflyBSD
This commit is contained in:
Baptiste Daroussin 2015-11-09 22:06:22 +00:00
parent e8334c9780
commit 473aa0b7ee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=290618
4 changed files with 7 additions and 2 deletions

View File

@ -4,7 +4,7 @@
# locale sources
.PATH: ${LIBC_SRCTOP}/${LIBC_ARCH}/locale ${LIBC_SRCTOP}/locale
SRCS+= big5.c btowc.c collate.c collcmp.c euc.c fix_grouping.c \
SRCS+= ascii.c big5.c btowc.c collate.c collcmp.c euc.c fix_grouping.c \
gb18030.c gb2312.c gbk.c ctype.c isctype.c iswctype.c \
ldpart.c lmessages.c lmonetary.c lnumeric.c localeconv.c mblen.c \
mbrlen.c \

View File

@ -76,6 +76,7 @@ int _GB2312_init(struct xlocale_ctype *, _RuneLocale *);
int _GBK_init(struct xlocale_ctype *, _RuneLocale *);
int _BIG5_init(struct xlocale_ctype *, _RuneLocale *);
int _MSKanji_init(struct xlocale_ctype *, _RuneLocale *);
int _ascii_init(struct xlocale_ctype *, _RuneLocale *);
typedef size_t (*mbrtowc_pfn_t)(wchar_t * __restrict,
const char * __restrict, size_t, mbstate_t * __restrict);

View File

@ -71,6 +71,8 @@ nl_langinfo_l(nl_item item, locale_t loc)
else if (strcmp(s, "MSKanji") == 0)
ret = "SJIS";
else if (strcmp(s, "NONE") == 0)
ret = "POSIX";
else if (strcmp(s, "NONE:US-ASCII") == 0)
ret = "US-ASCII";
else if (strncmp(s, "NONE:", 5) == 0)
ret = (char *)(s + 5);

View File

@ -129,7 +129,9 @@ __setrunelocale(struct xlocale_ctype *l, const char *encoding)
rl->__sputrune = NULL;
rl->__sgetrune = NULL;
if (strncmp(rl->__encoding, "NONE", 4) == 0)
if (strcmp(rl->__encoding, "NONE:US-ASCII") == 0)
ret = _ascii_init(l, rl);
else if (strncmp(rl->__encoding, "NONE", 4) == 0)
ret = _none_init(l, rl);
else if (strcmp(rl->__encoding, "UTF-8") == 0)
ret = _UTF8_init(l, rl);