summaryrefslogblamecommitdiffstats
path: root/Src/devices/strings.cpp
blob: f3d4b5ccd2b3c218feb2ffe90b340e2ebf9460ce (plain) (tree)























































































































































                                                                                                      
#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;
}