diff options
author | Nicholas Clark <nick@ccl4.org> | 2002-01-05 18:10:13 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2002-01-05 17:18:43 +0000 |
commit | b4023995ae634362f5a7adbc294793a9acb0a4b2 (patch) | |
tree | fefc60548a3e771ae7aa319019d0a8ce0d9c9ab5 /regcomp.c | |
parent | 2b57143f77d879f4dcd705a4df5013117f3a2929 (diff) | |
download | perl-b4023995ae634362f5a7adbc294793a9acb0a4b2.tar.gz |
[REPATCH] Re: [PATCH] Re: socketpair blip on unicos/mk, too
Message-ID: <20020105181013.I300@Bagpuss.unfortu.net>
p4raw-id: //depot/perl@14090
Diffstat (limited to 'regcomp.c')
-rw-r--r-- | regcomp.c | 37 |
1 files changed, 28 insertions, 9 deletions
@@ -3427,7 +3427,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state) SV *listsv = Nullsv; register char *e; UV n; - bool optimize_invert = TRUE; + bool optimize_invert = TRUE; + AV* unicode_alternate = 0; ret = reganode(pRExC_state, ANYOF, 0); @@ -4028,18 +4029,35 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state) /* If folding and foldable and a single * character, insert also the folded version * to the charclass. */ - if (f != value && foldlen == UNISKIP(f)) - Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", f); + if (f != value) { + if (foldlen == UNISKIP(f)) + Perl_sv_catpvf(aTHX_ listsv, + "%04"UVxf"\n", f); + else { + /* Any multicharacter foldings + * require the following transform: + * [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst) + * where E folds into "pq" and F folds + * into "rst", all other characters + * fold to single characters. */ + SV *sv; + + if (!unicode_alternate) + unicode_alternate = newAV(); + sv = newSVpvn((char*)foldbuf, foldlen); + SvUTF8_on(sv); + av_push(unicode_alternate, sv); + } + } /* If folding and the value is one of the Greek * sigmas insert a few more sigmas to make the * folding rules of the sigmas to work right. * Note that not all the possible combinations * are handled here: some of them are handled - * handled by the standard folding rules, and - * some of them (literal or EXACTF cases) are - * handled during runtime in - * regexec.c:S_find_byclass(). */ + * by the standard folding rules, and some of + * them (literal or EXACTF cases) are handled + * during runtime in regexec.c:S_find_byclass(). */ if (value == UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA) { Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA); @@ -4096,6 +4114,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state) av_store(av, 0, listsv); av_store(av, 1, NULL); + av_store(av, 2, (SV*)unicode_alternate); rv = newRV_noinc((SV*)av); n = add_data(pRExC_state, 1, "s"); RExC_rx->data->data[n] = (void*)rv; @@ -4625,7 +4644,7 @@ Perl_regprop(pTHX_ SV *sv, regnode *o) { SV *lv; - SV *sw = regclass_swash(o, FALSE, &lv); + SV *sw = regclass_swash(o, FALSE, &lv, 0); if (lv) { if (sw) { @@ -4779,7 +4798,7 @@ Perl_pregfree(pTHX_ struct regexp *r) new_comppad = NULL; break; case 'n': - break; + break; default: Perl_croak(aTHX_ "panic: regfree data code '%c'", r->data->what[n]); } |