1 | /* human.h -- print human readable file size
|
---|
2 |
|
---|
3 | Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
---|
4 | 2005, 2006 Free Software Foundation, Inc.
|
---|
5 |
|
---|
6 | This program is free software; you can redistribute it and/or modify
|
---|
7 | it under the terms of the GNU General Public License as published by
|
---|
8 | the Free Software Foundation; either version 2, or (at your option)
|
---|
9 | any later version.
|
---|
10 |
|
---|
11 | This program is distributed in the hope that it will be useful,
|
---|
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
14 | GNU General Public License for more details.
|
---|
15 |
|
---|
16 | You should have received a copy of the GNU General Public License
|
---|
17 | along with this program; if not, write to the Free Software Foundation,
|
---|
18 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
---|
19 |
|
---|
20 | /* Written by Paul Eggert and Larry McVoy. */
|
---|
21 |
|
---|
22 | #ifndef HUMAN_H_
|
---|
23 | # define HUMAN_H_ 1
|
---|
24 |
|
---|
25 | # include <limits.h>
|
---|
26 | # include <stdbool.h>
|
---|
27 | # include <stdint.h>
|
---|
28 | # include <unistd.h>
|
---|
29 |
|
---|
30 | /* A conservative bound on the maximum length of a human-readable string.
|
---|
31 | The output can be the square of the largest uintmax_t, so double
|
---|
32 | its size before converting to a bound.
|
---|
33 | log10 (2.0) < 146/485. Add 1 for integer division truncation.
|
---|
34 | Also, the output can have a thousands separator between every digit,
|
---|
35 | so multiply by MB_LEN_MAX + 1 and then subtract MB_LEN_MAX.
|
---|
36 | Append 1 for a space before the suffix.
|
---|
37 | Finally, append 3, the maximum length of a suffix. */
|
---|
38 | # define LONGEST_HUMAN_READABLE \
|
---|
39 | ((2 * sizeof (uintmax_t) * CHAR_BIT * 146 / 485 + 1) * (MB_LEN_MAX + 1) \
|
---|
40 | - MB_LEN_MAX + 1 + 3)
|
---|
41 |
|
---|
42 | /* Options for human_readable. */
|
---|
43 | enum
|
---|
44 | {
|
---|
45 | /* Unless otherwise specified these options may be ORed together. */
|
---|
46 |
|
---|
47 | /* The following three options are mutually exclusive. */
|
---|
48 | /* Round to plus infinity (default). */
|
---|
49 | human_ceiling = 0,
|
---|
50 | /* Round to nearest, ties to even. */
|
---|
51 | human_round_to_nearest = 1,
|
---|
52 | /* Round to minus infinity. */
|
---|
53 | human_floor = 2,
|
---|
54 |
|
---|
55 | /* Group digits together, e.g. `1,000,000'. This uses the
|
---|
56 | locale-defined grouping; the traditional C locale does not group,
|
---|
57 | so this has effect only if some other locale is in use. */
|
---|
58 | human_group_digits = 4,
|
---|
59 |
|
---|
60 | /* When autoscaling, suppress ".0" at end. */
|
---|
61 | human_suppress_point_zero = 8,
|
---|
62 |
|
---|
63 | /* Scale output and use SI-style units, ignoring the output block size. */
|
---|
64 | human_autoscale = 16,
|
---|
65 |
|
---|
66 | /* Prefer base 1024 to base 1000. */
|
---|
67 | human_base_1024 = 32,
|
---|
68 |
|
---|
69 | /* Prepend " " before unit symbol. */
|
---|
70 | human_space_before_unit = 64,
|
---|
71 |
|
---|
72 | /* Append SI prefix, e.g. "k" or "M". */
|
---|
73 | human_SI = 128,
|
---|
74 |
|
---|
75 | /* Append "B" (if base 1000) or "iB" (if base 1024) to SI prefix. */
|
---|
76 | human_B = 256
|
---|
77 | };
|
---|
78 |
|
---|
79 | char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
|
---|
80 |
|
---|
81 | int human_options (char const *, bool, uintmax_t *);
|
---|
82 |
|
---|
83 | #endif /* HUMAN_H_ */
|
---|