diff options
Diffstat (limited to 'Src/replicant/nswasabi/AutoCharNX.h')
-rw-r--r-- | Src/replicant/nswasabi/AutoCharNX.h | 184 |
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: +}; + |