#define _POSIX_C_SOURCE 200809L
#include "compat.h"
#if defined (_WIN32) || defined (__CYGWIN__)
#include <wchar.h>
#include <windows.h>
#include <winnls.h>
#endif
#if HAVE_LOCALE_H
#include <locale.h>
#endif
#include "../common/debug.h"
void *INT123_safe_realloc(void *ptr, size_t size)
{
if(ptr == NULL) return malloc(size);
else return realloc(ptr, size);
}
void *INT123_safer_realloc(void *ptr, size_t size)
{
void *nptr = size ? INT123_safe_realloc(ptr, size) : NULL;
if(!nptr && ptr)
free(ptr);
return nptr;
}
const char *INT123_strerror(int errnum)
{
#if defined(HAVE_STRERROR_L) && defined(HAVE_USELOCALE)
locale_t curloc = uselocale((locale_t)0);
if(curloc != LC_GLOBAL_LOCALE)
return strerror_l(errnum, curloc);
#endif
#if defined(HAVE_STRERROR)
return strerror(errnum);
#else
extern int sys_nerr;
extern char *sys_errlist[];
return (errnum < sys_nerr) ? sys_errlist[errnum] : "";
#endif
}
char* INT123_compat_strdup(const char *src)
{
char *dest = NULL;
if(src)
{
size_t len;
len = strlen(src)+1;
if((dest = malloc(len)))
memcpy(dest, src, len);
}
return dest;
}
#if defined (_WIN32) || defined (__CYGWIN__)
static
int win32_wide_common(const wchar_t * const wptr, char **mbptr, size_t * buflen, UINT cp)
{
size_t len;
char *buf;
int ret = 0;
len = WideCharToMultiByte(cp, 0, wptr, -1, NULL, 0, NULL, NULL);
buf = calloc(len + 1, sizeof (char));
if(!buf) len = 0;
else {
if (len != 0) ret = WideCharToMultiByte(cp, 0, wptr, -1, buf, len, NULL, NULL);
buf[len] = '0';
}
*mbptr = buf;
if(buflen != NULL) *buflen = (len) * sizeof (char);
return ret;
}
int INT123_win32_wide_utf8(const wchar_t * const wptr, char **mbptr, size_t * buflen)
{
return win32_wide_common(wptr, mbptr, buflen, CP_UTF8);
}
int INT123_win32_wide_utf7(const wchar_t * const wptr, char **mbptr, size_t * buflen)
{
return win32_wide_common(wptr, mbptr, buflen, CP_UTF7);
}
int INT123_win32_utf8_wide(const char *const mbptr, wchar_t **wptr, size_t *buflen)
{
size_t len;
wchar_t *buf;
int ret = 0;
len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, mbptr, -1, NULL, 0);
buf = calloc(len + 1, sizeof (wchar_t));
if(!buf) len = 0;
else {
if (len != 0) ret = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, mbptr, -1, buf, len);
buf[len] = L'0';
}
*wptr = buf;
if (buflen != NULL) *buflen = len * sizeof (wchar_t);
return ret;
}
#endif