summaryrefslogtreecommitdiff
path: root/lib/human.h
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2002-10-19 13:48:04 +0000
committerJim Meyering <jim@meyering.net>2002-10-19 13:48:04 +0000
commitdce67bd2619d8df59a622ae6c1570e68d46b2930 (patch)
tree729922b17b35167eecec8d43f13d2d61892d7abc /lib/human.h
parent4774c63a5eaef8ce08726a2c06db0b8e2aff84fe (diff)
downloadcoreutils-dce67bd2619d8df59a622ae6c1570e68d46b2930.tar.xz
Rewrite to support locale-specific
notations like thousands separators. Specify what includer of include.h must include beforehand. (human_group_digits, human_suppress_point_zero, human_autoscale, human_base_1024, human_SI, human_B): New enum values. (human_readable): Rename from human_readable_inexact; put the options before the sizes. All uses changed. The old human_readable function has been removed; use inttostr.h instead. (human_options): Renamed from human_block_size, with new signature that allows block sizes up to UINTMAX_MAX. All callers changed.
Diffstat (limited to 'lib/human.h')
-rw-r--r--lib/human.h92
1 files changed, 65 insertions, 27 deletions
diff --git a/lib/human.h b/lib/human.h
index 4ec9f0da8..343fff7e8 100644
--- a/lib/human.h
+++ b/lib/human.h
@@ -1,39 +1,77 @@
#ifndef HUMAN_H_
# define HUMAN_H_ 1
-# if HAVE_CONFIG_H
-# include <config.h>
-# endif
+/* Before including this file, you need something like the following:
-# if HAVE_INTTYPES_H
-# include <inttypes.h>
-# endif
+ #if HAVE_CONFIG_H
+ # include <config.h>
+ #endif
+
+ #if HAVE_STDBOOL_H
+ # include <stdbool.h>
+ #else
+ typedef enum {false = 0, true = 1} bool;
+ #endif
+
+ #if HAVE_INTTYPES_H
+ # include <inttypes.h>
+ #else
+ # if HAVE_STDINT_H
+ # include <stdint.h>
+ # endif
+ #endif
+
+ #include <limits.h>
+
+ so that the proper identifiers are all declared. */
/* A conservative bound on the maximum length of a human-readable string.
- The output can be the product of the largest uintmax_t and the largest int,
- so add their sizes before converting to a bound on digits. */
-# define LONGEST_HUMAN_READABLE ((sizeof (uintmax_t) + sizeof (int)) \
- * CHAR_BIT / 3)
-
-# ifndef PARAMS
-# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
-# define PARAMS(Args) Args
-# else
-# define PARAMS(Args) ()
-# endif
-# endif
-
-enum human_inexact_style
+ The output can be the square of the largest uintmax_t, so double
+ its size before converting to a bound.
+ 302 / 1000 is ceil (log10 (2.0)). Add 1 for integer division truncation.
+ Also, the output can have a thousands separator between every digit,
+ so multiply by MB_LEN_MAX + 1 and then subtract MB_LEN_MAX.
+ Finally, append 3, the maximum length of a suffix. */
+# define LONGEST_HUMAN_READABLE \
+ ((2 * sizeof (uintmax_t) * CHAR_BIT * 302 / 1000 + 1) * (MB_LEN_MAX + 1) \
+ - MB_LEN_MAX + 3)
+
+/* Options for human_readable. */
+enum
{
- human_floor = -1,
- human_round_to_even = 0,
- human_ceiling = 1
+ /* Unless otherwise specified these options may be ORed together. */
+
+ /* The following three options are mutually exclusive. */
+ /* Round to plus infinity (default). */
+ human_ceiling = 0,
+ /* Round to nearest, ties to even. */
+ human_round_to_nearest = 1,
+ /* Round to minus infinity. */
+ human_floor = 2,
+
+ /* Group digits together, e.g. `1,000,000'. This uses the
+ locale-defined grouping; the traditional C locale does not group,
+ so this has effect only if some other locale is in use. */
+ human_group_digits = 4,
+
+ /* When autoscaling, suppress ".0" at end. */
+ human_suppress_point_zero = 8,
+
+ /* Scale output and use SI-style units, ignoring the output block size. */
+ human_autoscale = 16,
+
+ /* Prefer base 1024 to base 1000. */
+ human_base_1024 = 32,
+
+ /* Append SI prefix, e.g. "k" or "M". */
+ human_SI = 64,
+
+ /* Append "B" (if base 1000) or "iB" (if base 1024) to SI prefix. */
+ human_B = 128
};
-char *human_readable PARAMS ((uintmax_t, char *, int, int));
-char *human_readable_inexact PARAMS ((uintmax_t, char *, int, int,
- enum human_inexact_style));
+char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
-void human_block_size PARAMS ((char const *, int, int *));
+int human_options (char const *, bool, uintmax_t *);
#endif /* HUMAN_H_ */