123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #include "main.h"
- #include "./strings.h"
- #include <strsafe.h>
- wchar_t *
- String_Malloc(size_t size)
- {
- return (wchar_t *)malloc(sizeof(wchar_t) * size);
- }
- 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, STRSAFE_IGNORE_NULLS)))
- return 0;
-
- return (size - remaining);
- }
- wchar_t *
- String_FromWindowEx(HWND hwnd, size_t *lengthOut, BOOL *errorOut)
- {
- BOOL error;
- size_t length;
- wchar_t *string;
- error = TRUE;
- string = NULL;
- length = 0;
- if (NULL != hwnd)
- {
- length = GetWindowTextLength(hwnd);
- if (0 != length ||
- ERROR_SUCCESS == GetLastError())
- {
- string = String_Malloc(length + 1);
- if(NULL != string)
- {
- if (0 == length)
- {
- string[0] = L'\0';
- error = FALSE;
- }
- else
- {
- length = GetWindowText(hwnd, string, (int)length + 1);
- if (0 == length && ERROR_SUCCESS != GetLastError())
- {
- String_Free(string);
- string = NULL;
- }
- else
- error = FALSE;
- }
- }
- }
- }
-
- if (NULL != lengthOut)
- *lengthOut = length;
- if (NULL != errorOut)
- *errorOut = error;
-
- return string;
- }
- char *
- AnsiString_Malloc(size_t size)
- {
- return (char*)malloc(sizeof(char) * size);
- }
- 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;
- }
- wchar_t*
- ResourceString_Duplicate(const wchar_t *source)
- {
- return (FALSE != IS_INTRESOURCE(source)) ?
- (LPWSTR)source :
- String_Duplicate(source);
- }
- void
- ResourceString_Free(wchar_t *string)
- {
- if (FALSE == IS_INTRESOURCE(string))
- String_Free(string);
- }
- size_t
- ResourceString_CopyTo(wchar_t *destination, const wchar_t *source, size_t size)
- {
- if (NULL == destination)
- return 0;
- if (NULL == source)
- {
- destination[0] = L'\0';
- return 0;
- }
- if (FALSE != IS_INTRESOURCE(source))
- {
- if (NULL == WASABI_API_LNG)
- {
- destination[0] = L'\0';
- return 0;
- }
-
- WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)source, destination, size);
- return lstrlenW(destination);
- }
- return String_CopyTo(destination, source, size);
- }
|