131 lines
2.5 KiB
C++
131 lines
2.5 KiB
C++
|
#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
|