This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_ctl.c: Use isCNTRL instead of hard-coded mask
authorKarl Williamson <public@khwilliamson.com>
Mon, 4 Feb 2013 21:22:02 +0000 (14:22 -0700)
committerKarl Williamson <public@khwilliamson.com>
Thu, 29 Aug 2013 15:55:48 +0000 (09:55 -0600)
This is clearer and portable to EBCDIC.

There is a subtle difference in the behavior here, which I believe is a
bug fix.  Before, the code didn't treat DEL as a control, and now it
does.

pp_ctl.c

index a5e293c..b9ef68f 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -587,7 +587,7 @@ PP(pp_formline)
                            itembytes = len;
                        send = chophere = s + itembytes;
                        while (s < send) {
-                           if (*s & ~31)
+                           if (! isCNTRL(*s))
                                gotsome = TRUE;
                            else if (*s == '\n')
                                break;
@@ -604,7 +604,7 @@ PP(pp_formline)
                    itemsize = fieldsize;
                send = chophere = s + itemsize;
                while (s < send) {
-                   if (*s & ~31)
+                   if (! isCNTRL(*s))
                        gotsome = TRUE;
                    else if (*s == '\n')
                        break;
@@ -630,8 +630,9 @@ PP(pp_formline)
                                    chophere = s;
                                    break;
                                }
-                               if (*s++ & ~31)
+                               if (! isCNTRL(*s))
                                    gotsome = TRUE;
+                                s++;
                            }
                        }
                        else {
@@ -648,7 +649,7 @@ PP(pp_formline)
                                        break;
                                }
                                else {
-                                   if (*s & ~31)
+                                   if (! isCNTRL(*s))
                                        gotsome = TRUE;
                                    if (strchr(PL_chopset, *s))
                                        chophere = s + 1;
@@ -671,8 +672,9 @@ PP(pp_formline)
                            chophere = s;
                            break;
                        }
-                       if (*s++ & ~31)
+                       if (! isCNTRL(*s))
                            gotsome = TRUE;
+                        s++;
                    }
                }
                else {
@@ -687,7 +689,7 @@ PP(pp_formline)
                                break;
                        }
                        else {
-                           if (*s & ~31)
+                           if (! isCNTRL(*s))
                                gotsome = TRUE;
                            if (strchr(PL_chopset, *s))
                                chophere = s + 1;
@@ -829,13 +831,7 @@ PP(pp_formline)
                    U8 *send = s + to_copy;
                    while (s < send) {
                        const int ch = *s;
-                       if (trans == '~' ? (ch == '~') :
-#ifdef EBCDIC
-                              iscntrl(ch)
-#else
-                              (!(ch & ~31))
-#endif
-                       )
+                       if (trans == '~' ? (ch == '~') : isCNTRL(ch))
                            *s = ' ';
                        s++;
                    }