| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- #include "hbase.h"
- #ifdef OS_DARWIN
- #include <mach-o/dyld.h> // for _NSGetExecutablePath
- #endif
- static unsigned int s_alloc_cnt = 0;
- static unsigned int 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) {
- ++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) {
- ++s_alloc_cnt;
- ++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) {
- ++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) {
- ++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;
- ++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;
- }
|