hbase.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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] = {0};
  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] = {0};
  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 hv_exists(const char* path) {
  220. return access(path, 0) == 0;
  221. }
  222. bool hv_isdir(const char* path) {
  223. if (access(path, 0) != 0) return false;
  224. struct stat st;
  225. memset(&st, 0, sizeof(st));
  226. stat(path, &st);
  227. return S_ISDIR(st.st_mode);
  228. }
  229. bool hv_isfile(const char* path) {
  230. if (access(path, 0) != 0) return false;
  231. struct stat st;
  232. memset(&st, 0, sizeof(st));
  233. stat(path, &st);
  234. return S_ISREG(st.st_mode);
  235. }
  236. bool hv_islink(const char* path) {
  237. #ifdef OS_WIN
  238. return hv_isdir(path) && (GetFileAttributes(path) & FILE_ATTRIBUTE_REPARSE_POINT);
  239. #else
  240. if (access(path, 0) != 0) return false;
  241. struct stat st;
  242. memset(&st, 0, sizeof(st));
  243. lstat(path, &st);
  244. return S_ISLNK(st.st_mode);
  245. #endif
  246. }
  247. size_t hv_filesize(const char* filepath) {
  248. struct stat st;
  249. memset(&st, 0, sizeof(st));
  250. stat(filepath, &st);
  251. return st.st_size;
  252. }
  253. bool getboolean(const char* str) {
  254. if (str == NULL) return false;
  255. int len = strlen(str);
  256. if (len == 0) return false;
  257. switch (len) {
  258. case 1: return *str == '1' || *str == 'y' || *str == 'Y';
  259. case 2: return stricmp(str, "on") == 0;
  260. case 3: return stricmp(str, "yes") == 0;
  261. case 4: return stricmp(str, "true") == 0;
  262. case 6: return stricmp(str, "enable") == 0;
  263. default: return false;
  264. }
  265. }
  266. char* get_executable_path(char* buf, int size) {
  267. #ifdef OS_WIN
  268. GetModuleFileName(NULL, buf, size);
  269. #elif defined(OS_LINUX)
  270. if (readlink("/proc/self/exe", buf, size) == -1) {
  271. return NULL;
  272. }
  273. #elif defined(OS_DARWIN)
  274. _NSGetExecutablePath(buf, (uint32_t*)&size);
  275. #endif
  276. return buf;
  277. }
  278. char* get_executable_dir(char* buf, int size) {
  279. char filepath[MAX_PATH] = {0};
  280. get_executable_path(filepath, sizeof(filepath));
  281. char* pos = strrchr_dir(filepath);
  282. if (pos) {
  283. *pos = '\0';
  284. strncpy(buf, filepath, size);
  285. }
  286. return buf;
  287. }
  288. char* get_executable_file(char* buf, int size) {
  289. char filepath[MAX_PATH] = {0};
  290. get_executable_path(filepath, sizeof(filepath));
  291. char* pos = strrchr_dir(filepath);
  292. if (pos) {
  293. strncpy(buf, pos+1, size);
  294. }
  295. return buf;
  296. }
  297. char* get_run_dir(char* buf, int size) {
  298. return getcwd(buf, size);
  299. }