Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/euc.c
/*- | /*- | ||||
* Copyright 2013 Garrett D'Amore <garrett@damore.org> | |||||
* Copyright 2011 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 | ||||
* All rights reserved. | * All rights reserved. | ||||
* Portions of this software were developed by David Chisnall | * Portions of this software were developed by David Chisnall | ||||
* under sponsorship from the FreeBSD Foundation. | * under sponsorship from the FreeBSD Foundation. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
* modification, are permitted provided that the following conditions | * modification, are permitted provided that the following conditions | ||||
* are met: | * are met: | ||||
* 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
* notice, this list of conditions and the following disclaimer. | * notice, this list of conditions and the following disclaimer. | ||||
* 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | ||||
* notice, this list of conditions and the following disclaimer in the | * notice, this list of conditions and the following disclaimer in the | ||||
* documentation and/or other materials provided with the distribution. | * documentation and/or other materials provided with the distribution. | ||||
* 3. All advertising materials mentioning features or use of this software | * 3. Neither the name of the University nor the names of its contributors | ||||
theraven: We have permission from UCB to remove this clause, do we have permission from the other… | |||||
Not Done Inline ActionsI am checking with Garrett from Illumos: bapt: I am checking with Garrett from Illumos:
https://github.com/illumos/illumos… | |||||
Not Done Inline ActionsWe don't have permission from Tim J Robbins and email to him bounces back. pfg: We don't have permission from Tim J Robbins and email to him bounces back. | |||||
Not Done Inline ActionsGarrett believes he got the permssion, but he does not have access to the mail anymore bapt: Garrett believes he got the permssion, but he does not have access to the mail anymore
What… | |||||
* 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 | * may be used to endorse or promote products derived from this software | ||||
* without specific prior written permission. | * without specific prior written permission. | ||||
* | * | ||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
Show All 16 Lines | |||||
#include <runetype.h> | #include <runetype.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <wchar.h> | #include <wchar.h> | ||||
#include "mblocal.h" | #include "mblocal.h" | ||||
extern int __mb_sb_limit; | extern int __mb_sb_limit; | ||||
static size_t _EUC_mbrtowc(wchar_t * __restrict, const char * __restrict, | static size_t _EUC_mbrtowc_impl(wchar_t * __restrict, const char * __restrict, | ||||
size_t, mbstate_t * __restrict, uint8_t, uint8_t, uint8_t, uint8_t); | |||||
static size_t _EUC_wcrtomb_impl(char * __restrict, wchar_t, | |||||
mbstate_t * __restrict, uint8_t, uint8_t, uint8_t, uint8_t); | |||||
static size_t _EUC_CN_mbrtowc(wchar_t * __restrict, const char * __restrict, | |||||
size_t, mbstate_t * __restrict); | size_t, mbstate_t * __restrict); | ||||
static int _EUC_mbsinit(const mbstate_t *); | static size_t _EUC_JP_mbrtowc(wchar_t * __restrict, const char * __restrict, | ||||
static size_t _EUC_wcrtomb(char * __restrict, wchar_t, | size_t, mbstate_t * __restrict); | ||||
static size_t _EUC_KR_mbrtowc(wchar_t * __restrict, const char * __restrict, | |||||
size_t, mbstate_t * __restrict); | |||||
static size_t _EUC_TW_mbrtowc(wchar_t * __restrict, const char * __restrict, | |||||
size_t, mbstate_t * __restrict); | |||||
static size_t _EUC_CN_wcrtomb(char * __restrict, wchar_t, | |||||
mbstate_t * __restrict); | mbstate_t * __restrict); | ||||
static size_t _EUC_JP_wcrtomb(char * __restrict, wchar_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_KR_wcrtomb(char * __restrict, wchar_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_TW_wcrtomb(char * __restrict, wchar_t, | |||||
mbstate_t * __restrict); | |||||
typedef struct { | static size_t _EUC_CN_mbsnrtowcs(wchar_t * __restrict, | ||||
int count[4]; | const char ** __restrict, size_t, size_t, | ||||
wchar_t bits[4]; | mbstate_t * __restrict); | ||||
wchar_t mask; | static size_t _EUC_JP_mbsnrtowcs(wchar_t * __restrict, | ||||
} _EucInfo; | const char ** __restrict, size_t, size_t, | ||||
mbstate_t * __restrict); | |||||
static size_t _EUC_KR_mbsnrtowcs(wchar_t * __restrict, | |||||
const char ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_TW_mbsnrtowcs(wchar_t * __restrict, | |||||
const char ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_CN_wcsnrtombs(char * __restrict, | |||||
const wchar_t ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_JP_wcsnrtombs(char * __restrict, | |||||
const wchar_t ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_KR_wcsnrtombs(char * __restrict, | |||||
const wchar_t ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static size_t _EUC_TW_wcsnrtombs(char * __restrict, | |||||
const wchar_t ** __restrict, size_t, size_t, | |||||
mbstate_t * __restrict); | |||||
static int _EUC_mbsinit(const mbstate_t *); | |||||
typedef struct { | typedef struct { | ||||
wchar_t ch; | wchar_t ch; | ||||
int set; | int set; | ||||
int want; | int want; | ||||
} _EucState; | } _EucState; | ||||
static int | |||||
_EUC_mbsinit(const mbstate_t *ps) | |||||
{ | |||||
return (ps == NULL || ((const _EucState *)ps)->want == 0); | |||||
} | |||||
/* | |||||
* EUC-CN uses CS0, CS1 and CS2 (4 bytes). | |||||
*/ | |||||
int | int | ||||
_EUC_init(struct xlocale_ctype *l, _RuneLocale *rl) | _EUC_CN_init(struct xlocale_ctype *l, _RuneLocale *rl) | ||||
{ | { | ||||
_EucInfo *ei; | l->__mbrtowc = _EUC_CN_mbrtowc; | ||||
int x, new__mb_cur_max; | l->__wcrtomb = _EUC_CN_wcrtomb; | ||||
char *v, *e; | l->__mbsnrtowcs = _EUC_CN_mbsnrtowcs; | ||||
l->__wcsnrtombs = _EUC_CN_wcsnrtombs; | |||||
l->__mbsinit = _EUC_mbsinit; | |||||
if (rl->__variable == NULL) | l->runes = rl; | ||||
return (EFTYPE); | l->__mb_cur_max = 4; | ||||
l->__mb_sb_limit = 256; | |||||
return (0); | |||||
} | |||||
v = (char *)rl->__variable; | static size_t | ||||
_EUC_CN_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, | |||||
size_t n, mbstate_t * __restrict ps) | |||||
{ | |||||
return (_EUC_mbrtowc_impl(pwc, s, n, ps, SS2, 4, 0, 0)); | |||||
} | |||||
while (*v == ' ' || *v == '\t') | static size_t | ||||
++v; | _EUC_CN_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, _EUC_CN_mbrtowc)); | |||||
} | |||||
if ((ei = malloc(sizeof(_EucInfo))) == NULL) | static size_t | ||||
return (errno == 0 ? ENOMEM : errno); | _EUC_CN_wcrtomb(char * __restrict s, wchar_t wc, | ||||
mbstate_t * __restrict ps) | |||||
{ | |||||
return (_EUC_wcrtomb_impl(s, wc, ps, SS2, 4, 0, 0)); | |||||
} | |||||
new__mb_cur_max = 0; | static size_t | ||||
for (x = 0; x < 4; ++x) { | _EUC_CN_wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, | ||||
ei->count[x] = (int)strtol(v, &e, 0); | size_t nwc, size_t len, mbstate_t * __restrict ps) | ||||
if (v == e || !(v = e)) { | { | ||||
free(ei); | return (__wcsnrtombs_std(dst, src, nwc, len, ps, _EUC_CN_wcrtomb)); | ||||
return (EFTYPE); | |||||
} | } | ||||
if (new__mb_cur_max < ei->count[x]) | |||||
new__mb_cur_max = ei->count[x]; | /* | ||||
while (*v == ' ' || *v == '\t') | * EUC-KR uses only CS0 and CS1. | ||||
++v; | */ | ||||
ei->bits[x] = (int)strtol(v, &e, 0); | int | ||||
if (v == e || !(v = e)) { | _EUC_KR_init(struct xlocale_ctype *l, _RuneLocale *rl) | ||||
free(ei); | { | ||||
return (EFTYPE); | l->__mbrtowc = _EUC_KR_mbrtowc; | ||||
l->__wcrtomb = _EUC_KR_wcrtomb; | |||||
l->__mbsnrtowcs = _EUC_KR_mbsnrtowcs; | |||||
l->__wcsnrtombs = _EUC_KR_wcsnrtombs; | |||||
l->__mbsinit = _EUC_mbsinit; | |||||
l->runes = rl; | |||||
l->__mb_cur_max = 2; | |||||
l->__mb_sb_limit = 128; | |||||
return (0); | |||||
} | } | ||||
while (*v == ' ' || *v == '\t') | |||||
++v; | static size_t | ||||
_EUC_KR_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, | |||||
size_t n, mbstate_t * __restrict ps) | |||||
{ | |||||
return (_EUC_mbrtowc_impl(pwc, s, n, ps, 0, 0, 0, 0)); | |||||
} | } | ||||
ei->mask = (int)strtol(v, &e, 0); | |||||
if (v == e || !(v = e)) { | static size_t | ||||
free(ei); | _EUC_KR_mbsnrtowcs(wchar_t * __restrict dst, | ||||
return (EFTYPE); | const char ** __restrict src, | ||||
size_t nms, size_t len, mbstate_t * __restrict ps) | |||||
{ | |||||
return (__mbsnrtowcs_std(dst, src, nms, len, ps, _EUC_KR_mbrtowc)); | |||||
} | } | ||||
rl->__variable = ei; | |||||
rl->__variable_len = sizeof(_EucInfo); | static size_t | ||||
l->runes = rl; | _EUC_KR_wcrtomb(char * __restrict s, wchar_t wc, | ||||
l->__mb_cur_max = new__mb_cur_max; | mbstate_t * __restrict ps) | ||||
l->__mbrtowc = _EUC_mbrtowc; | { | ||||
l->__wcrtomb = _EUC_wcrtomb; | return (_EUC_wcrtomb_impl(s, wc, ps, 0, 0, 0, 0)); | ||||
} | |||||
static size_t | |||||
_EUC_KR_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, _EUC_KR_wcrtomb)); | |||||
} | |||||
/* | |||||
* EUC-JP uses CS0, CS1, CS2, and CS3. | |||||
*/ | |||||
int | |||||
_EUC_JP_init(struct xlocale_ctype *l, _RuneLocale *rl) | |||||
{ | |||||
l->__mbrtowc = _EUC_JP_mbrtowc; | |||||
l->__wcrtomb = _EUC_JP_wcrtomb; | |||||
l->__mbsnrtowcs = _EUC_JP_mbsnrtowcs; | |||||
l->__wcsnrtombs = _EUC_JP_wcsnrtombs; | |||||
l->__mbsinit = _EUC_mbsinit; | l->__mbsinit = _EUC_mbsinit; | ||||
l->__mb_sb_limit = 256; | |||||
l->runes = rl; | |||||
l->__mb_cur_max = 3; | |||||
l->__mb_sb_limit = 196; | |||||
return (0); | return (0); | ||||
} | } | ||||
static int | static size_t | ||||
_EUC_mbsinit(const mbstate_t *ps) | _EUC_JP_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, | ||||
size_t n, mbstate_t * __restrict ps) | |||||
{ | { | ||||
return (_EUC_mbrtowc_impl(pwc, s, n, ps, SS2, 2, SS3, 3)); | |||||
} | |||||
return (ps == NULL || ((const _EucState *)ps)->want == 0); | static size_t | ||||
_EUC_JP_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, _EUC_JP_mbrtowc)); | |||||
} | } | ||||
#define CEI ((_EucInfo *)(_CurrentRuneLocale->__variable)) | static size_t | ||||
_EUC_JP_wcrtomb(char * __restrict s, wchar_t wc, | |||||
mbstate_t * __restrict ps) | |||||
{ | |||||
return (_EUC_wcrtomb_impl(s, wc, ps, SS2, 2, SS3, 3)); | |||||
} | |||||
#define _SS2 0x008e | static size_t | ||||
#define _SS3 0x008f | _EUC_JP_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, _EUC_JP_wcrtomb)); | |||||
} | |||||
#define GR_BITS 0x80808080 /* XXX: to be fixed */ | /* | ||||
* EUC-TW uses CS0, CS1, and CS2. | |||||
*/ | |||||
int | |||||
_EUC_TW_init(struct xlocale_ctype *l, _RuneLocale *rl) | |||||
{ | |||||
l->__mbrtowc = _EUC_TW_mbrtowc; | |||||
l->__wcrtomb = _EUC_TW_wcrtomb; | |||||
l->__mbsnrtowcs = _EUC_TW_mbsnrtowcs; | |||||
l->__wcsnrtombs = _EUC_TW_wcsnrtombs; | |||||
l->__mbsinit = _EUC_mbsinit; | |||||
static __inline int | l->runes = rl; | ||||
_euc_set(u_int c) | l->__mb_cur_max = 4; | ||||
l->__mb_sb_limit = 256; | |||||
return (0); | |||||
} | |||||
static size_t | |||||
_EUC_TW_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, | |||||
size_t n, mbstate_t * __restrict ps) | |||||
{ | { | ||||
return (_EUC_mbrtowc_impl(pwc, s, n, ps, SS2, 4, 0, 0)); | |||||
} | |||||
c &= 0xff; | static size_t | ||||
return ((c & 0x80) ? c == _SS3 ? 3 : c == _SS2 ? 2 : 1 : 0); | _EUC_TW_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, _EUC_TW_mbrtowc)); | |||||
} | } | ||||
static size_t | static size_t | ||||
_EUC_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, | _EUC_TW_wcrtomb(char * __restrict s, wchar_t wc, | ||||
mbstate_t * __restrict ps) | mbstate_t * __restrict ps) | ||||
{ | { | ||||
return (_EUC_wcrtomb_impl(s, wc, ps, SS2, 4, 0, 0)); | |||||
} | |||||
static size_t | |||||
_EUC_TW_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, _EUC_TW_wcrtomb)); | |||||
} | |||||
/* | |||||
* Common EUC code. | |||||
*/ | |||||
static size_t | |||||
_EUC_mbrtowc_impl(wchar_t * __restrict pwc, const char * __restrict s, | |||||
size_t n, mbstate_t * __restrict ps, | |||||
uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | |||||
{ | |||||
_EucState *es; | _EucState *es; | ||||
int i, set, want; | int i, want; | ||||
wchar_t wc; | wchar_t wc; | ||||
const char *os; | unsigned char ch; | ||||
es = (_EucState *)ps; | es = (_EucState *)ps; | ||||
if (es->want < 0 || es->want > MB_CUR_MAX || es->set < 0 || | if (es->want < 0 || es->want > MB_CUR_MAX) { | ||||
es->set > 3) { | |||||
errno = EINVAL; | errno = EINVAL; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
if (s == NULL) { | if (s == NULL) { | ||||
s = ""; | s = ""; | ||||
n = 1; | n = 1; | ||||
pwc = NULL; | pwc = NULL; | ||||
} | } | ||||
if (n == 0) | if (n == 0) | ||||
/* Incomplete multibyte sequence */ | /* Incomplete multibyte sequence */ | ||||
return ((size_t)-2); | return ((size_t)-2); | ||||
os = s; | |||||
if (es->want == 0) { | if (es->want == 0) { | ||||
want = CEI->count[set = _euc_set(*s)]; | /* Fast path for plain ASCII (CS0) */ | ||||
if (set == 2 || set == 3) { | if (((ch = (unsigned char)*s) & 0x80) == 0) { | ||||
--want; | if (pwc != NULL) | ||||
if (--n == 0) { | *pwc = ch; | ||||
/* Incomplete multibyte sequence */ | return (ch != '\0' ? 1 : 0); | ||||
es->set = set; | |||||
es->want = want; | |||||
es->ch = 0; | |||||
return ((size_t)-2); | |||||
} | } | ||||
++s; | |||||
if (*s == '\0') { | if (ch >= 0xa1) { | ||||
/* CS1 */ | |||||
want = 2; | |||||
} else if (ch == cs2) { | |||||
want = cs2width; | |||||
} else if (ch == cs3) { | |||||
want = cs3width; | |||||
} else { | |||||
errno = EILSEQ; | errno = EILSEQ; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
} | |||||
wc = (unsigned char)*s++; | |||||
es->want = want; | |||||
es->ch = 0; | |||||
} else { | } else { | ||||
set = es->set; | |||||
want = es->want; | want = es->want; | ||||
wc = es->ch; | wc = es->ch; | ||||
} | } | ||||
for (i = (es->want == 0) ? 1 : 0; i < MIN(want, n); i++) { | |||||
if (*s == '\0') { | for (i = 0; i < MIN(want, n); i++) { | ||||
errno = EILSEQ; | wc <<= 8; | ||||
return ((size_t)-1); | wc |= *s; | ||||
s++; | |||||
} | } | ||||
wc = (wc << 8) | (unsigned char)*s++; | |||||
} | |||||
if (i < want) { | if (i < want) { | ||||
/* Incomplete multibyte sequence */ | /* Incomplete multibyte sequence */ | ||||
es->set = set; | |||||
es->want = want - i; | es->want = want - i; | ||||
es->ch = wc; | es->ch = wc; | ||||
return ((size_t)-2); | return ((size_t)-2); | ||||
} | } | ||||
wc = (wc & ~CEI->mask) | CEI->bits[set]; | |||||
if (pwc != NULL) | if (pwc != NULL) | ||||
*pwc = wc; | *pwc = wc; | ||||
es->want = 0; | es->want = 0; | ||||
return (wc == L'\0' ? 0 : s - os); | return (wc == L'\0' ? 0 : want); | ||||
} | } | ||||
static size_t | static size_t | ||||
_EUC_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps) | _EUC_wcrtomb_impl(char * __restrict s, wchar_t wc, | ||||
mbstate_t * __restrict ps, | |||||
uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | |||||
{ | { | ||||
_EucState *es; | _EucState *es; | ||||
wchar_t m, nm; | |||||
int i, len; | int i, len; | ||||
wchar_t nm; | |||||
es = (_EucState *)ps; | es = (_EucState *)ps; | ||||
if (es->want != 0) { | if (es->want != 0) { | ||||
errno = EINVAL; | errno = EINVAL; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
if (s == NULL) | if (s == NULL) | ||||
/* Reset to initial shift state (no-op) */ | /* Reset to initial shift state (no-op) */ | ||||
return (1); | return (1); | ||||
m = wc & CEI->mask; | if ((wc & ~0x7f) == 0) { | ||||
nm = wc & ~m; | /* Fast path for plain ASCII (CS0) */ | ||||
*s = (char)wc; | |||||
return (1); | |||||
} | |||||
if (m == CEI->bits[1]) { | /* Determine the "length" */ | ||||
CodeSet1: | if ((unsigned)wc > 0xffffff) { | ||||
/* Codeset 1: The first byte must have 0x80 in it. */ | len = 4; | ||||
i = len = CEI->count[1]; | } else if ((unsigned)wc > 0xffff) { | ||||
while (i-- > 0) | len = 3; | ||||
*s++ = (nm >> (i << 3)) | 0x80; | } else if ((unsigned)wc > 0xff) { | ||||
len = 2; | |||||
} else { | } else { | ||||
if (m == CEI->bits[0]) | len = 1; | ||||
i = len = CEI->count[0]; | } | ||||
else if (m == CEI->bits[2]) { | |||||
i = len = CEI->count[2]; | if (len > MB_CUR_MAX) { | ||||
*s++ = _SS2; | errno = EILSEQ; | ||||
--i; | return ((size_t)-1); | ||||
/* SS2 designates G2 into GR */ | } | ||||
nm |= GR_BITS; | |||||
} else if (m == CEI->bits[3]) { | /* This first check excludes CS1, which is implicitly valid. */ | ||||
i = len = CEI->count[3]; | if ((wc < 0xa100) || (wc > 0xffff)) { | ||||
*s++ = _SS3; | /* Check for valid CS2 or CS3 */ | ||||
--i; | nm = (wc >> ((len - 1) * 8)); | ||||
/* SS3 designates G3 into GR */ | if (nm == cs2) { | ||||
nm |= GR_BITS; | if (len != cs2width) { | ||||
} else | errno = EILSEQ; | ||||
goto CodeSet1; /* Bletch */ | return ((size_t)-1); | ||||
while (i-- > 0) | } | ||||
*s++ = (nm >> (i << 3)) & 0xff; | } else if (nm == cs3) { | ||||
if (len != cs3width) { | |||||
errno = EILSEQ; | |||||
return ((size_t)-1); | |||||
} | |||||
} else { | |||||
errno = EILSEQ; | |||||
return ((size_t)-1); | |||||
} | |||||
} | |||||
/* Stash the bytes, least significant last */ | |||||
for (i = len - 1; i >= 0; i--) { | |||||
s[i] = (wc & 0xff); | |||||
wc >>= 8; | |||||
} | } | ||||
return (len); | return (len); | ||||
} | } |
We have permission from UCB to remove this clause, do we have permission from the other copyright holders (or has all of their code been removed?)