string_utils.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #pragma once
  6. #include "assert.h"
  7. #include "types.h"
  8. #include "config.h"
  9. #include "macros.h"
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <cstdarg>
  13. namespace crown
  14. {
  15. inline size_t strlen(const char* str)
  16. {
  17. return ::strlen(str);
  18. }
  19. inline const char* strstr(const char* str1, const char* str2)
  20. {
  21. return ::strstr(str1, str2);
  22. }
  23. inline int32_t strcmp(const char* str1, const char* str2)
  24. {
  25. return ::strcmp(str1, str2);
  26. }
  27. inline int32_t strncmp(const char* s1, const char* s2, size_t len)
  28. {
  29. return ::strncmp(s1, s2, len);
  30. }
  31. inline char* strncpy(char* dest, const char* src, size_t len)
  32. {
  33. char* ret = ::strncpy(dest, src, len);
  34. dest[len - 1] = '\0';
  35. return ret;
  36. }
  37. inline char* strcat(char* dest, const char* src)
  38. {
  39. return ::strcat(dest, src);
  40. }
  41. inline char* strncat(char* dest, const char* src, size_t len)
  42. {
  43. return ::strncat(dest, src, len);
  44. }
  45. inline int32_t vsnprintf(char* str, size_t num, const char* format, va_list args)
  46. {
  47. #if CROWN_COMPILER_MSVC
  48. int32_t len = _vsnprintf_s(str, num, _TRUNCATE, format, args);
  49. return (len == 1) ? _vscprintf(format, args) : len;
  50. #else
  51. return ::vsnprintf(str, num, format, args);
  52. #endif // CROWN_COMPILER_MSVC
  53. }
  54. inline int32_t snprintf(char* str, size_t n, const char* format, ...)
  55. {
  56. va_list args;
  57. va_start(args, format);
  58. int32_t len = vsnprintf(str, n, format, args);
  59. va_end(args);
  60. return len;
  61. }
  62. inline const char* begin(const char* str)
  63. {
  64. CE_ASSERT(str != NULL, "Str must be != NULL");
  65. return str;
  66. }
  67. inline const char* end(const char* str)
  68. {
  69. CE_ASSERT(str != NULL, "Str must be != NULL");
  70. return str + strlen(str) + 1;
  71. }
  72. inline const char* find_first(const char* str, char c)
  73. {
  74. CE_ASSERT(str != NULL, "Str must be != NULL");
  75. const char* str_begin = begin(str);
  76. while (str_begin != end(str))
  77. {
  78. if ((*str_begin) == c)
  79. {
  80. return str_begin;
  81. }
  82. str_begin++;
  83. }
  84. return end(str);
  85. }
  86. inline const char* find_last(const char* str, char c)
  87. {
  88. CE_ASSERT(str != NULL, "Str must be != NULL");
  89. const char* str_end = end(str) - 1;
  90. while (str_end != begin(str) - 1)
  91. {
  92. if ((*str_end) == c)
  93. {
  94. return str_end;
  95. }
  96. str_end--;
  97. }
  98. return end(str);
  99. }
  100. inline void substring(const char* begin, const char* end, char* out, size_t len)
  101. {
  102. CE_ASSERT(begin != NULL, "Begin must be != NULL");
  103. CE_ASSERT(end != NULL, "End must be != NULL");
  104. CE_ASSERT(out != NULL, "Out must be != NULL");
  105. size_t i = 0;
  106. char* out_iterator = out;
  107. while (begin != end && i < len)
  108. {
  109. (*out_iterator) = (*begin);
  110. begin++;
  111. out_iterator++;
  112. i++;
  113. }
  114. out[i] = '\0';
  115. }
  116. inline int32_t parse_int(const char* string)
  117. {
  118. int val;
  119. int ok = sscanf(string, "%d", &val);
  120. CE_ASSERT(ok == 1, "Failed to parse int: %s", string);
  121. CE_UNUSED(ok);
  122. return val;
  123. }
  124. inline uint32_t parse_uint(const char* string)
  125. {
  126. unsigned int val;
  127. int ok = sscanf(string, "%u", &val);
  128. CE_ASSERT(ok == 1, "Failed to parse uint: %s", string);
  129. CE_UNUSED(ok);
  130. return val;
  131. }
  132. inline float parse_float(const char* string)
  133. {
  134. float val;
  135. int ok = sscanf(string, "%f", &val);
  136. CE_ASSERT(ok == 1, "Failed to parse float: %s", string);
  137. CE_UNUSED(ok);
  138. return val;
  139. }
  140. inline double parse_double(const char* string)
  141. {
  142. double val;
  143. int ok = sscanf(string, "%lf", &val);
  144. CE_ASSERT(ok == 1, "Failed to parse float: %s", string);
  145. CE_UNUSED(ok);
  146. return val;
  147. }
  148. } // namespace crown