Fine with me.

dd is often used in portable scripts.  Do we need to document this
as an extension, or has it already arrived in other implimentations?

> A gigabyte is like a megabyte, except it's bigger and better.
> 
> This adds support for g/G suffixes. It also updates and corrects the
> comments in the source. Also move the goto label out of the if.
> 
> Index: args.c
> ===================================================================
> RCS file: /cvs/src/bin/dd/args.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 args.c
> --- args.c    12 Feb 2014 01:18:36 -0000      1.22
> +++ args.c    23 Mar 2014 22:16:58 -0000
> @@ -312,13 +312,12 @@ f_conv(char *arg)
>  
>  /*
>   * Convert an expression of the following forms to a size_t
> - *   1) A positive decimal number.
> - *   2) A positive decimal number followed by a b (mult by 512).
> - *   3) A positive decimal number followed by a k (mult by 1024).
> - *   4) A positive decimal number followed by a m (mult by 1048576).
> - *   5) A positive decimal number followed by a w (mult by sizeof int)
> - *   6) Two or more positive decimal numbers (with/without k,b or w).
> - *      separated by x (also * for backwards compatibility), specifying
> + *   1) A positive decimal number, optionally followed by
> + *           b - multiply by 512.
> + *           k, m or g - multply by 1024 each.
> + *           w - multiply by sizeof int
> + *   2) Two or more of the above, separated by x
> + *      (or * for backwards compatibility), specifying
>   *      the product of the indicated values.
>   */
>  static size_t
> @@ -341,18 +340,24 @@ get_bsz(char *val)
>                       goto erange;
>               ++expr;
>               break;
> -     case 'k':
> -     case 'K':
> +     case 'g':
> +     case 'G':
>               t = num;
>               num *= 1024;
>               if (t > num)
>                       goto erange;
> -             ++expr;
> -             break;
> +             /* fallthrough */
>       case 'm':
>       case 'M':
>               t = num;
> -             num *= 1048576;
> +             num *= 1024;
> +             if (t > num)
> +                     goto erange;
> +             /* fallthrough */
> +     case 'k':
> +     case 'K':
> +             t = num;
> +             num *= 1024;
>               if (t > num)
>                       goto erange;
>               ++expr;
> @@ -374,23 +379,24 @@ get_bsz(char *val)
>                       t = num;
>                       num *= get_bsz(expr + 1);
>                       if (t > num)
> -erange:                              errx(1, "%s: %s", oper, 
> strerror(ERANGE));
> +                             goto erange;
>                       break;
>               default:
>                       errx(1, "%s: illegal numeric value", oper);
>       }
>       return (num);
> +erange:
> +     errx(1, "%s: %s", oper, strerror(ERANGE));
>  }
>  
>  /*
>   * Convert an expression of the following forms to an off_t
> - *   1) A positive decimal number.
> - *   2) A positive decimal number followed by a b (mult by 512).
> - *   3) A positive decimal number followed by a k (mult by 1024).
> - *   4) A positive decimal number followed by a m (mult by 1048576).
> - *   5) A positive decimal number followed by a w (mult by sizeof int)
> - *   6) Two or more positive decimal numbers (with/without k,b or w).
> - *      separated by x (also * for backwards compatibility), specifying
> + *   1) A positive decimal number, optionally followed by
> + *           b - multiply by 512.
> + *           k, m or g - multply by 1024 each.
> + *           w - multiply by sizeof int
> + *   2) Two or more of the above, separated by x
> + *      (or * for backwards compatibility), specifying
>   *      the product of the indicated values.
>   */
>  static off_t
> @@ -413,18 +419,24 @@ get_off(char *val)
>                       goto erange;
>               ++expr;
>               break;
> -     case 'k':
> -     case 'K':
> +     case 'g':
> +     case 'G':
>               t = num;
>               num *= 1024;
>               if (t > num)
>                       goto erange;
> -             ++expr;
> -             break;
> +             /* fallthrough */
>       case 'm':
>       case 'M':
>               t = num;
> -             num *= 1048576;
> +             num *= 1024;
> +             if (t > num)
> +                     goto erange;
> +             /* fallthrough */
> +     case 'k':
> +     case 'K':
> +             t = num;
> +             num *= 1024;
>               if (t > num)
>                       goto erange;
>               ++expr;
> @@ -446,10 +458,12 @@ get_off(char *val)
>                       t = num;
>                       num *= get_off(expr + 1);
>                       if (t > num)
> -erange:                              errx(1, "%s: %s", oper, 
> strerror(ERANGE));
> +                             goto erange;
>                       break;
>               default:
>                       errx(1, "%s: illegal numeric value", oper);
>       }
>       return (num);
> +erange:
> +     errx(1, "%s: %s", oper, strerror(ERANGE));
>  }
> Index: dd.1
> ===================================================================
> RCS file: /cvs/src/bin/dd/dd.1,v
> retrieving revision 1.29
> diff -u -p -r1.29 dd.1
> --- dd.1      14 Feb 2014 17:27:58 -0000      1.29
> +++ dd.1      23 Mar 2014 22:18:41 -0000
> @@ -305,11 +305,13 @@ or
>  .Sq m
>  or
>  .Sq M ,
> +.Sq g
> +or
> +.Sq G ,
>  or
>  .Sq w ,
> -the number
> -is multiplied by 512, 1024 (1K), 1048576 (1M), or the number of bytes
> -in an integer, respectively.
> +the number is multiplied by 512, 1024 (1K), 1048576 (1M), 1073741824 (1G),
> +or the number of bytes in an integer, respectively.
>  Two or more numbers may be separated by an
>  .Sq x
>  to indicate a product.
> 

Reply via email to