1
0

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