hbase.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "hbase.h"
  2. #ifdef OS_DARWIN
  3. #include <mach-o/dyld.h> // for _NSGetExecutablePath
  4. #endif
  5. #include "hatomic.h"
  6. static atomic_uint s_alloc_cnt = 0;
  7. static atomic_uint s_free_cnt = 0;
  8. unsigned int hv_alloc_cnt() {
  9. return s_alloc_cnt;
  10. }
  11. unsigned int hv_free_cnt() {
  12. return s_free_cnt;
  13. }
  14. void* safe_malloc(size_t size) {
  15. ATOMIC_INC(&s_alloc_cnt);
  16. ++s_alloc_cnt;
  17. void* ptr = malloc(size);
  18. if (!ptr) {
  19. fprintf(stderr, "malloc failed!\n");
  20. exit(-1);
  21. }
  22. return ptr;
  23. }
  24. void* safe_realloc(void* oldptr, size_t newsize, size_t oldsize) {
  25. ATOMIC_INC(&s_alloc_cnt);
  26. ATOMIC_INC(&s_free_cnt);
  27. void* ptr = realloc(oldptr, newsize);
  28. if (!ptr) {
  29. fprintf(stderr, "realloc failed!\n");
  30. exit(-1);
  31. }
  32. if (newsize > oldsize) {
  33. memset((char*)ptr + oldsize, 0, newsize - oldsize);
  34. }
  35. return ptr;
  36. }
  37. void* safe_calloc(size_t nmemb, size_t size) {
  38. ATOMIC_INC(&s_alloc_cnt);
  39. void* ptr = calloc(nmemb, size);
  40. if (!ptr) {
  41. fprintf(stderr, "calloc failed!\n");
  42. exit(-1);
  43. }
  44. return ptr;
  45. }
  46. void* safe_zalloc(size_t size) {
  47. ATOMIC_INC(&s_alloc_cnt);
  48. void* ptr = malloc(size);
  49. if (!ptr) {
  50. fprintf(stderr, "malloc failed!\n");
  51. exit(-1);
  52. }
  53. memset(ptr, 0, size);
  54. return ptr;
  55. }
  56. void safe_free(void* ptr) {
  57. if (ptr) {
  58. free(ptr);
  59. ptr = NULL;
  60. ATOMIC_INC(&s_free_cnt);
  61. }
  62. }
  63. char* strupper(char* str) {
  64. char* p = str;
  65. while (*p != '\0') {
  66. if (*p >= 'a' && *p <= 'z') {
  67. *p &= ~0x20;
  68. }
  69. ++p;
  70. }
  71. return str;
  72. }
  73. char* strlower(char* str) {
  74. char* p = str;
  75. while (*p != '\0') {
  76. if (*p >= 'A' && *p <= 'Z') {
  77. *p |= 0x20;
  78. }
  79. ++p;
  80. }
  81. return str;
  82. }
  83. char* strreverse(char* str) {
  84. if (str == NULL) return NULL;
  85. char* b = str;
  86. char* e = str;
  87. while(*e) {++e;}
  88. --e;
  89. char tmp;
  90. while (e > b) {
  91. tmp = *e;
  92. *e = *b;
  93. *b = tmp;
  94. --e;
  95. ++b;
  96. }
  97. return str;
  98. }
  99. // n = sizeof(dest_buf)
  100. char* safe_strncpy(char* dest, const char* src, size_t n) {
  101. assert(dest != NULL && src != NULL);
  102. char* ret = dest;
  103. while (*src != '\0' && --n > 0) {
  104. *dest++ = *src++;
  105. }
  106. *dest = '\0';
  107. return ret;
  108. }
  109. // n = sizeof(dest_buf)
  110. char* safe_strncat(char* dest, const char* src, size_t n) {
  111. assert(dest != NULL && src != NULL);
  112. char* ret = dest;
  113. while (*dest) {++dest;--n;}
  114. while (*src != '\0' && --n > 0) {
  115. *dest++ = *src++;
  116. }
  117. *dest = '\0';
  118. return ret;
  119. }
  120. bool strstartswith(const char* str, const char* start) {
  121. assert(str != NULL && start != NULL);
  122. while (*str && *start && *str == *start) {
  123. ++str;
  124. ++start;
  125. }
  126. return *start == '\0';
  127. }
  128. bool strendswith(const char* str, const char* end) {
  129. assert(str != NULL && end != NULL);
  130. int len1 = 0;
  131. int len2 = 0;
  132. while (*str++) {++len1;}
  133. while (*end++) {++len2;}
  134. if (len1 < len2) return false;
  135. while (len2-- > 0) {
  136. --str;
  137. --end;
  138. if (*str != *end) {
  139. return false;
  140. }
  141. }
  142. return true;
  143. }
  144. bool strcontains(const char* str, const char* sub) {
  145. assert(str != NULL && sub != NULL);
  146. return strstr(str, sub) != NULL;
  147. }
  148. char* strrchr_dir(const char* filepath) {
  149. char* p = (char*)filepath;
  150. while (*p) ++p;
  151. while (--p >= filepath) {
  152. #ifdef OS_WIN
  153. if (*p == '/' || *p == '\\')
  154. #else
  155. if (*p == '/')
  156. #endif
  157. return p;
  158. }
  159. return NULL;
  160. }
  161. const char* hv_basename(const char* filepath) {
  162. const char* pos = strrchr_dir(filepath);
  163. return pos ? pos+1 : filepath;
  164. }
  165. const char* hv_suffixname(const char* filename) {
  166. const char* pos = strrchr_dot(filename);
  167. return pos ? pos+1 : "";
  168. }
  169. int hv_mkdir_p(const char* dir) {
  170. if (access(dir, 0) == 0) {
  171. return EEXIST;
  172. }
  173. char tmp[MAX_PATH];
  174. safe_strncpy(tmp, dir, sizeof(tmp));
  175. char* p = tmp;
  176. char delim = '/';
  177. while (*p) {
  178. #ifdef OS_WIN
  179. if (*p == '/' || *p == '\\') {
  180. delim = *p;
  181. #else
  182. if (*p == '/') {
  183. #endif
  184. *p = '\0';
  185. hv_mkdir(tmp);
  186. *p = delim;
  187. }
  188. ++p;
  189. }
  190. if (hv_mkdir(tmp) != 0) {
  191. return EPERM;
  192. }
  193. return 0;
  194. }
  195. int hv_rmdir_p(const char* dir) {
  196. if (access(dir, 0) != 0) {
  197. return ENOENT;
  198. }
  199. if (rmdir(dir) != 0) {
  200. return EPERM;
  201. }
  202. char tmp[MAX_PATH];
  203. safe_strncpy(tmp, dir, sizeof(tmp));
  204. char* p = tmp;
  205. while (*p) ++p;
  206. while (--p >= tmp) {
  207. #ifdef OS_WIN
  208. if (*p == '/' || *p == '\\') {
  209. #else
  210. if (*p == '/') {
  211. #endif
  212. *p = '\0';
  213. if (rmdir(tmp) != 0) {
  214. return 0;
  215. }
  216. }
  217. }
  218. return 0;
  219. }
  220. bool getboolean(const char* str) {
  221. if (str == NULL) return false;
  222. int len = strlen(str);
  223. if (len == 0) return false;
  224. switch (len) {
  225. case 1: return *str == '1' || *str == 'y' || *str == 'Y';
  226. case 2: return stricmp(str, "on") == 0;
  227. case 3: return stricmp(str, "yes") == 0;
  228. case 4: return stricmp(str, "true") == 0;
  229. case 6: return stricmp(str, "enable") == 0;
  230. default: return false;
  231. }
  232. }
  233. char* get_executable_path(char* buf, int size) {
  234. #ifdef OS_WIN
  235. GetModuleFileName(NULL, buf, size);
  236. #elif defined(OS_LINUX)
  237. readlink("/proc/self/exe", buf, size);
  238. #elif defined(OS_DARWIN)
  239. _NSGetExecutablePath(buf, (uint32_t*)&size);
  240. #endif
  241. return buf;
  242. }
  243. char* get_executable_dir(char* buf, int size) {
  244. char filepath[MAX_PATH];
  245. get_executable_path(filepath, sizeof(filepath));
  246. char* pos = strrchr_dir(filepath);
  247. if (pos) {
  248. *pos = '\0';
  249. strncpy(buf, filepath, size);
  250. }
  251. return buf;
  252. }
  253. char* get_executable_file(char* buf, int size) {
  254. char filepath[MAX_PATH];
  255. get_executable_path(filepath, sizeof(filepath));
  256. char* pos = strrchr_dir(filepath);
  257. if (pos) {
  258. strncpy(buf, pos+1, size);
  259. }
  260. return buf;
  261. }
  262. char* get_run_dir(char* buf, int size) {
  263. getcwd(buf, size);
  264. return buf;
  265. }