perl 4.0 patch 35: (combined patch)
Larry Wall [Mon, 22 Jun 1992 23:34:36 +0000 (23:34 +0000)]
Subject: bad interaction between backslash and hyphen in tr///
Among other things, tr/\040-\126/ / was not doing a character range,
due to a earlier botched fix to make \- work right.

Subject: Configure test for presence of nroff was wrong
If Loc doesn't find nroff, it sets $nroff to 'nroff'.  The man
page test was tesing against the null string.

Subject: installperl error message printed file mode in decimal, not octal
A real, honest-to-goodnes nit.

Subject: fixed up some filenames in MANIFEST
Erroneously contained "pstruct", omitted hints/isc_3_2_3.sh.

Configure
MANIFEST
installperl
patchlevel.h
toke.c

index 4475378..ddfd7e2 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -8,7 +8,7 @@
 # and edit it to reflect your system.  Some packages may include samples
 # of config.h for certain machines, so you might look for one of those.)
 #
-# $RCSfile: Configure,v $$Revision: 4.0.1.8 $$Date: 92/06/11 21:04:45 $
+# $RCSfile: Configure,v $$Revision: 4.0.1.9 $$Date: 92/06/23 12:28:33 $
 #
 # Yes, you may rip this off to use in other distribution packages.
 # (Note: this Configure script was generated automatically.  Rather than
@@ -877,7 +877,7 @@ $cat <<EOM
 $package has manual pages available in source form.
 EOM
 case "$nroff" in
-'')
+'nroff')
     echo "However, you don't have nroff, so they're probably useless to you."
     case "$mansrc" in
     '')
index 3890ea3..2a518c1 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -146,6 +146,7 @@ hints/hp9000_800.sh
 hints/hpux.sh
 hints/i386.sh
 hints/isc_3_2_2.sh
+hints/isc_3_2_3.sh
 hints/mc6000.sh
 hints/mips.sh
 hints/mpc.sh   
@@ -264,7 +265,6 @@ perl.man            The manual page(s)
 perlsh                 A poor man's perl shell
 perly.fixer            A program to remove yacc stack limitations
 perly.y                        Yacc grammar for perl
-pstruct
 regcomp.c              Regular expression compiler
 regcomp.h              Private declarations for above
 regexec.c              Regular expression evaluator
index b5ef496..4f3fc00 100644 (file)
@@ -198,7 +198,7 @@ sub chmod {
     local($mode,$name) = @_;
 
     printf STDERR "  chmod %o %s\n", $mode, $name;
-    chmod($mode,$name) || warn "Couldn't chmod $mode $name: $!\n"
+    chmod($mode,$name) || warn sprintf("Couldn't chmod %o %s: $!\n",$mode,$name)
        unless $nonono;
 }
 
index 3b47b47..68fcfef 100644 (file)
@@ -1 +1 @@
-#define PATCHLEVEL 34
+#define PATCHLEVEL 35
diff --git a/toke.c b/toke.c
index 0452765..8019756 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1,4 +1,4 @@
-/* $RCSfile: toke.c,v $$Revision: 4.0.1.7 $$Date: 92/06/11 21:16:30 $
+/* $RCSfile: toke.c,v $$Revision: 4.0.1.8 $$Date: 92/06/23 12:33:45 $
  *
  *    Copyright (c) 1991, Larry Wall
  *
@@ -6,6 +6,9 @@
  *    License or the Artistic License, as specified in the README file.
  *
  * $Log:       toke.c,v $
+ * Revision 4.0.1.8  92/06/23  12:33:45  lwall
+ * patch35: bad interaction between backslash and hyphen in tr///
+ * 
  * Revision 4.0.1.7  92/06/11  21:16:30  lwall
  * patch34: expectterm incorrectly set to indicate start of program or block
  * 
@@ -2297,6 +2300,7 @@ int in_what;
            STR *tmpstr;
            STR *tmpstr2 = Nullstr;
            char *tmps;
+           bool dorange = FALSE;
 
            CLINE;
            multi_start = curcmd->c_line;
@@ -2394,10 +2398,11 @@ int in_what;
                s++;
            }
            s = d = tmpstr->str_ptr;    /* assuming shrinkage only */
-           while (s < send) {
+           while (s < send || dorange) {
                if (in_what & SCAN_TR) {
-                   if (*s != '\\' && s[1] == '-' && s+2 < send) {
+                   if (dorange) {
                        int i;
+                       int max;
                        if (!tmpstr2) { /* oops, have to grow */
                            tmpstr2 = str_smake(tmpstr);
                            s = tmpstr2->str_ptr + (s - tmpstr->str_ptr);
@@ -2406,11 +2411,17 @@ int in_what;
                        i = d - tmpstr->str_ptr;
                        STR_GROW(tmpstr, tmpstr->str_len + 256);
                        d = tmpstr->str_ptr + i;
-                       for (i = (s[0] & 0377); i <= (s[2] & 0377); i++)
+                       d -= 2;
+                       max = d[1] & 0377;
+                       for (i = (*d & 0377); i <= max; i++)
                            *d++ = i;
-                       s += 3;
+                       dorange = FALSE;
                        continue;
                    }
+                   else if (*s == '-' && s+1 < send  && d != tmpstr->str_ptr) {
+                       dorange = TRUE;
+                       s++;
+                   }
                }
                else {
                    if ((*s == '$' && s+1 < send &&
@@ -2432,6 +2443,12 @@ int in_what;
                if (*s == '\\' && s+1 < send) {
                    s++;
                    switch (*s) {
+                   case '-':
+                       if (in_what & SCAN_TR) {
+                           *d++ = *s++;
+                           continue;
+                       }
+                       /* FALL THROUGH */
                    default:
                        if (!makesingle && (!leave || (*s && index(leave,*s))))
                            *d++ = '\\';