We are using separate code for parse unit mode in current code,
better to use common function.
This patch introduce common function for to arguments for setting
unit, and a common help message, to make every tool in btrfs having
same unit argument.
The merit are:
1: Unify current each tool's arguments for unit
2: Make tools in future easy to implement such argument
3: Changes(enhancement) in common function have effect on all
relative tools
Changelog v1->v2:
Keep short options for 'fi df' command, to keeps option compatibility
with the standalone 'df' commmand, suggested-by:
David Sterba <dsterba@xxxxxxx>
Signed-off-by: Zhao Lei <zhaolei@xxxxxxxxxxxxxx>
---
utils.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
utils.h | 24 +++++++++++++++
2 files changed, 126 insertions(+)
diff --git a/utils.c b/utils.c
index 791d10f..220c7d8 100644
--- a/utils.c
+++ b/utils.c
@@ -2950,3 +2950,105 @@ int arg_copy_path(char *dest, const char *src, int destlen)
return 0;
}
+
+unsigned int get_unit_mode_from_arg(int *argc, char *argv[], int df_mode)
+{
+ unsigned int unit_mode = UNITS_DEFAULT;
+ int arg_i;
+ int arg_end;
+
+ for (arg_i = 0; arg_i < *argc; arg_i++) {
+ if (!strcmp(argv[arg_i], "--raw")) {
+ unit_mode = UNITS_RAW;
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "--human-readable")) {
+ unit_mode = UNITS_HUMAN_BINARY;
+ argv[arg_i] = NULL;
+ continue;
+ }
+
+ if (!strcmp(argv[arg_i], "--iec")) {
+ units_set_mode(&unit_mode, UNITS_BINARY);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "--si")) {
+ units_set_mode(&unit_mode, UNITS_DECIMAL);
+ argv[arg_i] = NULL;
+ continue;
+ }
+
+ if (!strcmp(argv[arg_i], "--kbytes")) {
+ units_set_base(&unit_mode, UNITS_KBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "--mbytes")) {
+ units_set_base(&unit_mode, UNITS_MBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "--gbytes")) {
+ units_set_base(&unit_mode, UNITS_GBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "--tbytes")) {
+ units_set_base(&unit_mode, UNITS_TBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+
+ if (!df_mode)
+ continue;
+
+ if (!strcmp(argv[arg_i], "-b")) {
+ unit_mode = UNITS_RAW;
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-h")) {
+ unit_mode = UNITS_HUMAN_BINARY;
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-H")) {
+ unit_mode = UNITS_HUMAN_DECIMAL;
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-k")) {
+ units_set_base(&unit_mode, UNITS_KBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-m")) {
+ units_set_base(&unit_mode, UNITS_MBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-g")) {
+ units_set_base(&unit_mode, UNITS_GBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ if (!strcmp(argv[arg_i], "-t")) {
+ units_set_base(&unit_mode, UNITS_TBYTES);
+ argv[arg_i] = NULL;
+ continue;
+ }
+ }
+
+ for (arg_i = 0, arg_end = 0; arg_i < *argc; arg_i++) {
+ if (!argv[arg_i])
+ continue;
+ argv[arg_end] = argv[arg_i];
+ arg_end++;
+ }
+
+ *argc = arg_end;
+
+ return unit_mode;
+}
diff --git a/utils.h b/utils.h
index 10d68e9..44b3662 100644
--- a/utils.h
+++ b/utils.h
@@ -245,4 +245,28 @@ int btrfs_check_nodesize(u32 nodesize, u32 sectorsize);
const char *get_argv0_buf(void);
+#define HELPINFO_OUTPUT_UNIT \
+ "--raw raw numbers in bytes", \
+ "--human-readable human friendly numbers, base 1024 (default)", \
+ "--iec use 1024 as a base (KiB, MiB, GiB, TiB)", \
+ "--si use 1000 as a base (kB, MB, GB, TB)", \
+ "--kbytes show sizes in KiB, or kB with --si", \
+ "--mbytes show sizes in MiB, or MB with --si", \
+ "--gbytes show sizes in GiB, or GB with --si", \
+ "--tbytes show sizes in TiB, or TB with --si"
+
+#define HELPINFO_OUTPUT_UNIT_DF \
+ "-b|--raw raw numbers in bytes", \
+ "-h|--human-readable", \
+ " human friendly numbers, base 1024 (default)", \
+ "-H human friendly numbers, base 1000", \
+ "--iec use 1024 as a base (KiB, MiB, GiB, TiB)", \
+ "--si use 1000 as a base (kB, MB, GB, TB)", \
+ "-k|--kbytes show sizes in KiB, or kB with --si", \
+ "-m|--mbytes show sizes in MiB, or MB with --si", \
+ "-g|--gbytes show sizes in GiB, or GB with --si", \
+ "-t|--tbytes show sizes in TiB, or TB with --si"
+
+unsigned int get_unit_mode_from_arg(int *argc, char *argv[], int df_mode);
+
#endif
--
1.8.5.1
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html