<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.string_of_size</title> </head> <body> <code class="code"><span class="keyword">let</span> string_of_size ?(fuzzy=<span class="keyword">false</span>) sz = <br> <span class="keyword">let</span> szstr i unt (cur_i, cur_unt, tl) = <br> <span class="keyword">let</span> tl =<br> (cur_i, cur_unt) :: tl<br> <span class="keyword">in</span><br> i, unt, tl<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> <span class="keyword">rec</span> decomp_continue fup i unt acc =<br> <span class="keyword">if</span> i = 0<span class="constructor">L</span> <span class="keyword">then</span><br> (<br> szstr i unt acc<br> )<br> <span class="keyword">else</span><br> (<br> </code><table><tr><td> </td><td><span class="comment">(** Continue with upper unit *)</span></td></tr></table><code class="code"><br> <span class="keyword">let</span> r =<br> <span class="constructor">Int64</span>.rem i 1024<span class="constructor">L</span><br> <span class="keyword">in</span><br> <span class="keyword">let</span> q =<br> <span class="constructor">Int64</span>.div i 1024<span class="constructor">L</span><br> <span class="keyword">in</span><br> decomp_start (szstr r unt acc) (fup q)<br> )<br> <br> <span class="keyword">and</span> decomp_start acc sz =<br> <span class="comment">(* Decompose size for current unit and try<br> * to use upper unit<br> *)</span><br> <span class="keyword">match</span> sz <span class="keyword">with</span> <br> <span class="keywordsign">|</span> <span class="constructor">TB</span> i <span class="keywordsign">-></span><br> szstr i <span class="string">"TB"</span> acc<br> <span class="keywordsign">|</span> <span class="constructor">GB</span> i <span class="keywordsign">-></span><br> decomp_continue (<span class="keyword">fun</span> n <span class="keywordsign">-></span> <span class="constructor">TB</span> n) i <span class="string">"GB"</span> acc<br> <span class="keywordsign">|</span> <span class="constructor">MB</span> i <span class="keywordsign">-></span><br> decomp_continue (<span class="keyword">fun</span> n <span class="keywordsign">-></span> <span class="constructor">GB</span> n) i <span class="string">"MB"</span> acc<br> <span class="keywordsign">|</span> <span class="constructor">KB</span> i <span class="keywordsign">-></span><br> decomp_continue (<span class="keyword">fun</span> n <span class="keywordsign">-></span> <span class="constructor">MB</span> n) i <span class="string">"KB"</span> acc<br> <span class="keywordsign">|</span> <span class="constructor">B</span> i <span class="keywordsign">-></span><br> decomp_continue (<span class="keyword">fun</span> n <span class="keywordsign">-></span> <span class="constructor">KB</span> n) i <span class="string">"B"</span> acc<br> <span class="keyword">in</span><br> <br> <span class="comment">(* Only accumulate significant unit in tail *)</span><br> <span class="keyword">let</span> only_significant_unit (cur_i, cur_unt, lst) = <br> <span class="keyword">let</span> significant_lst =<br> <span class="constructor">List</span>.filter <br> (<span class="keyword">fun</span> (i, _) <span class="keywordsign">-></span> i <> 0<span class="constructor">L</span>)<br> ((cur_i, cur_unt) :: lst)<br> <span class="keyword">in</span><br> <span class="keyword">match</span> significant_lst <span class="keyword">with</span><br> <span class="keywordsign">|</span> [] <span class="keywordsign">-></span> cur_i, cur_unt, []<br> <span class="keywordsign">|</span> (cur_i, cur_unt) :: tl <span class="keywordsign">-></span> (cur_i, cur_unt, tl)<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> main_i, main_unt, rem_lst =<br> only_significant_unit (decomp_start (0<span class="constructor">L</span>, <span class="string">"B"</span>, []) sz)<br> <span class="keyword">in</span><br> <br> <span class="keyword">if</span> fuzzy <span class="keyword">then</span><br> (<br> <span class="keyword">let</span> (_, rem) = <br> <span class="constructor">List</span>.fold_left<br> (<span class="keyword">fun</span> (div, acc) (i, _unt) <span class="keywordsign">-></span><br> <span class="keyword">let</span> acc = <br> acc +. ((<span class="constructor">Int64</span>.to_float i) /. div)<br> <span class="keyword">in</span><br> div *. 1024.0,<br> acc)<br> (1024.0, 0.0)<br> rem_lst<br> <span class="keyword">in</span><br> <span class="constructor">Printf</span>.sprintf <span class="string">"%.2f %s"</span> <br> ((<span class="constructor">Int64</span>.to_float main_i) +. rem) <br> main_unt<br> )<br> <span class="keyword">else</span><br> (<br> <span class="constructor">String</span>.concat <br> <span class="string">" "</span><br> (<span class="constructor">List</span>.map<br> (<span class="keyword">fun</span> (i, unt) <span class="keywordsign">-></span> <span class="constructor">Printf</span>.sprintf <span class="string">"%Ld %s"</span> i unt)<br> ((main_i, main_unt) :: rem_lst))<br> )</code></body></html>