logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/

humanize.c (969B)


  1. // utils-std: Collection of commonly available Unix tools
  2. // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. // SPDX-License-Identifier: MPL-2.0
  4. #define _POSIX_C_SOURCE 200809L
  5. #include "../lib/humanize.h"
  6. #include <math.h> // fabs
  7. #include <stdio.h> // snprintf
  8. struct si_scale
  9. dtosi(double num, bool iec)
  10. {
  11. #define PFX 11
  12. const char *si_prefixes[PFX] = {"", "k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q"};
  13. const char *iec_prefixes[PFX] = {
  14. "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB"};
  15. int div = iec ? 1024 : 1000;
  16. const char **prefixes = iec ? iec_prefixes : si_prefixes;
  17. bool neg = num < 0;
  18. struct si_scale ret = {
  19. .number = fabs(num),
  20. .prefix = "",
  21. .exponent = 0,
  22. };
  23. while(ret.number > div && ret.exponent < (PFX - 1))
  24. {
  25. ret.number /= div;
  26. ret.exponent += 1;
  27. }
  28. ret.prefix = prefixes[ret.exponent];
  29. if(neg) ret.number = -ret.number;
  30. return ret;
  31. }