Verify bittorrent .torrent metainfo files.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.6KB

  1. #include <stdio.h>
  2. #include "util.h"
  3. #define B_IN_KiB 1024ull
  4. #define B_IN_MiB B_IN_KiB * 1024
  5. #define B_IN_GiB B_IN_MiB * 1024
  6. #define B_IN_TiB B_IN_GiB * 1024
  7. #define B_IN_KB 1000ull
  8. #define B_IN_MB B_IN_KB * 1000
  9. #define B_IN_GB B_IN_MB * 1000
  10. #define B_IN_TB B_IN_GB * 1000
  11. int util_byte2human(long int bytes, int binary, int precision, char* out, size_t out_len) {
  12. #define S_CONV(t) ((binary) ? (B_IN_##t##iB) : (B_IN_##t##B))
  13. #define S_LESS(t) (bytes < S_CONV(t))
  14. #define S_SUFFIX(t) ((binary) ? (t "iB") : (t "B"))
  15. if (!out)
  16. return -1;
  17. int written;
  18. if (S_LESS(K))
  19. written = snprintf(out, out_len, "%ld B", bytes);
  20. else if (S_LESS(M))
  21. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 0 : precision, bytes / (double)(S_CONV(K)), S_SUFFIX("K"));
  22. else if (S_LESS(G))
  23. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 1 : precision, bytes / (double)(S_CONV(M)), S_SUFFIX("M"));
  24. else if (S_LESS(T))
  25. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 2 : precision, bytes / (double)(S_CONV(G)), S_SUFFIX("G"));
  26. else
  27. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 3 : precision, bytes / (double)(S_CONV(T)), S_SUFFIX("T"));
  28. return (written >= out_len) ? -1 : written;
  29. #undef S_SUFFIX
  30. #undef S_LESS
  31. #undef S_CONV
  32. }
  33. void util_byte2hex(const unsigned char* bytes, int bytes_len, int uppercase, char* out) {
  34. const char* hex = (uppercase) ? "0123456789ABCDEF" : "0123456789abcdef";
  35. for (int i = 0; i < bytes_len; i++) {
  36. *out++ = hex[bytes[i] >> 4];
  37. *out++ = hex[bytes[i] & 0xF];
  38. }
  39. *out = '\0';
  40. }