@@ -16,7 +16,7 @@ use uucore::error::{FromIo, UResult, USimpleError, UUsageError};
1616use uucore:: format_usage;
1717use uucore:: translate;
1818
19- use uucore:: parser:: parse_size:: { ParseSizeError , parse_size_u64 } ;
19+ use uucore:: parser:: parse_size:: { ParseSizeError , Parser , allow_list_with_all_suffixes } ;
2020
2121#[ derive( Debug , Eq , PartialEq ) ]
2222enum TruncateMode {
@@ -298,7 +298,7 @@ fn is_modifier(c: char) -> bool {
298298
299299/// Parse a size string with optional modifier symbol as its first character.
300300///
301- /// A size string is as described in [`parse_size_u64 `]. The first character
301+ /// A size string is as described in [`Parser::parse_u64 `]. The first character
302302/// of `size_string` might be a modifier symbol, like `'+'` or
303303/// `'<'`. The first element of the pair returned by this function
304304/// indicates which modifier symbol was present, or
@@ -323,15 +323,20 @@ fn parse_mode_and_size(size_string: &str) -> Result<TruncateMode, ParseSizeError
323323 if is_modifier ( c) {
324324 size_string = & size_string[ 1 ..] ;
325325 }
326- parse_size_u64 ( size_string) . map ( match c {
327- '+' => TruncateMode :: Extend ,
328- '-' => TruncateMode :: Reduce ,
329- '<' => TruncateMode :: AtMost ,
330- '>' => TruncateMode :: AtLeast ,
331- '/' => TruncateMode :: RoundDown ,
332- '%' => TruncateMode :: RoundUp ,
333- _ => TruncateMode :: Absolute ,
334- } )
326+ let allow_list = allow_list_with_all_suffixes ( "EgGkKmMPQRtTYZ" ) ;
327+ let allow_list_ref = allow_list. iter ( ) . map ( AsRef :: as_ref) . collect :: < Vec < & str > > ( ) ;
328+ Parser :: default ( )
329+ . with_allow_list ( & allow_list_ref)
330+ . parse_u64 ( size_string)
331+ . map ( match c {
332+ '+' => TruncateMode :: Extend ,
333+ '-' => TruncateMode :: Reduce ,
334+ '<' => TruncateMode :: AtMost ,
335+ '>' => TruncateMode :: AtLeast ,
336+ '/' => TruncateMode :: RoundDown ,
337+ '%' => TruncateMode :: RoundUp ,
338+ _ => TruncateMode :: Absolute ,
339+ } )
335340 } else {
336341 Err ( ParseSizeError :: ParseFailure ( size_string. to_string ( ) ) )
337342 }
@@ -351,6 +356,9 @@ mod tests {
351356 assert_eq ! ( parse_mode_and_size( ">10" ) , Ok ( TruncateMode :: AtLeast ( 10 ) ) ) ;
352357 assert_eq ! ( parse_mode_and_size( "/10" ) , Ok ( TruncateMode :: RoundDown ( 10 ) ) ) ;
353358 assert_eq ! ( parse_mode_and_size( "%10" ) , Ok ( TruncateMode :: RoundUp ( 10 ) ) ) ;
359+ assert_eq ! ( parse_mode_and_size( "1kB" ) , Ok ( TruncateMode :: Absolute ( 1000 ) ) ) ;
360+ assert_eq ! ( parse_mode_and_size( "1kD" ) , Ok ( TruncateMode :: Absolute ( 1000 ) ) ) ;
361+ assert ! ( parse_mode_and_size( "1b" ) . is_err( ) ) ;
354362 }
355363
356364 #[ test]
0 commit comments