hbase.c 5.9 KB

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