string.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include "string.h"
  4. #include "util.h"
  5. static int hex(char ch)
  6. {
  7. if ((ch >= '0') && (ch <= '9'))
  8. return ch - '0';
  9. if ((ch >= 'a') && (ch <= 'f'))
  10. return ch - 'a' + 10;
  11. if ((ch >= 'A') && (ch <= 'F'))
  12. return ch - 'A' + 10;
  13. return -1;
  14. }
  15. /*
  16. * While we find nice hex chars, build a long_val.
  17. * Return number of chars processed.
  18. */
  19. int hex2u64(const char *ptr, u64 *long_val)
  20. {
  21. const char *p = ptr;
  22. *long_val = 0;
  23. while (*p) {
  24. const int hex_val = hex(*p);
  25. if (hex_val < 0)
  26. break;
  27. *long_val = (*long_val << 4) | hex_val;
  28. p++;
  29. }
  30. return p - ptr;
  31. }
  32. char *strxfrchar(char *s, char from, char to)
  33. {
  34. char *p = s;
  35. while ((p = strchr(p, from)) != NULL)
  36. *p++ = to;
  37. return s;
  38. }
  39. #define K 1024LL
  40. /*
  41. * perf_atoll()
  42. * Parse (\d+)(b|B|kb|KB|mb|MB|gb|GB|tb|TB) (e.g. "256MB")
  43. * and return its numeric value
  44. */
  45. s64 perf_atoll(const char *str)
  46. {
  47. unsigned int i;
  48. s64 length = -1, unit = 1;
  49. if (!isdigit(str[0]))
  50. goto out_err;
  51. for (i = 1; i < strlen(str); i++) {
  52. switch (str[i]) {
  53. case 'B':
  54. case 'b':
  55. break;
  56. case 'K':
  57. if (str[i + 1] != 'B')
  58. goto out_err;
  59. else
  60. goto kilo;
  61. case 'k':
  62. if (str[i + 1] != 'b')
  63. goto out_err;
  64. kilo:
  65. unit = K;
  66. break;
  67. case 'M':
  68. if (str[i + 1] != 'B')
  69. goto out_err;
  70. else
  71. goto mega;
  72. case 'm':
  73. if (str[i + 1] != 'b')
  74. goto out_err;
  75. mega:
  76. unit = K * K;
  77. break;
  78. case 'G':
  79. if (str[i + 1] != 'B')
  80. goto out_err;
  81. else
  82. goto giga;
  83. case 'g':
  84. if (str[i + 1] != 'b')
  85. goto out_err;
  86. giga:
  87. unit = K * K * K;
  88. break;
  89. case 'T':
  90. if (str[i + 1] != 'B')
  91. goto out_err;
  92. else
  93. goto tera;
  94. case 't':
  95. if (str[i + 1] != 'b')
  96. goto out_err;
  97. tera:
  98. unit = K * K * K * K;
  99. break;
  100. case '\0': /* only specified figures */
  101. unit = 1;
  102. break;
  103. default:
  104. if (!isdigit(str[i]))
  105. goto out_err;
  106. break;
  107. }
  108. }
  109. length = atoll(str) * unit;
  110. goto out;
  111. out_err:
  112. length = -1;
  113. out:
  114. return length;
  115. }