X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=utf8.c;h=ff113f9fdfbc3542f32000cd1de7d537e205115d;hb=f63f8e2fd0961bccc25f9a9f7fffef07b3c2a65a;hp=b27774af7f9aeb4f08a6aa1d9c6de0493ec8ccd7;hpb=6b8eaf932222db04db65aff99717b9c1dbd0a692;p=p5sagit%2Fp5-mst-13.2.git diff --git a/utf8.c b/utf8.c index b27774a..ff113f9 100644 --- a/utf8.c +++ b/utf8.c @@ -1,6 +1,6 @@ /* utf8.c * - * Copyright (c) 1998-1999, Larry Wall + * Copyright (c) 1998-2000, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -69,7 +69,7 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv) return d; } #ifdef HAS_QUAD - if (uv < 0x2000000000) + if (uv < 0x1000000000LL) #endif { *d++ = 0xfe; /* Can't match U+FEFF! */ @@ -84,6 +84,11 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv) #ifdef HAS_QUAD { *d++ = 0xff; /* Can't match U+FFFE! */ + *d++ = 0x80; /* 6 Reserved bits */ + *d++ = (((uv >> 60) & 0x0f) | 0x80); /* 2 Reserved bits */ + *d++ = (((uv >> 54) & 0x3f) | 0x80); + *d++ = (((uv >> 48) & 0x3f) | 0x80); + *d++ = (((uv >> 42) & 0x3f) | 0x80); *d++ = (((uv >> 36) & 0x3f) | 0x80); *d++ = (((uv >> 30) & 0x3f) | 0x80); *d++ = (((uv >> 24) & 0x3f) | 0x80); @@ -120,8 +125,8 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen) else if (!(uv & 0x08)) { len = 4; uv &= 0x07; } else if (!(uv & 0x04)) { len = 5; uv &= 0x03; } else if (!(uv & 0x02)) { len = 6; uv &= 0x01; } - else if (!(uv & 0x01)) { len = 7; uv &= 0x00; } - else len = 8; /* whoa! */ + else if (!(uv & 0x01)) { len = 7; uv = 0; } + else { len = 13; uv = 0; } /* whoa! */ if (retlen) *retlen = len; @@ -255,7 +260,7 @@ Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8* d, I32 bytelen) bool Perl_is_uni_alnum(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_alnum(tmpbuf); } @@ -263,7 +268,7 @@ Perl_is_uni_alnum(pTHX_ U32 c) bool Perl_is_uni_alnumc(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_alnumc(tmpbuf); } @@ -271,7 +276,7 @@ Perl_is_uni_alnumc(pTHX_ U32 c) bool Perl_is_uni_idfirst(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_idfirst(tmpbuf); } @@ -279,7 +284,7 @@ Perl_is_uni_idfirst(pTHX_ U32 c) bool Perl_is_uni_alpha(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_alpha(tmpbuf); } @@ -287,7 +292,7 @@ Perl_is_uni_alpha(pTHX_ U32 c) bool Perl_is_uni_ascii(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_ascii(tmpbuf); } @@ -295,7 +300,7 @@ Perl_is_uni_ascii(pTHX_ U32 c) bool Perl_is_uni_space(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_space(tmpbuf); } @@ -303,7 +308,7 @@ Perl_is_uni_space(pTHX_ U32 c) bool Perl_is_uni_digit(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_digit(tmpbuf); } @@ -311,7 +316,7 @@ Perl_is_uni_digit(pTHX_ U32 c) bool Perl_is_uni_upper(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_upper(tmpbuf); } @@ -319,7 +324,7 @@ Perl_is_uni_upper(pTHX_ U32 c) bool Perl_is_uni_lower(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_lower(tmpbuf); } @@ -327,7 +332,7 @@ Perl_is_uni_lower(pTHX_ U32 c) bool Perl_is_uni_cntrl(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_cntrl(tmpbuf); } @@ -335,7 +340,7 @@ Perl_is_uni_cntrl(pTHX_ U32 c) bool Perl_is_uni_graph(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_graph(tmpbuf); } @@ -343,7 +348,7 @@ Perl_is_uni_graph(pTHX_ U32 c) bool Perl_is_uni_print(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_print(tmpbuf); } @@ -351,7 +356,7 @@ Perl_is_uni_print(pTHX_ U32 c) bool Perl_is_uni_punct(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_punct(tmpbuf); } @@ -359,7 +364,7 @@ Perl_is_uni_punct(pTHX_ U32 c) bool Perl_is_uni_xdigit(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return is_utf8_xdigit(tmpbuf); } @@ -367,7 +372,7 @@ Perl_is_uni_xdigit(pTHX_ U32 c) U32 Perl_to_uni_upper(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return to_utf8_upper(tmpbuf); } @@ -375,7 +380,7 @@ Perl_to_uni_upper(pTHX_ U32 c) U32 Perl_to_uni_title(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return to_utf8_title(tmpbuf); } @@ -383,7 +388,7 @@ Perl_to_uni_title(pTHX_ U32 c) U32 Perl_to_uni_lower(pTHX_ U32 c) { - U8 tmpbuf[10]; + U8 tmpbuf[UTF8_MAXLEN]; uv_to_utf8(tmpbuf, (UV)c); return to_utf8_lower(tmpbuf); }