<html><head> <link rel="stylesheet" href="style.css" type="text/css"> <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"> <link rel="Start" href="index.html"> <link title="Index of types" rel=Appendix href="index_types.html"> <link title="Index of exceptions" rel=Appendix href="index_exceptions.html"> <link title="Index of values" rel=Appendix href="index_values.html"> <link title="Index of modules" rel=Appendix href="index_modules.html"> <link title="Index of module types" rel=Appendix href="index_module_types.html"> <link title="FileUtil" rel="Chapter" href="FileUtil.html"> <link title="FileUtilStr" rel="Chapter" href="FileUtilStr.html"> <link title="FilePath" rel="Chapter" href="FilePath.html"><title>FileUtil.which</title> </head> <body> <code class="code"><span class="keyword">let</span> which ?(path) fln =<br> <span class="keyword">let</span> real_path =<br> <span class="keyword">match</span> path <span class="keyword">with</span><br> <span class="keywordsign">|</span> <span class="constructor">None</span> <span class="keywordsign">-></span><br> path_of_string <br> (<span class="keyword">try</span><br> <span class="constructor">Sys</span>.getenv <span class="string">"PATH"</span><br> <span class="keyword">with</span> <span class="constructor">Not_found</span> <span class="keywordsign">-></span><br> <span class="string">""</span>)<br> <span class="keywordsign">|</span> <span class="constructor">Some</span> x <span class="keywordsign">-></span><br> x<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> exec_test = <br> test (<span class="constructor">And</span>(<span class="constructor">Is_exec</span>,<span class="constructor">Is_file</span>))<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> which_path =<br> <span class="keyword">match</span> <span class="constructor">Sys</span>.os_type <span class="keyword">with</span><br> <span class="keywordsign">|</span> <span class="string">"Win32"</span> <span class="keywordsign">-></span><br> (<br> <span class="keyword">let</span> real_ext =<br> <span class="constructor">List</span>.map <br> (<span class="keyword">fun</span> dot_ext <span class="keywordsign">-></span><br> <span class="comment">(* Remove leading "." if it exists *)</span><br> <span class="keyword">if</span> (<span class="constructor">String</span>.length dot_ext) >= 1 <span class="keywordsign">&&</span> dot_ext.[0] = <span class="string">'.'</span> <span class="keyword">then</span><br> <span class="constructor">String</span>.sub dot_ext 1 ((<span class="constructor">String</span>.length dot_ext) - 1)<br> <span class="keyword">else</span><br> dot_ext)<br> <span class="comment">(* Extract possible extension from PATHEXT *)</span><br> (path_of_string <br> (<span class="keyword">try</span><br> <span class="constructor">Sys</span>.getenv <span class="string">"PATHEXT"</span><br> <span class="keyword">with</span> <span class="constructor">Not_found</span> <span class="keywordsign">-></span><br> <span class="string">""</span>))<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> to_filename dirname ext =<br> add_extension (concat dirname fln) ext<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> ctst dirname ext = <br> exec_test (to_filename dirname ext)<br> <span class="keyword">in</span><br> <br> <span class="constructor">List</span>.fold_left<br> (<span class="keyword">fun</span> found dirname <span class="keywordsign">-></span><br> <span class="keyword">if</span> found = <span class="constructor">None</span> <span class="keyword">then</span> <br> (<br> <span class="keyword">try</span> <br> <span class="keyword">let</span> ext =<br> <span class="constructor">List</span>.find (ctst dirname) real_ext<br> <span class="keyword">in</span><br> <span class="constructor">Some</span> (to_filename dirname ext)<br> <span class="keyword">with</span> <span class="constructor">Not_found</span> <span class="keywordsign">-></span> <br> <span class="constructor">None</span><br> )<br> <span class="keyword">else</span><br> found)<br> <span class="constructor">None</span><br> real_path<br> )<br> <span class="keywordsign">|</span> _ <span class="keywordsign">-></span><br> (<br> <span class="keyword">let</span> to_filename dirname =<br> concat dirname fln<br> <span class="keyword">in</span><br> <br> <span class="keyword">try</span><br> <span class="constructor">Some</span> <br> (to_filename <br> (<span class="constructor">List</span>.find <br> (<span class="keyword">fun</span> dirname <span class="keywordsign">-></span> <br> exec_test (to_filename dirname)) real_path))<br> <span class="keyword">with</span> <span class="constructor">Not_found</span> <span class="keywordsign">-></span><br> <span class="constructor">None</span><br> )<br> <span class="keyword">in</span><br> <span class="keyword">match</span> which_path <span class="keyword">with</span> <br> <span class="keywordsign">|</span> <span class="constructor">Some</span> fn <span class="keywordsign">-></span> fn<br> <span class="keywordsign">|</span> <span class="constructor">None</span> <span class="keywordsign">-></span> raise <span class="constructor">Not_found</span></code></body></html>