152 lines
2.7 KiB
C++
152 lines
2.7 KiB
C++
|
#include "main.h"
|
||
|
#include "./strings.h"
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
|
||
|
wchar_t *
|
||
|
String_Malloc(size_t size)
|
||
|
{
|
||
|
return (wchar_t *)calloc(size, sizeof(wchar_t));
|
||
|
}
|
||
|
|
||
|
wchar_t *
|
||
|
String_ReAlloc(wchar_t *string, size_t size)
|
||
|
{
|
||
|
return (wchar_t *)realloc(string, sizeof(wchar_t) * size);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
String_Free(wchar_t *string)
|
||
|
{
|
||
|
if (NULL != string)
|
||
|
free(string);
|
||
|
}
|
||
|
|
||
|
wchar_t *
|
||
|
String_Duplicate(const wchar_t *string)
|
||
|
{
|
||
|
int length;
|
||
|
wchar_t *copy;
|
||
|
|
||
|
if (NULL == string)
|
||
|
return NULL;
|
||
|
|
||
|
length = lstrlenW(string) + 1;
|
||
|
|
||
|
copy = String_Malloc(length);
|
||
|
if (NULL != copy)
|
||
|
CopyMemory(copy, string, sizeof(wchar_t) * length);
|
||
|
|
||
|
return copy;
|
||
|
}
|
||
|
|
||
|
|
||
|
char *
|
||
|
String_ToAnsi(unsigned int codePage, unsigned long flags, const wchar_t *string,
|
||
|
int stringLength, const char *defaultChar, BOOL *usedDefaultChar)
|
||
|
{
|
||
|
char *buffer;
|
||
|
int bufferSize;
|
||
|
|
||
|
if (stringLength < 0)
|
||
|
stringLength = lstrlen(string);
|
||
|
|
||
|
bufferSize = WideCharToMultiByte(codePage, flags, string, stringLength,
|
||
|
NULL, 0, defaultChar, usedDefaultChar);
|
||
|
if (0 == bufferSize)
|
||
|
return NULL;
|
||
|
|
||
|
buffer = AnsiString_Malloc(bufferSize + 1);
|
||
|
if (NULL == buffer)
|
||
|
return NULL;
|
||
|
|
||
|
bufferSize = WideCharToMultiByte(codePage, flags, string, stringLength,
|
||
|
buffer, bufferSize, defaultChar, usedDefaultChar);
|
||
|
if (0 == bufferSize)
|
||
|
{
|
||
|
AnsiString_Free(buffer);
|
||
|
return NULL;
|
||
|
}
|
||
|
buffer[bufferSize] = '\0';
|
||
|
return buffer;
|
||
|
}
|
||
|
|
||
|
size_t
|
||
|
String_CopyTo(wchar_t *destination, const wchar_t *source, size_t size)
|
||
|
{
|
||
|
size_t remaining;
|
||
|
if (FAILED(StringCchCopyExW(destination, size, source, NULL, &remaining, 0)))
|
||
|
return 0;
|
||
|
|
||
|
return (size - remaining);
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
AnsiString_Malloc(size_t size)
|
||
|
{
|
||
|
return (char*)calloc(size, sizeof(char));
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
AnsiString_ReAlloc(char *string, size_t size)
|
||
|
{
|
||
|
return (char*)realloc(string, sizeof(char) * size);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
AnsiString_Free(char *string)
|
||
|
{
|
||
|
if (NULL != string)
|
||
|
free(string);
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
AnsiString_Duplicate(const char *string)
|
||
|
{
|
||
|
char *copy;
|
||
|
INT length;
|
||
|
|
||
|
if (NULL == string)
|
||
|
return NULL;
|
||
|
|
||
|
length = lstrlenA(string) + 1;
|
||
|
|
||
|
copy = AnsiString_Malloc(length);
|
||
|
if (NULL != copy)
|
||
|
CopyMemory(copy, string, sizeof(char) * length);
|
||
|
|
||
|
return copy;
|
||
|
}
|
||
|
|
||
|
|
||
|
wchar_t *
|
||
|
AnsiString_ToUnicode(unsigned int codePage, unsigned long flags, const char* string, INT stringLength)
|
||
|
{
|
||
|
wchar_t *buffer;
|
||
|
int buffferSize;
|
||
|
|
||
|
if (NULL == string)
|
||
|
return NULL;
|
||
|
|
||
|
buffferSize = MultiByteToWideChar(codePage, flags, string, stringLength, NULL, 0);
|
||
|
if (0 == buffferSize)
|
||
|
return NULL;
|
||
|
|
||
|
if (stringLength > 0)
|
||
|
buffferSize++;
|
||
|
|
||
|
buffer = String_Malloc(buffferSize);
|
||
|
if (NULL == buffer)
|
||
|
return NULL;
|
||
|
|
||
|
if (0 == MultiByteToWideChar(codePage, flags, string, stringLength, buffer, buffferSize))
|
||
|
{
|
||
|
String_Free(buffer);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
if (stringLength > 0)
|
||
|
buffer[buffferSize - 1] = L'\0';
|
||
|
|
||
|
return buffer;
|
||
|
}
|