]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
maint: simplify printing of md5sum file names
authorPádraig Brady <P@draigBrady.com>
Fri, 1 Nov 2013 16:14:44 +0000 (16:14 +0000)
committerPádraig Brady <P@draigBrady.com>
Fri, 1 Nov 2013 22:34:24 +0000 (22:34 +0000)
* src/md5sum.c (main): Add a comment as to why we continue
to escape names that do not have '\n' but do have '\\' chars.
(print_filename): Use the predetermined boolean to decide
whether to escape or not, so that in the common case we
can output the file name directly, rather than inspecting each char.
* tests/misc/md5sum.pl: Add case to show '\\' chars cause escaping.
* tests/misc/sha1sum.pl: Likewise.

src/md5sum.c
tests/misc/md5sum.pl
tests/misc/sha1sum.pl

index b437811502c5655d535de6836c813ceecc5d21da..bf7eb81a6079051c79e683e624b5d3de1cf1013c 100644 (file)
@@ -657,11 +657,17 @@ digest_check (const char *checkfile_name)
           && (!strict || n_improperly_formatted_lines == 0));
 }
 
+/* If ESCAPE is true, then translate each NEWLINE byte to the string, "\\n",
+   and each backslash to "\\\\".  */
 static void
-print_filename (char const *file)
+print_filename (char const *file, bool escape)
 {
-  /* Translate each NEWLINE byte to the string, "\\n",
-     and each backslash to "\\\\".  */
+  if (! escape)
+    {
+      fputs (file, stdout);
+      return;
+    }
+
   while (*file)
     {
       switch (*file)
@@ -823,14 +829,23 @@ main (int argc, char **argv)
             ok = false;
           else
             {
+              /* We don't really need to escape, and hence detect, the '\\'
+                 char, and not doing so should be both forwards and backwards
+                 compatible, since only escaped lines would have a '\\' char at
+                 the start.  However just in case users are directly comparing
+                 against old (hashed) outputs, in the presence of files
+                 containing '\\' characters, we decided to not simplify the
+                 output in this case.  */
+              bool needs_escape = strchr (file, '\\') || strchr (file, '\n');
+
               if (prefix_tag)
                 {
-                  if (strchr (file, '\n') || strchr (file, '\\'))
+                  if (needs_escape)
                     putchar ('\\');
 
                   fputs (DIGEST_TYPE_STRING, stdout);
                   fputs (" (", stdout);
-                  print_filename (file);
+                  print_filename (file, needs_escape);
                   fputs (") = ", stdout);
                 }
 
@@ -838,7 +853,7 @@ main (int argc, char **argv)
 
               /* Output a leading backslash if the file name contains
                  a newline or backslash.  */
-              if (!prefix_tag && (strchr (file, '\n') || strchr (file, '\\')))
+              if (!prefix_tag && needs_escape)
                 putchar ('\\');
 
               for (i = 0; i < (digest_hex_bytes / 2); ++i)
@@ -850,7 +865,7 @@ main (int argc, char **argv)
 
                   putchar (file_is_binary ? '*' : ' ');
 
-                  print_filename (file);
+                  print_filename (file, needs_escape);
                 }
 
               putchar ('\n');
index 5192d55f4873759f27c1a9f76b33b8cca4f30027..a89fa62ccc310923bded48a971b78bd5f12e2328 100755 (executable)
@@ -38,7 +38,9 @@ my @Tests =
                                 {OUT=>"d174ab98d277d9f5a5611c2c9f419d9f  f\n"}],
      ['7', {IN=> {f=> '1234567890' x 8}},
                                 {OUT=>"57edf4a22be3c955ac49da2e2107b67a  f\n"}],
-     ['backslash', {IN=> {".\\foo"=> ''}},
+     ['backslash-1', {IN=> {".\nfoo"=> ''}},
+                                {OUT=>"\\$degenerate  .\\nfoo\n"}],
+     ['backslash-2', {IN=> {".\\foo"=> ''}},
                                 {OUT=>"\\$degenerate  .\\\\foo\n"}],
      ['check-1', '--check', {AUX=> {f=> ''}},
                                 {IN=> {'f.md5' => "$degenerate  f\n"}},
index 327c4dd896512f396445d1ae20d705e7e76f84c6..730ca0804aacdbc265052b610f4f4f4307eada3f 100755 (executable)
@@ -44,7 +44,9 @@ my @Tests =
                         {OUT=>"50abf5706a150990a08b2c5ea40fa0e585554732  f\n"}],
      ['million-a', {IN=> {f=> 'a' x 1000000}},
                         {OUT=>"34aa973cd4c4daa4f61eeb2bdbad27316534016f  f\n"}],
-     ['bs-sha', {IN=> {".\\foo"=> ''}},
+     ['bs-sha-1', {IN=> {".\nfoo"=> ''}},
+                        {OUT=>"\\$sha_degenerate  .\\nfoo\n"}],
+     ['bs-sha-2', {IN=> {".\\foo"=> ''}},
                         {OUT=>"\\$sha_degenerate  .\\\\foo\n"}],
      # The sha1sum and md5sum drivers share a lot of code.
      # Ensure that sha1sum does *not* share the part that makes