123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #include "precompile.h"
- #include "memutil.h"
- #include "shm_mem.h"
- #include <winpr/locale.h>
- #include <winpr/string.h> /*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);
- }
|