|
170 | 170 | <span id="165">165</span>
|
171 | 171 | <span id="166">166</span>
|
172 | 172 | <span id="167">167</span>
|
| 173 | +<span id="168">168</span> |
| 174 | +<span id="169">169</span> |
| 175 | +<span id="170">170</span> |
| 176 | +<span id="171">171</span> |
| 177 | +<span id="172">172</span> |
| 178 | +<span id="173">173</span> |
| 179 | +<span id="174">174</span> |
| 180 | +<span id="175">175</span> |
| 181 | +<span id="176">176</span> |
| 182 | +<span id="177">177</span> |
| 183 | +<span id="178">178</span> |
173 | 184 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
174 | 185 | <span class="comment">// *</span>
|
175 | 186 | <span class="comment">// * (c) T. Jameson Little <t.jameson.little@gmail.com></span>
|
|
195 | 206 | <span class="kw">static</span> <span class="ident">SUMMARY</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"Checksum and count the blocks in a file.\n\
|
196 | 207 | With no FILE, or when FILE is -, read standard input."</span>;
|
197 | 208 |
|
| 209 | +<span class="comment">// This can be replaced with usize::div_ceil once it is stabilized.</span> |
| 210 | +<span class="comment">// This implementation approach is optimized for when `b` is a constant,</span> |
| 211 | +<span class="comment">// particularly a power of two.</span> |
| 212 | +<span class="kw">const</span> <span class="kw">fn</span> <span class="ident">div_ceil</span>(<span class="ident">a</span>: <span class="ident">usize</span>, <span class="ident">b</span>: <span class="ident">usize</span>) -> <span class="ident">usize</span> { |
| 213 | + (<span class="ident">a</span> <span class="op">+</span> <span class="ident">b</span> <span class="op">-</span> <span class="number">1</span>) <span class="op">/</span> <span class="ident">b</span> |
| 214 | +} |
| 215 | + |
198 | 216 | <span class="kw">fn</span> <span class="ident">bsd_sum</span>(<span class="kw-2">mut</span> <span class="ident">reader</span>: <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">></span>) -> (<span class="ident">usize</span>, <span class="ident">u16</span>) {
|
199 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> [<span class="number">0</span>; <span class="number">1024</span>]; |
200 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">blocks_read</span> <span class="op">=</span> <span class="number">0</span>; |
| 217 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> [<span class="number">0</span>; <span class="number">4096</span>]; |
| 218 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">bytes_read</span> <span class="op">=</span> <span class="number">0</span>; |
201 | 219 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">checksum</span>: <span class="ident">u16</span> <span class="op">=</span> <span class="number">0</span>;
|
202 | 220 | <span class="kw">loop</span> {
|
203 | 221 | <span class="kw">match</span> <span class="ident">reader</span>.<span class="ident">read</span>(<span class="kw-2">&mut</span> <span class="ident">buf</span>) {
|
204 | 222 | <span class="prelude-val">Ok</span>(<span class="ident">n</span>) <span class="kw">if</span> <span class="ident">n</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> => {
|
205 |
| - <span class="ident">blocks_read</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>; |
| 223 | + <span class="ident">bytes_read</span> <span class="op">+</span><span class="op">=</span> <span class="ident">n</span>; |
206 | 224 | <span class="kw">for</span> <span class="kw-2">&</span><span class="ident">byte</span> <span class="kw">in</span> <span class="ident">buf</span>[..<span class="ident">n</span>].<span class="ident">iter</span>() {
|
207 | 225 | <span class="ident">checksum</span> <span class="op">=</span> (<span class="ident">checksum</span> <span class="op">></span><span class="op">></span> <span class="number">1</span>) <span class="op">+</span> ((<span class="ident">checksum</span> <span class="op">&</span> <span class="number">1</span>) <span class="op"><</span><span class="op"><</span> <span class="number">15</span>);
|
208 | 226 | <span class="ident">checksum</span> <span class="op">=</span> <span class="ident">checksum</span>.<span class="ident">wrapping_add</span>(<span class="ident">u16::from</span>(<span class="ident">byte</span>));
|
|
212 | 230 | }
|
213 | 231 | }
|
214 | 232 |
|
| 233 | + <span class="comment">// Report blocks read in terms of 1024-byte blocks.</span> |
| 234 | + <span class="kw">let</span> <span class="ident">blocks_read</span> <span class="op">=</span> <span class="ident">div_ceil</span>(<span class="ident">bytes_read</span>, <span class="number">1024</span>); |
215 | 235 | (<span class="ident">blocks_read</span>, <span class="ident">checksum</span>)
|
216 | 236 | }
|
217 | 237 |
|
218 | 238 | <span class="kw">fn</span> <span class="ident">sysv_sum</span>(<span class="kw-2">mut</span> <span class="ident">reader</span>: <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">></span>) -> (<span class="ident">usize</span>, <span class="ident">u16</span>) {
|
219 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> [<span class="number">0</span>; <span class="number">512</span>]; |
220 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">blocks_read</span> <span class="op">=</span> <span class="number">0</span>; |
| 239 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> [<span class="number">0</span>; <span class="number">4096</span>]; |
| 240 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">bytes_read</span> <span class="op">=</span> <span class="number">0</span>; |
221 | 241 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">ret</span> <span class="op">=</span> <span class="number">0u32</span>;
|
222 | 242 |
|
223 | 243 | <span class="kw">loop</span> {
|
224 | 244 | <span class="kw">match</span> <span class="ident">reader</span>.<span class="ident">read</span>(<span class="kw-2">&mut</span> <span class="ident">buf</span>) {
|
225 | 245 | <span class="prelude-val">Ok</span>(<span class="ident">n</span>) <span class="kw">if</span> <span class="ident">n</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> => {
|
226 |
| - <span class="ident">blocks_read</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>; |
| 246 | + <span class="ident">bytes_read</span> <span class="op">+</span><span class="op">=</span> <span class="ident">n</span>; |
227 | 247 | <span class="kw">for</span> <span class="kw-2">&</span><span class="ident">byte</span> <span class="kw">in</span> <span class="ident">buf</span>[..<span class="ident">n</span>].<span class="ident">iter</span>() {
|
228 | 248 | <span class="ident">ret</span> <span class="op">=</span> <span class="ident">ret</span>.<span class="ident">wrapping_add</span>(<span class="ident">u32::from</span>(<span class="ident">byte</span>));
|
229 | 249 | }
|
|
235 | 255 | <span class="ident">ret</span> <span class="op">=</span> (<span class="ident">ret</span> <span class="op">&</span> <span class="number">0xffff</span>) <span class="op">+</span> (<span class="ident">ret</span> <span class="op">></span><span class="op">></span> <span class="number">16</span>);
|
236 | 256 | <span class="ident">ret</span> <span class="op">=</span> (<span class="ident">ret</span> <span class="op">&</span> <span class="number">0xffff</span>) <span class="op">+</span> (<span class="ident">ret</span> <span class="op">></span><span class="op">></span> <span class="number">16</span>);
|
237 | 257 |
|
| 258 | + <span class="comment">// Report blocks read in terms of 512-byte blocks.</span> |
| 259 | + <span class="kw">let</span> <span class="ident">blocks_read</span> <span class="op">=</span> <span class="ident">div_ceil</span>(<span class="ident">bytes_read</span>, <span class="number">512</span>); |
238 | 260 | (<span class="ident">blocks_read</span>, <span class="ident">ret</span> <span class="kw">as</span> <span class="ident">u16</span>)
|
239 | 261 | }
|
240 | 262 |
|
|
0 commit comments