This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change macro name in tr/// code
authorKarl Williamson <khw@cpan.org>
Wed, 2 Oct 2019 15:38:53 +0000 (09:38 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 7 Nov 2019 04:22:23 +0000 (21:22 -0700)
This makes it more mnemonic.  Also add an explanation in toke.c

op.c
op.h
toke.c

diff --git a/op.c b/op.c
index 55dbcb6..b003067 100644 (file)
--- a/op.c
+++ b/op.c
@@ -6846,8 +6846,8 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            while (t < tend) {
                cp[2*i] = utf8n_to_uvchr(t, tend-t, &ulen, flags);
                t += ulen;
-                /* the toker converts X-Y into (X, ILLEGAL_UTF8_BYTE, Y) */
-               if (t < tend && *t == ILLEGAL_UTF8_BYTE) {
+                /* the toker converts X-Y into (X, RANGE_INDICATOR, Y) */
+               if (t < tend && *t == RANGE_INDICATOR) {
                    t++;
                    cp[2*i+1] = utf8n_to_uvchr(t, tend-t, &ulen, flags);
                    t += ulen;
@@ -6864,10 +6864,10 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
             /* Create a utf8 string containing the complement of the
              * codepoint ranges. For example if cp[] contains [A,B], [C,D],
              * then transv will contain the equivalent of:
-             * join '', map chr, 0,     ILLEGAL_UTF8_BYTE, A - 1,
-             *                   B + 1, ILLEGAL_UTF8_BYTE, C - 1,
-             *                   D + 1, ILLEGAL_UTF8_BYTE, 0x7fffffff;
-             * A range of a single char skips the ILLEGAL_UTF8_BYTE and
+             * join '', map chr, 0,     RANGE_INDICATOR, A - 1,
+             *                   B + 1, RANGE_INDICATOR, C - 1,
+             *                   D + 1, RANGE_INDICATOR, 0x7fffffff;
+             * A range of a single char skips the RANGE_INDICATOR and
              * end cp.
              */
            for (j = 0; j < i; j++) {
@@ -6877,7 +6877,7 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
                    t = uvchr_to_utf8(tmpbuf,nextmin);
                    sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
                    if (diff > 1) {
-                       U8  range_mark = ILLEGAL_UTF8_BYTE;
+                       U8  range_mark = RANGE_INDICATOR;
                        t = uvchr_to_utf8(tmpbuf, val - 1);
                        sv_catpvn(transv, (char *)&range_mark, 1);
                        sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
@@ -6891,7 +6891,7 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            t = uvchr_to_utf8(tmpbuf,nextmin);
            sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
            {
-               U8 range_mark = ILLEGAL_UTF8_BYTE;
+               U8 range_mark = RANGE_INDICATOR;
                sv_catpvn(transv, (char *)&range_mark, 1);
            }
            t = uvchr_to_utf8(tmpbuf, 0x7fffffff);
@@ -6920,7 +6920,7 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            if (tfirst > tlast) {
                tfirst = (I32)utf8n_to_uvchr(t, tend - t, &ulen, flags);
                t += ulen;
-               if (t < tend && *t == ILLEGAL_UTF8_BYTE) {      /* illegal utf8 val indicates range */
+               if (t < tend && *t == RANGE_INDICATOR) {        /* illegal utf8 val indicates range */
                    t++;
                    tlast = (I32)utf8n_to_uvchr(t, tend - t, &ulen, flags);
                    t += ulen;
@@ -6934,7 +6934,7 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
                if (r < rend) {
                    rfirst = (I32)utf8n_to_uvchr(r, rend - r, &ulen, flags);
                    r += ulen;
-                   if (r < rend && *r == ILLEGAL_UTF8_BYTE) {  /* illegal utf8 val indicates range */
+                   if (r < rend && *r == RANGE_INDICATOR) {    /* illegal utf8 val indicates range */
                        r++;
                        rlast = (I32)utf8n_to_uvchr(r, rend - r, &ulen, flags);
                        r += ulen;
diff --git a/op.h b/op.h
index 1bfea27..23b2f4a 100644 (file)
--- a/op.h
+++ b/op.h
@@ -1109,6 +1109,9 @@ C<sib> is non-null. For a higher-level interface, see C<L</op_sibling_splice>>.
       "Use of strings with code points over 0xFF as arguments to "  \
       "%s operator is not allowed"
 #endif
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C)
+#define RANGE_INDICATOR  ILLEGAL_UTF8_BYTE
+#endif
 
 /* stuff for OP_ARGCHECK */
 
diff --git a/toke.c b/toke.c
index 1af5535..0fdcadc 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2987,12 +2987,13 @@ S_scan_const(pTHX_ char *start)
              * order to make the transliteration a simple table look-up.
              * Ranges that extend above Latin1 have to be done differently, so
              * there is no advantage to expanding them here, so they are
-             * stored here as Min, ILLEGAL_UTF8_BYTE, Max.  The illegal byte
-             * signifies a hyphen without any possible ambiguity.  On EBCDIC
-             * machines, if the range is expressed as Unicode, the Latin1
-             * portion is expanded out even if the range extends above
-             * Latin1.  This is because each code point in it has to be
-             * processed here individually to get its native translation */
+             * stored here as Min, RANGE_INDICATOR, Max.  'RANGE_INDICATOR' is
+             * a byte that can't occur in legal UTF-8, and hence can signify a
+             * hyphen without any possible ambiguity.  On EBCDIC machines, if
+             * the range is expressed as Unicode, the Latin1 portion is
+             * expanded out even if the range extends above Latin1.  This is
+             * because each code point in it has to be processed here
+             * individually to get its native translation */
 
            if (! dorange) {
 
@@ -3204,7 +3205,7 @@ S_scan_const(pTHX_ char *start)
                         while (e-- > max_ptr) {
                             *(e + 1) = *e;
                         }
-                        *(e + 1) = (char) ILLEGAL_UTF8_BYTE;
+                        *(e + 1) = (char) RANGE_INDICATOR;
                         goto range_done;
                     }
 
@@ -3362,7 +3363,7 @@ S_scan_const(pTHX_ char *start)
                     *d++ = (char) UTF8_TWO_BYTE_LO(0x100);
                     if (real_range_max > 0x100) {
                         if (real_range_max > 0x101) {
-                            *d++ = (char) ILLEGAL_UTF8_BYTE;
+                            *d++ = (char) RANGE_INDICATOR;
                         }
                         d = (char*)uvchr_to_utf8((U8*)d, real_range_max);
                     }