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. >
