diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/curl_memory.h | 16 | ||||
-rw-r--r-- | lib/curl_setup.h | 1 | ||||
-rw-r--r-- | lib/easy.c | 6 | ||||
-rw-r--r-- | lib/memdebug.c | 28 | ||||
-rw-r--r-- | lib/memdebug.h | 20 |
5 files changed, 69 insertions, 2 deletions
diff --git a/lib/curl_memory.h b/lib/curl_memory.h index c1e92513f..4bba008c9 100644 --- a/lib/curl_memory.h +++ b/lib/curl_memory.h @@ -87,6 +87,9 @@ extern curl_free_callback Curl_cfree; extern curl_realloc_callback Curl_crealloc; extern curl_strdup_callback Curl_cstrdup; extern curl_calloc_callback Curl_ccalloc; +#ifdef WIN32 +extern curl_wcsdup_callback Curl_cwcsdup; +#endif #ifndef CURLDEBUG @@ -110,6 +113,19 @@ extern curl_calloc_callback Curl_ccalloc; #undef free #define free(ptr) Curl_cfree(ptr) +#ifdef WIN32 +# undef wcsdup +# define wcsdup(ptr) Curl_cwcsdup(ptr) +# undef _wcsdup +# define _wcsdup(ptr) Curl_cwcsdup(ptr) +# undef _tcsdup +# ifdef UNICODE +# define _tcsdup(ptr) Curl_cwcsdup(ptr) +# else +# define _tcsdup(ptr) Curl_cstrdup(ptr) +# endif +#endif + #endif /* CURLDEBUG */ #else /* CURLX_NO_MEMORY_CALLBACKS */ diff --git a/lib/curl_setup.h b/lib/curl_setup.h index a46a60828..3f55a5c0f 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -270,6 +270,7 @@ # endif # endif # include <tchar.h> + typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str); #endif /* diff --git a/lib/easy.c b/lib/easy.c index b82a548cb..541e793fb 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -252,6 +252,9 @@ curl_free_callback Curl_cfree = (curl_free_callback)free; curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc; curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)system_strdup; curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc; +#ifdef WIN32 +curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)wcsdup; +#endif #else /* * Symbian OS doesn't support initialization to code in writeable static data. @@ -283,6 +286,9 @@ CURLcode curl_global_init(long flags) Curl_crealloc = (curl_realloc_callback)realloc; Curl_cstrdup = (curl_strdup_callback)system_strdup; Curl_ccalloc = (curl_calloc_callback)calloc; +#ifdef WIN32 + Curl_cwcsdup = (curl_wcsdup_callback)wcsdup; +#endif if(flags & CURL_GLOBAL_SSL) if(!Curl_ssl_init()) { diff --git a/lib/memdebug.c b/lib/memdebug.c index 4d5f44d2f..b3ddfb430 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -239,6 +239,32 @@ char *curl_dostrdup(const char *str, int line, const char *source) return mem; } +#ifdef WIN32 +wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source) +{ + wchar_t *mem; + size_t wsiz, bsiz; + + assert(str != NULL); + + if(countcheck("wcsdup", line, source)) + return NULL; + + wsiz = wcslen(str) + 1; + bsiz = wsiz * sizeof(wchar_t); + + mem = curl_domalloc(bsiz, 0, NULL); /* NULL prevents logging */ + if(mem) + memcpy(mem, str, bsiz); + + if(source) + curl_memlog("MEM %s:%d wcsdup(%p) (%zu) = %p\n", + source, line, str, bsiz, mem); + + return mem; +} +#endif + /* We provide a realloc() that accepts a NULL as pointer, which then performs a malloc(). In order to work with ares. */ void *curl_dorealloc(void *ptr, size_t wantedsize, diff --git a/lib/memdebug.h b/lib/memdebug.h index fbeb61de5..955e8b72b 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -8,7 +8,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -46,6 +46,11 @@ CURL_EXTERN void *curl_dorealloc(void *ptr, size_t size, int line, const char *source); CURL_EXTERN void curl_dofree(void *ptr, int line, const char *source); CURL_EXTERN char *curl_dostrdup(const char *str, int line, const char *source); +#ifdef WIN32 +CURL_EXTERN wchar_t *curl_dowcsdup(const wchar_t *str, int line, + const char *source); +#endif + CURL_EXTERN void curl_memdebug(const char *logname); CURL_EXTERN void curl_memlimit(long limit); CURL_EXTERN void curl_memlog(const char *format, ...); @@ -84,6 +89,19 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); #define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__) #define free(ptr) curl_dofree(ptr, __LINE__, __FILE__) +#ifdef WIN32 +# undef wcsdup +# define wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# undef _wcsdup +# define _wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# undef _tcsdup +# ifdef UNICODE +# define _tcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# else +# define _tcsdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) +# endif +#endif + #define socket(domain,type,protocol)\ curl_socket(domain,type,protocol,__LINE__,__FILE__) #undef accept /* for those with accept as a macro */ |