#include "precompile.h" #include "memutil.h" #include "shm_mem.h" #include #include /*for _strdup*/ //TODO: the returned new buffer may has dirty data. TOOLKIT_API void *buffer_resize(void* old, int elemsize, int oldcnt, int newcnt) { if (newcnt && oldcnt && elemsize && oldcnt != newcnt) { char *newbuf = (char*)calloc(newcnt, elemsize); if (newbuf) { if (old) memcpy(newbuf, old, elemsize*oldcnt); if (newcnt > oldcnt) { memset(newbuf+elemsize*oldcnt, 0, elemsize*(newcnt-oldcnt)); } if (old) free(old); return newbuf; } } return old; } //TODO: the returned new buffer may has dirty data. TOOLKIT_API void *shm_buffer_resize(void* old, int elemsize, int oldcnt, int newcnt) { if (newcnt && oldcnt && elemsize && oldcnt != newcnt) { char *newbuf = (char*)shm_malloc(newcnt*elemsize); if (newbuf) { if (old) memcpy(newbuf, old, elemsize*oldcnt); if (newcnt > oldcnt) { memset(newbuf+elemsize*oldcnt, 0, elemsize*(newcnt-oldcnt)); } if (old) shm_free(old); return newbuf; } } return old; } /*what if elemsize*cnt > new_cap's length.*/ TOOLKIT_API int array_check_expand(void **old, int elemsize, int cnt, int *capacity) { if (cnt >= *capacity) { int new_cap = *capacity * 2 + 1; char *newbuf = (char*)calloc(new_cap, elemsize); if (newbuf) { if (*old) { memcpy(newbuf, *old, elemsize*cnt); free(*old); } *old = newbuf; *capacity = new_cap; return 0; } else { return -1; } } else { return 0; /* no need expand */ } } TOOLKIT_API int shm_array_check_expand(void **old, int elemsize, int cnt, int *capacity) { if (cnt >= *capacity) { int new_cap = *capacity * 2 + 1; char *newbuf = (char*)shm_malloc(new_cap * elemsize); if (newbuf) { if (*old) { memcpy(newbuf, *old, elemsize*cnt); shm_free(*old); } *old = newbuf; *capacity = new_cap; return 0; } else { return -1; } } else { return 0; /* no need expand */ } } TOOLKIT_API void debug_trace(const char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = _vscprintf(fmt, arg); if (n > 4096) { char *buf = (char*)malloc(n+2); vsprintf(buf, fmt, arg); buf[n++] = '\n'; buf[n] = 0; OutputDebugStringA(buf); free(buf); } else if (n > 0) { char *buf = (char*)_alloca(n+2); vsprintf(buf, fmt, arg); buf[n++] = '\n'; buf[n] = 0; OutputDebugStringA(buf); } va_end(arg); } TOOLKIT_API int GetSystemErrorDesc(int error_code, char *buf, int n) { //TODO: implement or compatible DWORD dwRet = FormatMessageA( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), buf, n, NULL); buf[dwRet] = 0; return (int)dwRet; } TOOLKIT_API void toolkit_free(void *p) { free(p); } TOOLKIT_API void *toolkit_malloc(size_t size) { return malloc(size); } TOOLKIT_API void *toolkit_calloc(size_t num, size_t size) { return calloc(num, size); } TOOLKIT_API void *toolkit_zalloc(size_t size) { void *buf = malloc(size); if (buf) { memset(buf, 0, size); } return buf; } TOOLKIT_API void *toolkit_zcalloc(size_t num, size_t size) { void *buf = calloc(num, size); if (buf) { memset(buf, 0, num * size); } return buf; } TOOLKIT_API char *toolkit_strdup(const char *s) { return _strdup(s); } TOOLKIT_API wchar_t *toolkit_wcsdup(const wchar_t *s) { return _wcsdup(s); }