···7878 val is_relative : string -> bool
7979 val is_implicit : string -> bool
8080 val check_suffix : string -> string -> bool
8181- val chop_suffix_opt : suffix:string -> string -> string option
8281 val temp_dir_name : string
8382 val quote : string -> string
8483 val quote_command :
···9796 let is_relative n = String.length n < 1 || n.[0] <> '/'
9897 let is_implicit n =
9998 is_relative n
100100- && (String.length n < 2 || String.sub n 0 2 <> "./")
101101- && (String.length n < 3 || String.sub n 0 3 <> "../")
9999+ && not (String.starts_with n ~prefix:"./")
100100+ && not (String.starts_with n ~prefix:"../")
102101 let check_suffix name suff =
103102 String.ends_with ~suffix:suff name
104103105105- let chop_suffix_opt ~suffix filename =
106106- let len_s = String.length suffix and len_f = String.length filename in
107107- if len_f >= len_s then
108108- let r = String.sub filename (len_f - len_s) len_s in
109109- if r = suffix then
110110- Some (String.sub filename 0 (len_f - len_s))
111111- else
112112- None
113113- else
114114- None
115115-116104 let temp_dir_name =
117105 try Sys.getenv "TMPDIR" with Not_found -> "/tmp"
118106 let quote = generic_quote "'\\''"
···139127 && (String.length n < 2 || n.[1] <> ':')
140128 let is_implicit n =
141129 is_relative n
142142- && (String.length n < 2 || String.sub n 0 2 <> "./")
143143- && (String.length n < 2 || String.sub n 0 2 <> ".\\")
144144- && (String.length n < 3 || String.sub n 0 3 <> "../")
145145- && (String.length n < 3 || String.sub n 0 3 <> "..\\")
146146- let check_suffix name suff =
147147- String.length name >= String.length suff &&
148148- (let s = String.sub name (String.length name - String.length suff)
149149- (String.length suff) in
150150- String.lowercase_ascii s = String.lowercase_ascii suff)
151151-152152- let chop_suffix_opt ~suffix filename =
130130+ && not (String.starts_with n ~prefix:"./")
131131+ && not (String.starts_with n ~prefix:".\\")
132132+ && not (String.starts_with n ~prefix:"../")
133133+ && not (String.starts_with n ~prefix:"..\\")
134134+ let check_suffix filename suffix =
153135 let len_s = String.length suffix and len_f = String.length filename in
154136 if len_f >= len_s then
155137 let r = String.sub filename (len_f - len_s) len_s in
156156- if String.lowercase_ascii r = String.lowercase_ascii suffix then
157157- Some (String.sub filename 0 (len_f - len_s))
158158- else
159159- None
138138+ String.lowercase_ascii r = String.lowercase_ascii suffix
160139 else
161161- None
140140+ false
162141163142 external temp_dir_name: unit -> string = "caml_sys_temp_dir_name"
164143 let temp_dir_name = temp_dir_name ()
···277256 let is_relative = Win32.is_relative
278257 let is_implicit = Win32.is_implicit
279258 let check_suffix = Win32.check_suffix
280280- let chop_suffix_opt = Win32.chop_suffix_opt
281259 let temp_dir_name = Unix.temp_dir_name
282260 let quote = Unix.quote
283261 let quote_command = Unix.quote_command
···303281 if check_suffix name suff
304282 then String.sub name 0 (String.length name - String.length suff)
305283 else invalid_arg "Filename.chop_suffix"
284284+285285+let chop_suffix_opt ~suffix name =
286286+ if check_suffix name suffix
287287+ then Some (String.sub name 0 (String.length name - String.length suffix))
288288+ else None
306289307290let extension_len name =
308291 let rec check i0 i =