aboutsummaryrefslogtreecommitdiff
path: root/Src/nu/AutoChar.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nu/AutoChar.h')
-rw-r--r--Src/nu/AutoChar.h189
1 files changed, 189 insertions, 0 deletions
diff --git a/Src/nu/AutoChar.h b/Src/nu/AutoChar.h
new file mode 100644
index 00000000..0e3e0ea2
--- /dev/null
+++ b/Src/nu/AutoChar.h
@@ -0,0 +1,189 @@
+#ifndef NULLSOFT_AUTOCHARH
+#define NULLSOFT_AUTOCHARH
+#ifdef WIN32
+#include <windows.h>
+
+
+inline char *AutoCharDupN(const wchar_t *convert, size_t len, UINT codePage = CP_ACP, UINT flags=0)
+{
+ if (!convert)
+ return 0;
+ int size = WideCharToMultiByte(codePage, flags, convert, (int)len, 0, 0, NULL, NULL);
+
+ if (!size)
+ return 0;
+
+ char *narrow = (char *)malloc((size+1)*sizeof(char));
+ if ( narrow == 0 )
+ return 0;
+
+ if (!WideCharToMultiByte(codePage, flags, convert, (int)len, narrow, size, NULL, NULL))
+ {
+ free(narrow);
+ narrow=0;
+ }
+ else
+ narrow[size]=0;
+
+ return narrow;
+}
+
+inline char *AutoCharDup(const wchar_t *convert, UINT codePage = CP_ACP, UINT flags=0)
+{
+ if (!convert)
+ return 0;
+
+ int size = WideCharToMultiByte(codePage, flags, convert, -1, 0, 0, NULL, NULL);
+
+ if (!size)
+ return 0;
+
+ char *narrow = (char *)malloc(size*sizeof(char));
+ if ( narrow == 0 )
+ return 0;
+
+ if (!WideCharToMultiByte(codePage, flags, convert, -1, narrow, size, NULL, NULL))
+ {
+ free(narrow);
+ narrow=0;
+ }
+ return narrow;
+}
+
+class AutoChar
+{
+public:
+ AutoChar(const wchar_t *convert, UINT codePage = CP_ACP, UINT flags=0) : narrow(0)
+ {
+ narrow = AutoCharDup(convert, codePage, flags);
+ }
+ ~AutoChar()
+ {
+ free(narrow);
+ narrow=0;
+ }
+ operator const char *()
+ {
+ return narrow;
+ }
+ operator char *()
+ {
+ return narrow;
+ }
+protected:
+ AutoChar() : narrow(0)
+ {
+ }
+ char *narrow;
+};
+
+class AutoCharGrow
+{
+public:
+ AutoCharGrow()
+ {
+ narrow=0;
+ size=0;
+ }
+
+ ~AutoCharGrow()
+ {
+ free(narrow);
+ }
+
+ const char *Convert(const wchar_t *convert, UINT codePage = CP_ACP, UINT flags=0, size_t *cch=0)
+ {
+ size_t new_size = WideCharToMultiByte(codePage, flags, convert, -1, 0, 0, NULL, NULL);
+
+ if (!new_size)
+ return 0;
+
+ if ((size_t)new_size > size)
+ {
+ free(narrow);
+ narrow = (char *)malloc(new_size * sizeof(char));
+ if (!narrow)
+ {
+ size=0;
+ return 0;
+ }
+ size=(size_t)new_size;
+ }
+
+ if (!WideCharToMultiByte(codePage, flags, convert, -1, narrow, (int)new_size, NULL, NULL))
+ {
+ return 0;
+ }
+
+ if (cch)
+ *cch=new_size-1;
+
+ return narrow;
+ }
+
+protected:
+ char *narrow;
+ size_t size;
+};
+class AutoCharN : public AutoChar
+{
+public:
+ AutoCharN(const wchar_t *convert, size_t len, UINT codePage = CP_ACP, UINT flags=0)
+ {
+ narrow = AutoCharDupN(convert, len, codePage, flags);
+ }
+};
+#else
+#include <stdlib.h>
+#include <wchar.h>
+
+inline char *AutoCharDup(const wchar_t *convert)
+{
+ if (!convert)
+ return 0;
+
+ size_t size = wcslen(convert)+1;
+
+ if (!size)
+ return 0;
+
+ char *narrow = (char *)malloc(size*sizeof(char));
+ if ( narrow == 0 )
+ return 0;
+
+ if (wcstombs(narrow, convert, size) == (size_t)-1)
+ {
+ free(narrow);
+ narrow=0;
+ }
+ return narrow;
+}
+
+
+class AutoChar
+{
+public:
+
+ AutoChar(const wchar_t *convert) : narrow(0)
+ {
+ narrow = AutoCharDup(convert);
+ }
+ ~AutoChar()
+ {
+ free(narrow);
+ narrow=0;
+ }
+ operator const char *()
+ {
+ return narrow;
+ }
+ operator char *()
+ {
+ return narrow;
+ }
+private:
+ char *narrow;
+};
+#endif
+
+#endif \ No newline at end of file