diff --git a/Makefile b/Makefile index 62d72ea62cccfa57664f1708a1d8b5fc029ce20d..85c45eda460793efda32e1314da7c0a82062e44b 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 df74f3ae3dc3c7ae9f78588ddc9d6213fc78c462..b2166d668d639dc8746cbb2fd443b277dd849f9e 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 ccfedc4685785beb706d7fa65dfc88f013719fc1..3e3ddef4e6e75ad9dee3009b06ffa1e925eb4254 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;