aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_devices/strings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_devices/strings.cpp')
-rw-r--r--Src/Plugins/Library/ml_devices/strings.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_devices/strings.cpp b/Src/Plugins/Library/ml_devices/strings.cpp
new file mode 100644
index 00000000..bfbef052
--- /dev/null
+++ b/Src/Plugins/Library/ml_devices/strings.cpp
@@ -0,0 +1,195 @@
+#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);
+}
+
+
+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);
+}