X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=utf8.c;h=ff113f9fdfbc3542f32000cd1de7d537e205115d;hb=f63f8e2fd0961bccc25f9a9f7fffef07b3c2a65a;hp=8c7aee2d8945b05346a00202a50f83473bee18c2;hpb=cea2e8a9dd23747fd2b66edc86c58c64e9970321;p=p5sagit%2Fp5-mst-13.2.git diff --git a/utf8.c b/utf8.c index 8c7aee2..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. @@ -68,8 +68,8 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv) *d++ = (( uv & 0x3f) | 0x80); return d; } -#ifdef Quad_t - if (uv < 0x2000000000) +#ifdef HAS_QUAD + if (uv < 0x1000000000LL) #endif { *d++ = 0xfe; /* Can't match U+FEFF! */ @@ -81,9 +81,14 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv) *d++ = (( uv & 0x3f) | 0x80); return d; } -#ifdef Quad_t +#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); @@ -107,7 +112,9 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen) return *s; } if (!(uv & 0x40)) { - Perl_warn(aTHX_ "Malformed UTF-8 character"); + dTHR; + if (ckWARN_d(WARN_UTF8)) + Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character"); if (retlen) *retlen = 1; return *s; @@ -118,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; @@ -127,7 +134,9 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen) s++; while (len--) { if ((*s & 0xc0) != 0x80) { - Perl_warn(aTHX_ "Malformed UTF-8 character"); + dTHR; + if (ckWARN_d(WARN_UTF8)) + Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character"); if (retlen) *retlen -= len + 1; return 0xfffd; @@ -203,9 +212,11 @@ Perl_utf16_to_utf8(pTHX_ U16* p, U8* d, I32 bytelen) continue; } if (uv >= 0xd800 && uv < 0xdbff) { /* surrogates */ + dTHR; int low = *p++; if (low < 0xdc00 || low >= 0xdfff) { - Perl_warn(aTHX_ "Malformed UTF-16 surrogate"); + if (ckWARN_d(WARN_UTF8)) + Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-16 surrogate"); p--; uv = 0xfffd; } @@ -249,15 +260,23 @@ 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); } bool +Perl_is_uni_alnumc(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_alnumc(tmpbuf); +} + +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); } @@ -265,15 +284,23 @@ 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); } bool +Perl_is_uni_ascii(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_ascii(tmpbuf); +} + +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); } @@ -281,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); } @@ -289,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); } @@ -297,23 +324,55 @@ 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); } bool +Perl_is_uni_cntrl(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_cntrl(tmpbuf); +} + +bool +Perl_is_uni_graph(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_graph(tmpbuf); +} + +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); } +bool +Perl_is_uni_punct(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_punct(tmpbuf); +} + +bool +Perl_is_uni_xdigit(pTHX_ U32 c) +{ + U8 tmpbuf[UTF8_MAXLEN]; + uv_to_utf8(tmpbuf, (UV)c); + return is_utf8_xdigit(tmpbuf); +} + 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); } @@ -321,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); } @@ -329,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); } @@ -343,6 +402,12 @@ Perl_is_uni_alnum_lc(pTHX_ U32 c) } bool +Perl_is_uni_alnumc_lc(pTHX_ U32 c) +{ + return is_uni_alnumc(c); /* XXX no locale support yet */ +} + +bool Perl_is_uni_idfirst_lc(pTHX_ U32 c) { return is_uni_idfirst(c); /* XXX no locale support yet */ @@ -355,6 +420,12 @@ Perl_is_uni_alpha_lc(pTHX_ U32 c) } bool +Perl_is_uni_ascii_lc(pTHX_ U32 c) +{ + return is_uni_ascii(c); /* XXX no locale support yet */ +} + +bool Perl_is_uni_space_lc(pTHX_ U32 c) { return is_uni_space(c); /* XXX no locale support yet */ @@ -379,11 +450,35 @@ Perl_is_uni_lower_lc(pTHX_ U32 c) } bool +Perl_is_uni_cntrl_lc(pTHX_ U32 c) +{ + return is_uni_cntrl(c); /* XXX no locale support yet */ +} + +bool +Perl_is_uni_graph_lc(pTHX_ U32 c) +{ + return is_uni_graph(c); /* XXX no locale support yet */ +} + +bool Perl_is_uni_print_lc(pTHX_ U32 c) { return is_uni_print(c); /* XXX no locale support yet */ } +bool +Perl_is_uni_punct_lc(pTHX_ U32 c) +{ + return is_uni_punct(c); /* XXX no locale support yet */ +} + +bool +Perl_is_uni_xdigit_lc(pTHX_ U32 c) +{ + return is_uni_xdigit(c); /* XXX no locale support yet */ +} + U32 Perl_to_uni_upper_lc(pTHX_ U32 c) { @@ -402,7 +497,6 @@ Perl_to_uni_lower_lc(pTHX_ U32 c) return to_uni_lower(c); /* XXX no locale support yet */ } - bool Perl_is_utf8_alnum(pTHX_ U8 *p) { @@ -419,6 +513,21 @@ Perl_is_utf8_alnum(pTHX_ U8 *p) } bool +Perl_is_utf8_alnumc(pTHX_ U8 *p) +{ + if (!PL_utf8_alnum) + PL_utf8_alnum = swash_init("utf8", "IsAlnumC", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_alnum, p); +/* return is_utf8_alpha(p) || is_utf8_digit(p); */ +#ifdef SURPRISINGLY_SLOWER /* probably because alpha is usually true */ + if (!PL_utf8_alnum) + PL_utf8_alnum = swash_init("utf8", "", + sv_2mortal(newSVpv("+utf8::IsAlpha\n+utf8::IsDigit\n005F\n",0)), 0, 0); + return swash_fetch(PL_utf8_alnum, p); +#endif +} + +bool Perl_is_utf8_idfirst(pTHX_ U8 *p) { return *p == '_' || is_utf8_alpha(p); @@ -433,6 +542,14 @@ Perl_is_utf8_alpha(pTHX_ U8 *p) } bool +Perl_is_utf8_ascii(pTHX_ U8 *p) +{ + if (!PL_utf8_ascii) + PL_utf8_ascii = swash_init("utf8", "IsAscii", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_ascii, p); +} + +bool Perl_is_utf8_space(pTHX_ U8 *p) { if (!PL_utf8_space) @@ -465,6 +582,22 @@ Perl_is_utf8_lower(pTHX_ U8 *p) } bool +Perl_is_utf8_cntrl(pTHX_ U8 *p) +{ + if (!PL_utf8_cntrl) + PL_utf8_cntrl = swash_init("utf8", "IsCntrl", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_cntrl, p); +} + +bool +Perl_is_utf8_graph(pTHX_ U8 *p) +{ + if (!PL_utf8_graph) + PL_utf8_graph = swash_init("utf8", "IsGraph", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_graph, p); +} + +bool Perl_is_utf8_print(pTHX_ U8 *p) { if (!PL_utf8_print) @@ -473,6 +606,22 @@ Perl_is_utf8_print(pTHX_ U8 *p) } bool +Perl_is_utf8_punct(pTHX_ U8 *p) +{ + if (!PL_utf8_punct) + PL_utf8_punct = swash_init("utf8", "IsPunct", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_punct, p); +} + +bool +Perl_is_utf8_xdigit(pTHX_ U8 *p) +{ + if (!PL_utf8_xdigit) + PL_utf8_xdigit = swash_init("utf8", "IsXDigit", &PL_sv_undef, 0, 0); + return swash_fetch(PL_utf8_xdigit, p); +} + +bool Perl_is_utf8_mark(pTHX_ U8 *p) { if (!PL_utf8_mark)