diff --git a/utils.c b/utils.c index 791d10f9..220c7d87 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 10d68e9a..dce0a47c 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