aboutsummaryrefslogtreecommitdiff
path: root/Src/xml/XMLParameters.cpp
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/xml/XMLParameters.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/xml/XMLParameters.cpp')
-rw-r--r--Src/xml/XMLParameters.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/Src/xml/XMLParameters.cpp b/Src/xml/XMLParameters.cpp
new file mode 100644
index 00000000..487cea9a
--- /dev/null
+++ b/Src/xml/XMLParameters.cpp
@@ -0,0 +1,131 @@
+#include "XMLParameters.h"
+#include <wchar.h>
+
+#ifdef __APPLE__
+#include <Carbon/Carbon.h>
+int _wcsicmp(const wchar_t *str1, const wchar_t *str2)
+{
+ CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
+ CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str2, wcslen(str2)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
+ int result = CFStringCompare(cfstr1, cfstr2, kCFCompareCaseInsensitive);
+ CFRelease(cfstr1);
+ CFRelease(cfstr2);
+ return result;
+}
+#endif
+
+XMLParameters::XMLParameters(const wchar_t **_parameters)
+: parameters(_parameters), numParameters(0), numParametersCalculated(false)
+{
+}
+
+void XMLParameters::CountTo(int x)
+{
+ if (numParametersCalculated || x < numParameters)
+ return;
+
+ while (1)
+ {
+ if (parameters[numParameters*2] == 0)
+ {
+ numParametersCalculated=true;
+ return;
+ }
+ numParameters++;
+ if (numParameters == x)
+ return;
+ }
+}
+
+void XMLParameters::Count()
+{
+ if (numParametersCalculated)
+ return;
+
+ while (1)
+ {
+ if (parameters[numParameters*2] == 0)
+ {
+ numParametersCalculated=true;
+ return;
+ }
+ numParameters++;
+ }
+}
+
+const wchar_t *XMLParameters::GetItemName(int i)
+{
+ CountTo(i);
+ if (i < numParameters)
+ return parameters[i*2];
+ else
+ return 0;
+}
+
+const wchar_t *XMLParameters::GetItemValueIndex(int i)
+{
+ CountTo(i);
+ if (i < numParameters)
+ return parameters[i*2+1];
+ else
+ return 0;
+}
+
+int XMLParameters::GetNumItems()
+{
+ Count();
+ return numParameters;
+}
+
+const wchar_t *XMLParameters::GetItemValue(const wchar_t *name)
+{
+ int i=0;
+ while(1)
+ {
+ CountTo(i+1);
+ if (i<numParameters)
+ {
+ if (!_wcsicmp(name, parameters[i*2]))
+ return parameters[i*2+1];
+ }
+ else
+ return 0;
+ i++;
+ };
+}
+
+int XMLParameters::GetItemValueInt(const wchar_t *name, int def)
+{
+ const wchar_t *val = GetItemValue(name);
+ if (val && *val)
+ return wcstol(val, 0, 10);
+ else
+ return def;
+}
+
+const wchar_t *XMLParameters::EnumItemValues(const wchar_t *name, int nb)
+{
+ int i=0;
+ while(1)
+ {
+ CountTo(i+1);
+ if (i<numParameters)
+ {
+ if (!_wcsicmp(name, parameters[i*2]) && nb--)
+ return parameters[i*2+1];
+ }
+ else
+ return 0;
+ i++;
+ };
+}
+
+#define CBCLASS XMLParameters
+START_DISPATCH;
+CB(XMLREADERPARAMS_GETITEMNAME, GetItemName)
+CB(XMLREADERPARAMS_GETITEMVALUE, GetItemValueIndex)
+CB(XMLREADERPARAMS_GETITEMVALUE2, GetItemValue)
+CB(XMLREADERPARAMS_ENUMITEMVALUES, EnumItemValues)
+CB(XMLREADERPARAMS_GETNBITEMS, GetNumItems)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file