From c36ca79e04e044dd3713f05ae4f8907a55544bfa Mon Sep 17 00:00:00 2001
From: Andre Maroneze <andre.maroneze@cea.fr>
Date: Fri, 16 Jul 2021 23:27:11 +0200
Subject: [PATCH] [Makefile] fix handling of quoted filenames in
 check_newlines/isutf8

---
 Makefile              |  8 ++++----
 bin/check_newlines.ml | 24 ++++++++++++++++++++++--
 bin/isutf8.ml         | 25 +++++++++++++++++++++++--
 3 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/Makefile b/Makefile
index 62d72ea62cc..85c45eda460 100644
--- a/Makefile
+++ b/Makefile
@@ -2146,9 +2146,9 @@ CHECK_NEWLINES:=./bin/check_newlines$(EXE)
 $(CHECK_NEWLINES): bin/check_newlines.ml
 	$(PRINT_MAKING)	$@
 ifeq ($(OCAMLBEST),opt)
-	$(OCAMLOPT) unix.cmxa $< -o $@
+	$(OCAMLOPT) str.cmxa unix.cmxa $< -o $@
 else
-	$(OCAMLC) unix.cma $< -o $@
+	$(OCAMLC) str.cma unix.cma $< -o $@
 endif
 
 check-newlines-clean:
@@ -2161,9 +2161,9 @@ ISUTF8:=./bin/isutf8$(EXE)
 $(ISUTF8): bin/isutf8.ml
 	$(PRINT_MAKING)	$@
 ifeq ($(OCAMLBEST),opt)
-	$(OCAMLOPT) $< -o $@
+	$(OCAMLOPT) str.cmxa $< -o $@
 else
-	$(OCAMLC) $< -o $@
+	$(OCAMLC) str.cma $< -o $@
 endif
 
 isutf8-clean:
diff --git a/bin/check_newlines.ml b/bin/check_newlines.ml
index df74f3ae3dc..b2166d668d6 100644
--- a/bin/check_newlines.ml
+++ b/bin/check_newlines.ml
@@ -1,5 +1,17 @@
 module StringSet = Set.Make(String)
 
+let unquote_filename filename =
+  let n = String.length filename in
+  let r =
+    if n > 1 && String.get filename 0 = '"' &&
+       String.get filename (n - 1) = '"'
+    then
+      String.sub filename 1 (n-2)
+    else
+      filename
+  in
+  Str.global_replace (Str.regexp "\\\\") "" r
+
 (* returns true for empty files *)
 let is_last_byte_newline filename =
   try
@@ -17,9 +29,10 @@ let is_last_byte_newline filename =
       close_in ic;
       true
   with
-  | Sys_error _ ->
+  | Sys_error msg ->
     (* possibly a non-existing file (e.g. with spaces); ignoring *)
-    Format.printf "could not open, ignoring file: %s" filename;
+    Format.printf "check_newlines: cannot open, ignoring file: %s (%s)@."
+      filename msg;
     true
 
 (* usage: first argument is a file name containing a list of files
@@ -38,6 +51,13 @@ let () =
     try
       while true; do
         let filename = input_line file_list_ic in
+        let filename =
+          (* assume no empty filenames *)
+          if String.get filename 0 = '"' then
+            unquote_filename filename
+          else
+            filename
+        in
         if not (StringSet.mem filename to_ignore) &&
            not (is_last_byte_newline filename) then begin
           incr errors;
diff --git a/bin/isutf8.ml b/bin/isutf8.ml
index ccfedc46857..3e3ddef4e6e 100644
--- a/bin/isutf8.ml
+++ b/bin/isutf8.ml
@@ -1,5 +1,17 @@
 module StringSet = Set.Make(String)
 
+let unquote_filename filename =
+  let n = String.length filename in
+  let r =
+    if n > 1 && String.get filename 0 = '"' &&
+       String.get filename (n - 1) = '"'
+    then
+      String.sub filename 1 (n-2)
+    else
+      filename
+  in
+  Str.global_replace (Str.regexp "\\\\") "" r
+
 exception False
 
 let is_valid_utf8 filename =
@@ -32,14 +44,16 @@ let is_valid_utf8 filename =
       !extra = 0
     with
     | End_of_file ->
+      close_in ic;
       !extra = 0
     | False ->
       close_in ic;
       false
   with
-  | Sys_error _ ->
+  | Sys_error msg ->
     (* possibly a non-existing file (e.g. with spaces); ignoring *)
-    Format.printf "could not open, ignoring file: %s" filename;
+    Format.printf "isutf8: cannot open, ignoring file: %s (%s)@."
+      filename msg;
     true
 
 (* usage: first argument is a file name containing a list of files
@@ -57,6 +71,13 @@ let () =
     try
       while true; do
         let filename = input_line file_list_ic in
+        let filename =
+          (* assume no empty filenames *)
+          if String.get filename 0 = '"' then
+            unquote_filename filename
+          else
+            filename
+        in
         if not (StringSet.mem filename to_ignore)
         && not (is_valid_utf8 filename) then begin
           incr errors;
-- 
GitLab