aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nswasabi/AutoCharNX.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nswasabi/AutoCharNX.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/replicant/nswasabi/AutoCharNX.h')
-rw-r--r--Src/replicant/nswasabi/AutoCharNX.h184
1 files changed, 184 insertions, 0 deletions
diff --git a/Src/replicant/nswasabi/AutoCharNX.h b/Src/replicant/nswasabi/AutoCharNX.h
new file mode 100644
index 00000000..86e83b84
--- /dev/null
+++ b/Src/replicant/nswasabi/AutoCharNX.h
@@ -0,0 +1,184 @@
+#pragma once
+#include "../nx/nxstring.h"
+#include "../nx/nxuri.h"
+#include "../foundation/error.h"
+#include <stdlib.h>
+
+template <nx_charset_t charset>
+class AutoCharNX
+{
+public:
+ AutoCharNX()
+ {
+ Init();
+ }
+
+ AutoCharNX(size_t bytes)
+ {
+ Init();
+ ptr = (char *)malloc(bytes);
+ malloc_size = bytes;
+ }
+
+ AutoCharNX(nx_string_t string)
+ {
+ Init();
+
+ Set(string);
+ }
+
+ AutoCharNX(nx_uri_t filename)
+ {
+ Init();
+
+ Set(filename);
+ }
+
+ ~AutoCharNX()
+ {
+ if (owned)
+ free(ptr);
+ if (reference_string)
+ NXStringRelease(reference_string);
+ }
+
+ int Set(nx_string_t string)
+ {
+ if (reference_string == string)
+ return NErr_Success;
+
+ if (reference_string)
+ NXStringRelease(reference_string);
+ reference_string=0;
+
+ size_t byte_count=0;
+ int ret = NXStringGetBytesSize(&byte_count, string, charset, nx_string_get_bytes_size_null_terminate);
+ if(ret == NErr_DirectPointer)
+ {
+ if (owned)
+ {
+ free(ptr);
+ ptr=0;
+ length=0;
+ malloc_size=0;
+ }
+ ret = NXStringGetBytesDirect((const void **)&ptr, &length, string, charset, nx_string_get_bytes_size_null_terminate);
+ reference_string = NXStringRetain(string);
+ owned=false;
+ }
+ else if (ret == NErr_Success)
+ {
+ if (owned)
+ {
+ if (byte_count > malloc_size)
+ {
+ ptr = (char *)realloc(ptr, byte_count);
+ malloc_size = byte_count;
+ }
+ }
+ else
+ {
+ /* not owned. need to allocate */
+ ptr = (char *)malloc(byte_count);
+ malloc_size = byte_count;
+ owned=true;
+ }
+
+ if (ptr)
+ {
+ ret = NXStringGetBytes(&length, string, ptr, byte_count, charset, nx_string_get_bytes_size_null_terminate);
+ }
+ else
+ {
+ return NErr_OutOfMemory;
+ }
+ }
+ else
+ {
+ Clear();
+ }
+ return ret;
+ }
+
+ int Set(nx_uri_t filename)
+ {
+ int ret;
+ nx_string_t string;
+ ret = NXURIGetNXString(&string, filename);
+ if (ret == NErr_Success)
+ {
+ ret = Set(string);
+ NXStringRelease(string);
+ }
+ else
+ {
+ Clear();
+ // failed! we need to clean up
+ }
+ return ret;
+ }
+
+ operator const char *() const
+ {
+ if (length)
+ return ptr;
+ else
+ return 0;
+ }
+
+ /* this one will never return a NULL, always a valid string */
+ const char *GetValidString() const
+ {
+ if (length)
+ return ptr;
+ else
+ return "";
+ }
+
+ /* the Clear function clears the string but doesn't deallocate memory */
+ void Clear()
+ {
+ if (!owned)
+ ptr=0;
+ length=0;
+
+ if (reference_string)
+ NXStringRelease(reference_string);
+ reference_string=0;
+ }
+
+ size_t size()
+ {
+ if (length)
+ return length-1;
+ else
+ return 0;
+ }
+private:
+ void Init()
+ {
+ ptr=0;
+ length=0;
+ owned=false;
+ reference_string=0;
+ malloc_size=0;
+ }
+ char *ptr;
+ size_t length;
+ size_t malloc_size;
+ bool owned;
+ nx_string_t reference_string;
+};
+
+typedef AutoCharNX<nx_charset_utf8> AutoCharUTF8;
+#define AutoCharPrintfUTF8(x) (AutoCharUTF8(x).GetValidString())
+class AutoCharNative
+{
+public:
+};
+
+class AutoFilename
+{
+public:
+};
+