#include "hbase.h" #ifdef OS_DARWIN #include // for _NSGetExecutablePath #endif #include "hatomic.h" static atomic_uint s_alloc_cnt = 0; static atomic_uint s_free_cnt = 0; unsigned int hv_alloc_cnt() { return s_alloc_cnt; } unsigned int hv_free_cnt() { return s_free_cnt; } void* safe_malloc(size_t size) { ATOMIC_INC(&s_alloc_cnt); ++s_alloc_cnt; void* ptr = malloc(size); if (!ptr) { fprintf(stderr, "malloc failed!\n"); exit(-1); } return ptr; } void* safe_realloc(void* oldptr, size_t newsize, size_t oldsize) { ATOMIC_INC(&s_alloc_cnt); ATOMIC_INC(&s_free_cnt); void* ptr = realloc(oldptr, newsize); if (!ptr) { fprintf(stderr, "realloc failed!\n"); exit(-1); } if (newsize > oldsize) { memset((char*)ptr + oldsize, 0, newsize - oldsize); } return ptr; } void* safe_calloc(size_t nmemb, size_t size) { ATOMIC_INC(&s_alloc_cnt); void* ptr = calloc(nmemb, size); if (!ptr) { fprintf(stderr, "calloc failed!\n"); exit(-1); } return ptr; } void* safe_zalloc(size_t size) { ATOMIC_INC(&s_alloc_cnt); void* ptr = malloc(size); if (!ptr) { fprintf(stderr, "malloc failed!\n"); exit(-1); } memset(ptr, 0, size); return ptr; } void safe_free(void* ptr) { if (ptr) { free(ptr); ptr = NULL; ATOMIC_INC(&s_free_cnt); } } char* strupper(char* str) { char* p = str; while (*p != '\0') { if (*p >= 'a' && *p <= 'z') { *p &= ~0x20; } ++p; } return str; } char* strlower(char* str) { char* p = str; while (*p != '\0') { if (*p >= 'A' && *p <= 'Z') { *p |= 0x20; } ++p; } return str; } char* strreverse(char* str) { if (str == NULL) return NULL; char* b = str; char* e = str; while(*e) {++e;} --e; char tmp; while (e > b) { tmp = *e; *e = *b; *b = tmp; --e; ++b; } return str; } // n = sizeof(dest_buf) char* safe_strncpy(char* dest, const char* src, size_t n) { assert(dest != NULL && src != NULL); char* ret = dest; while (*src != '\0' && --n > 0) { *dest++ = *src++; } *dest = '\0'; return ret; } // n = sizeof(dest_buf) char* safe_strncat(char* dest, const char* src, size_t n) { assert(dest != NULL && src != NULL); char* ret = dest; while (*dest) {++dest;--n;} while (*src != '\0' && --n > 0) { *dest++ = *src++; } *dest = '\0'; return ret; } bool strstartswith(const char* str, const char* start) { assert(str != NULL && start != NULL); while (*str && *start && *str == *start) { ++str; ++start; } return *start == '\0'; } bool strendswith(const char* str, const char* end) { assert(str != NULL && end != NULL); int len1 = 0; int len2 = 0; while (*str++) {++len1;} while (*end++) {++len2;} if (len1 < len2) return false; while (len2-- > 0) { --str; --end; if (*str != *end) { return false; } } return true; } bool strcontains(const char* str, const char* sub) { assert(str != NULL && sub != NULL); return strstr(str, sub) != NULL; } char* strrchr_dir(const char* filepath) { char* p = (char*)filepath; while (*p) ++p; while (--p >= filepath) { #ifdef OS_WIN if (*p == '/' || *p == '\\') #else if (*p == '/') #endif return p; } return NULL; } const char* hv_basename(const char* filepath) { const char* pos = strrchr_dir(filepath); return pos ? pos+1 : filepath; } const char* hv_suffixname(const char* filename) { const char* pos = strrchr_dot(filename); return pos ? pos+1 : ""; } int hv_mkdir_p(const char* dir) { if (access(dir, 0) == 0) { return EEXIST; } char tmp[MAX_PATH]; safe_strncpy(tmp, dir, sizeof(tmp)); char* p = tmp; char delim = '/'; while (*p) { #ifdef OS_WIN if (*p == '/' || *p == '\\') { delim = *p; #else if (*p == '/') { #endif *p = '\0'; hv_mkdir(tmp); *p = delim; } ++p; } if (hv_mkdir(tmp) != 0) { return EPERM; } return 0; } int hv_rmdir_p(const char* dir) { if (access(dir, 0) != 0) { return ENOENT; } if (rmdir(dir) != 0) { return EPERM; } char tmp[MAX_PATH]; safe_strncpy(tmp, dir, sizeof(tmp)); char* p = tmp; while (*p) ++p; while (--p >= tmp) { #ifdef OS_WIN if (*p == '/' || *p == '\\') { #else if (*p == '/') { #endif *p = '\0'; if (rmdir(tmp) != 0) { return 0; } } } return 0; } bool getboolean(const char* str) { if (str == NULL) return false; int len = strlen(str); if (len == 0) return false; switch (len) { case 1: return *str == '1' || *str == 'y' || *str == 'Y'; case 2: return stricmp(str, "on") == 0; case 3: return stricmp(str, "yes") == 0; case 4: return stricmp(str, "true") == 0; case 6: return stricmp(str, "enable") == 0; default: return false; } } char* get_executable_path(char* buf, int size) { #ifdef OS_WIN GetModuleFileName(NULL, buf, size); #elif defined(OS_LINUX) readlink("/proc/self/exe", buf, size); #elif defined(OS_DARWIN) _NSGetExecutablePath(buf, (uint32_t*)&size); #endif return buf; } char* get_executable_dir(char* buf, int size) { char filepath[MAX_PATH]; get_executable_path(filepath, sizeof(filepath)); char* pos = strrchr_dir(filepath); if (pos) { *pos = '\0'; strncpy(buf, filepath, size); } return buf; } char* get_executable_file(char* buf, int size) { char filepath[MAX_PATH]; get_executable_path(filepath, sizeof(filepath)); char* pos = strrchr_dir(filepath); if (pos) { strncpy(buf, pos+1, size); } return buf; } char* get_run_dir(char* buf, int size) { getcwd(buf, size); return buf; }