1
0

hbase.c 5.8 KB

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