1 /* Reformat numbers like 11505426432 to the more human-readable 11G
2 Copyright (C) 2012 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include <sys/types.h>
32 /* The official name of this program (e.g., no 'g' prefix). */
33 #define PROGRAM_NAME "numfmt"
35 #define AUTHORS proper_name ("Assaf Gordon")
37 /* Exit code when some numbers fail to convert. */
38 enum { EXIT_CONVERSION_WARNINGS = 2 };
42 FROM_OPTION = CHAR_MAX + 1,
60 scale_none, /* the default: no scaling. */
61 scale_auto, /* --from only. */
64 scale_IEC_I /* 'i' suffix is required. */
67 static char const *const scale_from_args[] =
69 "none", "auto", "si", "iec", "iec-i", NULL
72 static enum scale_type const scale_from_types[] =
74 scale_none, scale_auto, scale_SI, scale_IEC, scale_IEC_I
77 static char const *const scale_to_args[] =
79 "none", "si", "iec", "iec-i", NULL
82 static enum scale_type const scale_to_types[] =
84 scale_none, scale_SI, scale_IEC, scale_IEC_I
97 static char const *const round_args[] =
99 "up", "down", "from-zero", "towards-zero", "nearest", NULL
102 static enum round_type const round_types[] =
104 round_ceiling, round_floor, round_from_zero, round_to_zero, round_nearest
116 static char const *const inval_args[] =
118 "abort", "fail", "warn", "ignore", NULL
121 static enum inval_type const inval_types[] =
123 inval_abort, inval_fail, inval_warn, inval_ignore
126 static struct option const longopts[] =
128 {"from", required_argument, NULL, FROM_OPTION},
129 {"from-unit", required_argument, NULL, FROM_UNIT_OPTION},
130 {"to", required_argument, NULL, TO_OPTION},
131 {"to-unit", required_argument, NULL, TO_UNIT_OPTION},
132 {"round", required_argument, NULL, ROUND_OPTION},
133 {"padding", required_argument, NULL, PADDING_OPTION},
134 {"suffix", required_argument, NULL, SUFFIX_OPTION},
135 {"grouping", no_argument, NULL, GROUPING_OPTION},
136 {"delimiter", required_argument, NULL, 'd'},
137 {"field", required_argument, NULL, FIELD_OPTION},
138 {"debug", no_argument, NULL, DEBUG_OPTION},
139 {"-devdebug", no_argument, NULL, DEV_DEBUG_OPTION},
140 {"header", optional_argument, NULL, HEADER_OPTION},
141 {"format", required_argument, NULL, FORMAT_OPTION},
142 {"invalid", required_argument, NULL, INVALID_OPTION},
143 {GETOPT_HELP_OPTION_DECL},
144 {GETOPT_VERSION_OPTION_DECL},
148 /* If delimiter has this value, blanks separate fields. */
149 enum { DELIMITER_DEFAULT = CHAR_MAX + 1 };
151 /* Maximum number of digits we can safely handle
152 without precision loss, if scaling is 'none'. */
153 enum { MAX_UNSCALED_DIGITS = 18 };
155 /* Maximum number of digits we can work with.
156 This is equivalent to 999Y.
157 NOTE: 'long double' can handle more than that, but there's
158 no official suffix assigned beyond Yotta (1000^8). */
159 enum { MAX_ACCEPTABLE_DIGITS = 27 };
161 static enum scale_type scale_from = scale_none;
162 static enum scale_type scale_to = scale_none;
163 static enum round_type _round = round_from_zero;
164 static enum inval_type _invalid = inval_abort;
165 static const char *suffix = NULL;
166 static uintmax_t from_unit_size = 1;
167 static uintmax_t to_unit_size = 1;
168 static int grouping = 0;
169 static char *padding_buffer = NULL;
170 static size_t padding_buffer_size = 0;
171 static long int padding_width = 0;
172 static const char *format_str = NULL;
173 static char *format_str_prefix = NULL;
174 static char *format_str_suffix = NULL;
176 /* By default, any conversion error will terminate the program. */
177 static int conv_exit_code = EXIT_CONVERSION_WARNINGS;
180 /* auto-pad each line based on skipped whitespace. */
181 static int auto_padding = 0;
182 static mbs_align_t padding_alignment = MBS_ALIGN_RIGHT;
183 static long int field = 1;
184 static int delimiter = DELIMITER_DEFAULT;
186 /* if non-zero, the first 'header' lines from STDIN are skipped. */
187 static uintmax_t header = 0;
189 /* Debug for users: print warnings to STDERR about possible
190 error (similar to sort's debug). */
191 static int debug = 0;
193 /* debugging for developers - to be removed in final version? */
194 static int dev_debug = 0;
196 /* will be set according to the current locale. */
197 static const char *decimal_point;
198 static int decimal_point_length;
202 default_scale_base (enum scale_type scale)
219 valid_suffix (const char suf)
221 static const char *valid_suffixes = "KMGTPEZY";
222 return (strchr (valid_suffixes, suf) != NULL);
226 suffix_power (const char suf)
230 case 'K': /* kilo or kibi. */
233 case 'M': /* mega or mebi. */
236 case 'G': /* giga or gibi. */
239 case 'T': /* tera or tebi. */
242 case 'P': /* peta or pebi. */
245 case 'E': /* exa or exbi. */
248 case 'Z': /* zetta or 2**70. */
251 case 'Y': /* yotta or 2**80. */
254 default: /* should never happen. assert? */
259 static inline const char *
260 suffix_power_character (unsigned int power)
296 /* Similar to 'powl(3)' but without requiring 'libm'. */
298 powerld (long double base, unsigned int x)
300 long double result = base;
302 return 1; /* note for test coverage: this is never
303 reached, as 'powerld' won't be called if
304 there's no suffix, hence, no "power". */
306 /* TODO: check for overflow, inf? */
312 /* Similar to 'fabs(3)' but without requiring 'libm'. */
313 static inline long double
314 absld (long double val)
316 return val < 0 ? -val : val;
319 /* Scale down 'val', returns 'updated val' and 'x', such that
320 val*base^X = original val
321 Similar to "frexpl(3)" but without requiring 'libm',
322 allowing only integer scale, limited functionality and error checking. */
324 expld (long double val, unsigned int base, unsigned int /*output */ *x)
326 unsigned int power = 0;
328 if (val >= -LDBL_MAX && val <= LDBL_MAX)
330 while (absld (val) >= base)
341 /* EXTREMELY limited 'ceil' - without 'libm'.
342 Assumes values that fit in intmax_t. */
343 static inline intmax_t
344 simple_round_ceiling (long double val)
346 intmax_t intval = val;
352 /* EXTREMELY limited 'floor' - without 'libm'.
353 Assumes values that fit in intmax_t. */
354 static inline intmax_t
355 simple_round_floor (long double val)
357 return -simple_round_ceiling (-val);
360 /* EXTREMELY limited 'round away from zero'.
361 Assumes values that fit in intmax_t. */
362 static inline intmax_t
363 simple_round_from_zero (long double val)
365 return val < 0 ? simple_round_floor (val) : simple_round_ceiling (val);
368 /* EXTREMELY limited 'round away to zero'.
369 Assumes values that fit in intmax_t. */
370 static inline intmax_t
371 simple_round_to_zero (long double val)
376 /* EXTREMELY limited 'round' - without 'libm'.
377 Assumes values that fit in intmax_t. */
378 static inline intmax_t
379 simple_round_nearest (long double val)
381 return val < 0 ? val - 0.5 : val + 0.5;
384 static inline intmax_t
385 simple_round (long double val, enum round_type t)
390 return simple_round_ceiling (val);
393 return simple_round_floor (val);
395 case round_from_zero:
396 return simple_round_from_zero (val);
399 return simple_round_to_zero (val);
402 return simple_round_nearest (val);
405 /* to silence the compiler - this should never happen. */
410 enum simple_strtod_error
413 SSE_OK_PRECISION_LOSS,
417 /* the following are returned by 'simple_strtod_human'. */
418 SSE_VALID_BUT_FORBIDDEN_SUFFIX,
423 /* Read an *integer* INPUT_STR,
424 but return the integer value in a 'long double' VALUE
425 hence, no UINTMAX_MAX limitation.
426 NEGATIVE is updated, and is stored separately from the VALUE
427 so that signbit() isn't required to determine the sign of -0..
428 ENDPTR is required (unlike strtod) and is used to store a pointer
429 to the character after the last character used in the conversion.
431 Note locale'd grouping is not supported,
432 nor is skipping of white-space supported.
435 SSE_OK - valid number.
436 SSE_OK_PRECISION_LOSS - if more than 18 digits were used.
437 SSE_OVERFLOW - if more than 27 digits (999Y) were used.
438 SSE_INVALID_NUMBER - if no digits were found. */
439 static enum simple_strtod_error
440 simple_strtod_int (const char *input_str,
441 char **endptr, long double *value, bool *negative)
443 enum simple_strtod_error e = SSE_OK;
446 unsigned int digits = 0;
448 if (*input_str == '-')
456 *endptr = (char *) input_str;
457 while (*endptr && isdigit (**endptr))
459 int digit = (**endptr) - '0';
461 /* can this happen in some strange locale? */
462 if (digit < 0 || digit > 9)
463 return SSE_INVALID_NUMBER;
465 if (digits > MAX_UNSCALED_DIGITS)
466 e = SSE_OK_PRECISION_LOSS;
469 if (digits > MAX_ACCEPTABLE_DIGITS)
478 return SSE_INVALID_NUMBER;
488 /* Read a floating-point INPUT_STR represented as "NNNN[.NNNNN]",
489 and return the value in a 'long double' VALUE.
490 ENDPTR is required (unlike strtod) and is used to store a pointer
491 to the character after the last character used in the conversion.
492 PRECISION is optional and used to indicate fractions are present.
494 Note locale'd grouping is not supported,
495 nor is skipping of white-space supported.
498 SSE_OK - valid number.
499 SSE_OK_PRECISION_LOSS - if more than 18 digits were used.
500 SSE_OVERFLOW - if more than 27 digits (999Y) were used.
501 SSE_INVALID_NUMBER - if no digits were found. */
502 static enum simple_strtod_error
503 simple_strtod_float (const char *input_str,
509 enum simple_strtod_error e = SSE_OK;
514 /* TODO: accept locale'd grouped values for the integral part. */
515 e = simple_strtod_int (input_str, endptr, value, &negative);
516 if (e != SSE_OK && e != SSE_OK_PRECISION_LOSS)
520 /* optional decimal point + fraction. */
521 if (STREQ_LEN (*endptr, decimal_point, decimal_point_length))
524 long double val_frac = 0;
527 (*endptr) += decimal_point_length;
528 enum simple_strtod_error e2 =
529 simple_strtod_int (*endptr, &ptr2, &val_frac, &neg_frac);
530 if (e2 != SSE_OK && e2 != SSE_OK_PRECISION_LOSS)
532 if (e2 == SSE_OK_PRECISION_LOSS)
533 e = e2; /* propagate warning. */
535 return SSE_INVALID_NUMBER;
537 /* number of digits in the fractions. */
538 size_t exponent = ptr2 - *endptr;
540 val_frac = ((long double) val_frac) / powerld (10, exponent);
551 *precision = exponent;
558 /* Read a 'human' INPUT_STR represented as "NNNN[.NNNNN] + suffix",
559 and return the value in a 'long double' VALUE,
560 with the precision of the input returned in PRECISION.
561 ENDPTR is required (unlike strtod) and is used to store a pointer
562 to the character after the last character used in the conversion.
563 ALLOWED_SCALING determines the scaling supported.
566 support locale'd grouping
567 accept scentific and hex floats (probably use strtold directly)
570 SSE_OK - valid number.
571 SSE_OK_PRECISION_LOSS - if more than 18 digits were used.
572 SSE_OVERFLOW - if more than 27 digits (999Y) were used.
573 SSE_INVALID_NUMBER - if no digits were found.
574 SSE_VALID_BUT_FORBIDDEN_SUFFIX
576 SSE_MISSING_I_SUFFIX */
577 static enum simple_strtod_error
578 simple_strtod_human (const char *input_str,
579 char **endptr, long double *value, size_t *precision,
580 enum scale_type allowed_scaling)
583 /* 'scale_auto' is checked below. */
584 int scale_base = default_scale_base (allowed_scaling);
587 error (0, 0, _("simple_strtod_human:\n input string: '%s'\n "
588 "locale decimal-point: '%s'\n"), input_str, decimal_point);
590 enum simple_strtod_error e =
591 simple_strtod_float (input_str, endptr, value, precision);
592 if (e != SSE_OK && e != SSE_OK_PRECISION_LOSS)
596 error (0, 0, _(" parsed numeric value: %Lf\n"
597 " input precision = %d\n"), *value, (int)*precision);
599 if (**endptr != '\0')
601 /* process suffix. */
603 /* Skip any blanks between the number and suffix. */
604 while (isblank (**endptr))
607 if (!valid_suffix (**endptr))
608 return SSE_INVALID_SUFFIX;
610 if (allowed_scaling == scale_none)
611 return SSE_VALID_BUT_FORBIDDEN_SUFFIX;
613 power = suffix_power (**endptr);
614 (*endptr)++; /* skip first suffix character. */
616 if (allowed_scaling == scale_auto && **endptr == 'i')
618 /* auto-scaling enabled, and the first suffix character
619 is followed by an 'i' (e.g. Ki, Mi, Gi). */
621 (*endptr)++; /* skip second ('i') suffix character. */
623 error (0, 0, _(" Auto-scaling, found 'i', switching to base %d\n"),
627 *precision = 0; /* Reset, to select precision based on scale. */
630 if (allowed_scaling == scale_IEC_I)
635 return SSE_MISSING_I_SUFFIX;
638 long double multiplier = powerld (scale_base, power);
641 error (0, 0, _(" suffix power=%d^%d = %Lf\n"),
642 scale_base, power, multiplier);
644 /* TODO: detect loss of precision and overflows. */
645 (*value) = (*value) * multiplier;
648 error (0, 0, _(" returning value: %Lf (%LG)\n"), *value, *value);
655 simple_strtod_fatal (enum simple_strtod_error err, char const *input_str)
657 char const *msgid = NULL;
661 case SSE_OK_PRECISION_LOSS:
663 /* should never happen - this function isn't called when OK. */
667 msgid = N_("value too large to be converted: '%s'");
670 case SSE_INVALID_NUMBER:
671 msgid = N_("invalid number: '%s'");
674 case SSE_VALID_BUT_FORBIDDEN_SUFFIX:
675 msgid = N_("rejecting suffix in input: '%s' (consider using --from)");
678 case SSE_INVALID_SUFFIX:
679 msgid = N_("invalid suffix in input: '%s'");
682 case SSE_MISSING_I_SUFFIX:
683 msgid = N_("missing 'i' suffix in input: '%s' (e.g Ki/Mi/Gi)");
688 if (_invalid != inval_ignore)
689 error (conv_exit_code, 0, gettext (msgid), input_str);
692 /* Convert VAL to a human format string in BUF. */
694 double_to_human (long double val, int precision,
695 char *buf, size_t buf_size,
696 enum scale_type scale, int group, enum round_type round)
699 error (0, 0, _("double_to_human:\n"));
701 if (scale == scale_none)
703 val *= powerld (10, precision);
704 val = simple_round (val, round);
705 val /= powerld (10, precision);
710 _(" no scaling, returning (grouped) value: %'.*Lf\n") :
711 _(" no scaling, returning value: %.*Lf\n"), precision, val);
713 int i = snprintf (buf, buf_size, (group) ? "%'.*Lf" : "%.*Lf",
715 if (i < 0 || i >= (int) buf_size)
716 error (EXIT_FAILURE, 0,
717 _("failed to prepare value '%Lf' for printing"), val);
721 /* Scaling requested by user. */
722 double scale_base = default_scale_base (scale);
724 /* Normalize val to scale. */
725 unsigned int power = 0;
726 val = expld (val, scale_base, &power);
728 error (0, 0, _(" scaled value to %Lf * %0.f ^ %d\n"),
729 val, scale_base, power);
731 /* Perform rounding. */
733 if (absld (val) < 10)
735 /* for values less than 10, we allow one decimal-point digit,
736 so adjust before rounding. */
740 val = simple_round (val, round);
741 /* two special cases after rounding:
742 1. a "999.99" can turn into 1000 - so scale down
743 2. a "9.99" can turn into 10 - so don't display decimal-point. */
744 if (absld (val) >= scale_base)
752 /* should "7.0" be printed as "7" ?
753 if removing the ".0" is preferred, enable the fourth condition. */
754 int show_decimal_point = (val != 0) && (absld (val) < 10) && (power > 0);
755 /* && (absld (val) > simple_round_floor (val))) */
758 error (0, 0, _(" after rounding, value=%Lf * %0.f ^ %d\n"),
759 val, scale_base, power);
761 snprintf (buf, buf_size, (show_decimal_point) ? "%.1Lf%s" : "%.0Lf%s",
762 val, suffix_power_character (power));
764 if (scale == scale_IEC_I && power > 0)
765 strncat (buf, "i", buf_size - strlen (buf) - 1);
768 error (0, 0, _(" returning value: '%s'\n"), buf);
773 /* Convert a string of decimal digits, N_STRING, with an optional suffix
774 to an integral value. Upon successful conversion, return that value.
775 If it cannot be converted, give a diagnostic and exit. */
777 unit_to_umax (const char *n_string)
783 s_err = xstrtoumax (n_string, &end, 10, &n, "KMGTPEZY");
785 if (s_err != LONGINT_OK || *end || n == 0)
786 error (EXIT_FAILURE, 0, _("invalid unit size: '%s'"), n_string);
793 setup_padding_buffer (size_t min_size)
795 if (padding_buffer_size > min_size)
798 padding_buffer_size = min_size + 1;
799 padding_buffer = realloc (padding_buffer, padding_buffer_size);
801 error (EXIT_FAILURE, 0, _("out of memory (requested %zu bytes)"),
802 padding_buffer_size);
808 if (status != EXIT_SUCCESS)
813 Usage: %s [OPTIONS] [NUMBER]\n\
816 Reformat NUMBER(s) from stdin or command arguments.\n\
818 emit_mandatory_arg_note ();
820 --from=UNIT auto-scale input numbers to UNITs. Default is 'none'.\n\
822 --from-unit=N specify the input unit size (instead of the default 1).\n\
823 --to=UNIT auto-scale output numbers to UNITs.\n\
825 --to-unit=N the output unit size (instead of the default 1).\n\
826 --round=METHOD the rounding method to use when scaling. METHOD can be:\n\
827 up, down, from-zero (default), towards-zero, nearest\n\
828 --suffix=SUFFIX add SUFFIX to output numbers, and accept optional SUFFIX\n\
830 --padding=N pad the output to N characters.\n\
831 Positive N will right-aligned. Negative N will left-align.\n\
832 Note: if the output is wider than N, padding is ignored.\n\
833 Default is to automatically pad if whitespace is found.\n\
834 --grouping group digits together (e.g. 1,000,000).\n\
835 Uses the locale-defined grouping (i.e. have no effect\n\
836 in C/POSIX locales).\n\
837 --header[=N] print (without converting) the first N header lines.\n\
838 N defaults to 1 if not specified.\n\
839 --field N replace the number in input field N (default is 1)\n\
840 -d, --delimiter=X use X instead of whitespace for field delimiter\n\
841 --format=FORMAT use printf style floating-point FORMAT.\n\
842 See FORMAT below for details.\n\
843 --invalid=MODE failure mode for invalid numbers: MODE can be:\n\
844 abort (the default), fail, warn, ignore.\n\
845 --debug print warnings about invalid input.\n\
848 fputs (HELP_OPTION_DESCRIPTION, stdout);
849 fputs (VERSION_OPTION_DESCRIPTION, stdout);
855 none No auto-scaling is done. Suffixes will trigger an error.\n\
856 auto Accept optional single-letter/two-letter suffix:\n\
861 si Accept optional single letter suffix:\n\
865 iec Accept optional single letter suffix:\n\
869 iec-i Accept optional two-letter suffix:\n\
878 FORMAT must be suitable for printing one floating-point argument '%f'.\n\
879 Optional quote (%'f) will enable --grouping (if supported by current locale).\n\
880 Optional width value (%10f) will pad output. Optional negative width values\n\
881 (%-10f) will left-pad output.\n\
887 Exit status is 0 if all input numbers were successfully converted.\n\
888 By default, %s will stop at the first conversion error with exit status 2.\n\
889 With --invalid='fail' a warning is printed for each conversion error\n\
890 and the exit status is 2. With --invalid='warn' each conversion error is\n\
891 diagnosed, but the exit status is 0. With --invalid='ignore' conversion\n\
892 errors are not diagnosed and the exit status is 0.\n\
903 $ %s --to=iec 2048\n\
905 $ %s --to=iec-i 4096\n\
907 $ echo 1K | %s --from=si\n\
909 $ echo 1K | %s --from=iec\n\
911 $ df | %s --header --field 2 --to=si\n\
912 $ ls -l | %s --header --field 5 --to=iec\n\
913 $ ls -lh | %s --header --field 5 --from=iec --padding=10\n\
914 $ ls -lh | %s --header --field 5 --from=iec --format %%10f\n\
916 program_name, program_name, program_name,
917 program_name, program_name, program_name,
918 program_name, program_name, program_name);
919 emit_ancillary_info ();
924 /* Given 'fmt' (a printf(3) compatible format string), extracts the following:
925 1. padding (e.g. %20f)
926 2. alignment (e.g. %-20f)
927 3. grouping (e.g. %'f)
929 Only a limited subset of printf(3) syntax is supported.
933 support %e %g etc. rather than just %f
936 1. This function sets the global variables:
937 padding_width, padding_alignment, grouping,
938 format_str_prefix, format_str_suffix
939 2. The function aborts on any errors. */
941 parse_format_string (char const *fmt)
944 size_t prefix_len = 0;
949 for (i = 0; !(fmt[i] == '%' && fmt[i + 1] != '%'); i += (fmt[i] == '%') + 1)
952 error (EXIT_FAILURE, 0,
953 _("format %s has no %% directive"), quote (fmt));
958 i += strspn (fmt + i, " ");
964 i += strspn (fmt + i, " ");
966 pad = strtol (fmt + i, &endptr, 10);
968 error (EXIT_FAILURE, 0,
969 _("invalid format %s (width overflow)"), quote (fmt));
971 if (endptr != (fmt + i) && pad != 0)
975 padding_alignment = MBS_ALIGN_LEFT;
976 padding_width = -pad;
986 error (EXIT_FAILURE, 0, _("format %s ends in %%"), quote (fmt));
989 error (EXIT_FAILURE, 0, _("invalid format %s,"
990 " directive must be %%['][-][N]f"),
995 for (; fmt[i] != '\0'; i += (fmt[i] == '%') + 1)
996 if (fmt[i] == '%' && fmt[i + 1] != '%')
997 error (EXIT_FAILURE, 0, _("format %s has too many %% directives"),
1002 format_str_prefix = xstrndup (fmt, prefix_len);
1003 if (!format_str_prefix)
1004 error (EXIT_FAILURE, 0, _("out of memory (requested %zu bytes)"),
1007 if (fmt[suffix_pos] != '\0')
1009 format_str_suffix = strdup (fmt + suffix_pos);
1010 if (!format_str_suffix)
1011 error (EXIT_FAILURE, 0, _("out of memory (requested %zu bytes)"),
1012 strlen (fmt + suffix_pos));
1016 error (0, 0, _("format String:\n input: %s\n grouping: %s\n"
1017 " padding width: %zu\n alignment: %s\n"
1018 " prefix: '%s'\n suffix: '%s'\n"),
1019 quote (fmt), (grouping) ? "yes" : "no",
1021 (padding_alignment == MBS_ALIGN_LEFT) ? "Left" : "Right",
1022 format_str_prefix, format_str_suffix);
1025 /* Parse a numeric value (with optional suffix) from a string.
1026 Returns a long double value, with input precision.
1028 If there's an error converting the string to value - exits with
1031 If there are any trailing characters after the number
1032 (besides a valid suffix) - exits with an error. */
1033 static enum simple_strtod_error
1034 parse_human_number (const char *str, long double /*output */ *value,
1039 enum simple_strtod_error e =
1040 simple_strtod_human (str, &ptr, value, precision, scale_from);
1041 if (e != SSE_OK && e != SSE_OK_PRECISION_LOSS)
1043 simple_strtod_fatal (e, str);
1047 if (ptr && *ptr != '\0')
1049 if (_invalid != inval_ignore)
1050 error (conv_exit_code, 0, _("invalid suffix in input '%s': '%s'"),
1052 e = SSE_INVALID_SUFFIX;
1058 /* Print the given VAL, using the requested representation.
1059 The number is printed to STDOUT, with padding and alignment. */
1061 prepare_padded_number (const long double val, size_t precision)
1063 /* Generate Output. */
1066 /* Can't reliably print too-large values without auto-scaling. */
1068 expld (val, 10, &x);
1069 if (scale_to == scale_none && x > MAX_UNSCALED_DIGITS)
1071 if (_invalid != inval_ignore)
1072 error (conv_exit_code, 0, _("value too large to be printed: '%Lg'"
1073 " (consider using --to)"), val);
1077 if (x > MAX_ACCEPTABLE_DIGITS - 1)
1079 if (_invalid != inval_ignore)
1080 error (conv_exit_code, 0, _("value too large to be printed: '%Lg'"
1081 " (cannot handle values > 999Y)"), val);
1085 double_to_human (val, precision, buf, sizeof (buf), scale_to, grouping,
1088 strncat (buf, suffix, sizeof (buf) - strlen (buf) -1);
1091 error (0, 0, _("formatting output:\n value: %Lf\n humanized: '%s'\n"),
1095 if (padding_width && strlen (buf) < padding_width)
1097 size_t w = padding_width;
1098 mbsalign (buf, padding_buffer, padding_buffer_size, &w,
1099 padding_alignment, MBA_UNIBYTE_ONLY);
1102 error (0, 0, _(" After padding: '%s'\n"), padding_buffer);
1107 setup_padding_buffer (strlen (buf) + 1);
1108 strcpy (padding_buffer, buf);
1115 print_padded_number (void)
1117 if (format_str_prefix)
1118 fputs (format_str_prefix, stdout);
1120 fputs (padding_buffer, stdout);
1122 if (format_str_suffix)
1123 fputs (format_str_suffix, stdout);
1126 /* Converts the TEXT number string to the requested representation,
1127 and handles automatic suffix addition. */
1129 process_suffixed_number (char *text, long double *result, size_t *precision)
1131 if (suffix && strlen (text) > strlen (suffix))
1133 char *possible_suffix = text + strlen (text) - strlen (suffix);
1135 if (STREQ (suffix, possible_suffix))
1137 /* trim suffix, ONLY if it's at the end of the text. */
1138 *possible_suffix = '\0';
1140 error (0, 0, _("trimming suffix '%s'\n"), suffix);
1145 error (0, 0, _("no valid suffix found\n"));
1149 /* Skip white space - always. */
1151 while (*p && isblank (*p))
1153 const unsigned int skip_count = text - p;
1155 /* setup auto-padding. */
1158 if (skip_count > 0 || field > 1)
1160 padding_width = strlen (text);
1161 setup_padding_buffer (padding_width);
1168 error (0, 0, _("setting Auto-Padding to %ld characters\n"),
1172 long double val = 0;
1173 enum simple_strtod_error e = parse_human_number (p, &val, precision);
1174 if (e == SSE_OK_PRECISION_LOSS && debug)
1175 error (0, 0, _("large input value '%s': possible precision loss"), p);
1177 if (from_unit_size != 1 || to_unit_size != 1)
1178 val = (val * from_unit_size) / to_unit_size;
1182 return (e == SSE_OK || e == SSE_OK_PRECISION_LOSS);
1185 /* Skip the requested number of fields in the input string.
1186 Returns a pointer to the *delimiter* of the requested field,
1187 or a pointer to NUL (if reached the end of the string). */
1188 static inline char *
1189 __attribute ((pure))
1190 skip_fields (char *buf, int fields)
1193 if (delimiter != DELIMITER_DEFAULT)
1195 if (*ptr == delimiter)
1197 while (*ptr && fields--)
1199 while (*ptr && *ptr == delimiter)
1201 while (*ptr && *ptr != delimiter)
1206 while (*ptr && fields--)
1208 while (*ptr && isblank (*ptr))
1210 while (*ptr && !isblank (*ptr))
1216 /* Parse a delimited string, and extracts the requested field.
1217 NOTE: the input buffer is modified.
1220 Maybe support multiple fields, though can always pipe output
1221 into another numfmt to process other fields.
1222 Maybe default to processing all fields rather than just first?
1225 _PREFIX, _DATA, _SUFFIX will point to the relevant positions
1226 in the input string, or be NULL if such a part doesn't exist. */
1228 extract_fields (char *line, int _field,
1229 char ** _prefix, char ** _data, char ** _suffix)
1237 error (0, 0, _("extracting Fields:\n input: '%s'\n field: %d\n"),
1242 /* skip the requested number of fields. */
1244 ptr = skip_fields (line, field - 1);
1247 /* not enough fields in the input - print warning? */
1249 error (0, 0, _(" TOO FEW FIELDS!\n prefix: '%s'\n"), *_prefix);
1258 *_suffix = skip_fields (*_data, 1);
1261 /* there is a suffix (i.e. the field is not the last on the line),
1262 so null-terminate the _data before it. */
1270 error (0, 0, _(" prefix: '%s'\n number: '%s'\n suffix: '%s'\n"),
1271 *_prefix, *_data, *_suffix);
1275 /* Convert a number in a given line of text.
1276 NEWLINE specifies whether to output a '\n' for this "line". */
1278 process_line (char *line, bool newline)
1280 char *pre, *num, *suf;
1281 long double val = 0;
1282 size_t precision = 0;
1283 int valid_number = 0;
1285 extract_fields (line, field, &pre, &num, &suf);
1287 if (_invalid != inval_ignore)
1288 error (conv_exit_code, 0, _("input line is too short, "
1289 "no numbers found to convert in field %ld"),
1294 valid_number = process_suffixed_number (num, &val, &precision);
1296 valid_number = prepare_padded_number (val, precision);
1300 fputs (pre, stdout);
1303 fputc ((delimiter == DELIMITER_DEFAULT) ? ' ' : delimiter, stdout);
1307 print_padded_number ();
1312 fputs (num, stdout);
1317 fputc ((delimiter == DELIMITER_DEFAULT) ? ' ' : delimiter, stdout);
1318 fputs (suf, stdout);
1324 return valid_number;
1328 main (int argc, char **argv)
1330 int valid_numbers = 1;
1332 initialize_main (&argc, &argv);
1333 set_program_name (argv[0]);
1334 setlocale (LC_ALL, "");
1335 bindtextdomain (PACKAGE, LOCALEDIR);
1336 textdomain (PACKAGE);
1338 decimal_point = nl_langinfo (RADIXCHAR);
1339 if (decimal_point == NULL || strlen (decimal_point) == 0)
1340 decimal_point = ".";
1341 decimal_point_length = strlen (decimal_point);
1343 atexit (close_stdout);
1347 int c = getopt_long (argc, argv, "d:", longopts, NULL);
1355 scale_from = XARGMATCH ("--from", optarg,
1356 scale_from_args, scale_from_types);
1359 case FROM_UNIT_OPTION:
1360 from_unit_size = unit_to_umax (optarg);
1365 XARGMATCH ("--to", optarg, scale_to_args, scale_to_types);
1368 case TO_UNIT_OPTION:
1369 to_unit_size = unit_to_umax (optarg);
1373 _round = XARGMATCH ("--round", optarg, round_args, round_types);
1376 case GROUPING_OPTION:
1380 case PADDING_OPTION:
1381 if (xstrtol (optarg, NULL, 10, &padding_width, "") != LONGINT_OK
1382 || padding_width == 0)
1383 error (EXIT_FAILURE, 0, _("invalid padding value '%s'"), optarg);
1384 if (padding_width < 0)
1386 padding_alignment = MBS_ALIGN_LEFT;
1387 padding_width = -padding_width;
1389 /* TODO: We probably want to apply a specific --padding
1390 to --header lines too. */
1394 if (xstrtol (optarg, NULL, 10, &field, "") != LONGINT_OK
1396 error (EXIT_FAILURE, 0, _("invalid field value '%s'"), optarg);
1400 /* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */
1401 if (optarg[0] != '\0' && optarg[1] != '\0')
1402 error (EXIT_FAILURE, 0,
1403 _("the delimiter must be a single character"));
1404 delimiter = optarg[0];
1415 case DEV_DEBUG_OPTION:
1423 if (xstrtoumax (optarg, NULL, 10, &header, "") != LONGINT_OK
1425 error (EXIT_FAILURE, 0, _("invalid header value '%s'"),
1435 format_str = optarg;
1438 case INVALID_OPTION:
1439 _invalid = XARGMATCH ("--invalid", optarg, inval_args, inval_types);
1442 case_GETOPT_HELP_CHAR;
1443 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1446 usage (EXIT_FAILURE);
1450 if (format_str != NULL && grouping)
1451 error (EXIT_FAILURE, 0, _("--grouping cannot be combined with --format"));
1452 if (format_str != NULL && padding_width > 0)
1453 error (EXIT_FAILURE, 0, _("--padding cannot be combined with --format"));
1455 /* Warn about no-op. */
1456 if (debug && scale_from == scale_none && scale_to == scale_none
1457 && !grouping && (padding_width == 0) && (format_str == NULL))
1458 error (0, 0, _("no conversion option specified"));
1461 parse_format_string (format_str);
1465 if (scale_to != scale_none)
1466 error (EXIT_FAILURE, 0, _("grouping cannot be combined with --to"));
1467 if (debug && (strlen (nl_langinfo (THOUSEP)) == 0))
1468 error (0, 0, _("grouping has no effect in this locale"));
1472 setup_padding_buffer (padding_width);
1473 auto_padding = (padding_width == 0 && delimiter == DELIMITER_DEFAULT);
1475 if (_invalid != inval_abort)
1480 if (debug && header)
1481 error (0, 0, _("--header ignored with command-line input"));
1483 for (; optind < argc; optind++)
1484 valid_numbers &= process_line (argv[optind], true);
1489 size_t line_allocated = 0;
1492 while (header-- && getline (&line, &line_allocated, stdin) > 0)
1493 fputs (line, stdout);
1495 while ((len = getline (&line, &line_allocated, stdin)) > 0)
1497 bool newline = line[len - 1] == '\n';
1499 line[len - 1] = '\0';
1500 valid_numbers &= process_line (line, newline);
1503 IF_LINT (free (line));
1506 error (0, errno, _("error reading input"));
1509 free (padding_buffer);
1510 free (format_str_prefix);
1511 free (format_str_suffix);
1514 if (debug && !valid_numbers)
1515 error (0, 0, _("failed to convert some of the input numbers"));
1517 int exit_status = EXIT_SUCCESS;
1518 if (!valid_numbers && _invalid != inval_warn && _invalid != inval_ignore)
1519 exit_status = EXIT_CONVERSION_WARNINGS;