winamp/Src/xml/encodings_c.cpp
2024-09-24 14:54:57 +02:00

90 lines
2.4 KiB
C++

#include "expat/expat.h"
#include <CoreFoundation/CoreFoundation.h>
#include <wchar.h>
// TODO: make this work
struct AppleEncodings
{
const wchar_t *name;
CFStringEncoding codePage;
};
static const AppleEncodings encodings[] =
{
{L"iso-8859-2", kCFStringEncodingISOLatin2},
{L"iso-8859-3", kCFStringEncodingISOLatin3},
{L"iso-8859-4", kCFStringEncodingISOLatin4},
{L"iso-8859-5", kCFStringEncodingISOLatinCyrillic},
{L"iso-8859-6", kCFStringEncodingISOLatinArabic},
{L"iso-8859-7", kCFStringEncodingISOLatinGreek},
{L"iso-8859-8", kCFStringEncodingISOLatinHebrew},
{L"iso-8859-9", kCFStringEncodingISOLatin5},
{L"iso-8859-10", kCFStringEncodingISOLatin6},
{L"iso-8859-11", kCFStringEncodingISOLatinThai},
{L"iso-8859-13", kCFStringEncodingISOLatin7},
{L"iso-8859-14", kCFStringEncodingISOLatin8},
{L"iso-8859-15", kCFStringEncodingISOLatin9},
{L"windows-1251", kCFStringEncodingWindowsCyrillic},
{L"windows-1252", kCFStringEncodingWindowsLatin1},
{L"windows-1253", kCFStringEncodingWindowsGreek},
{L"windows-1254", kCFStringEncodingWindowsLatin5},
{L"windows-1255", kCFStringEncodingWindowsHebrew},
{L"windows-1256", kCFStringEncodingWindowsArabic},
{L"windows-1257", kCFStringEncodingWindowsBalticRim},
{L"windows-1258", kCFStringEncodingWindowsVietnamese},
};
static void MakeMap(int *map, CFStringEncoding encoding)
{
unsigned char i=0;
unsigned char mb[2] = {0,0};
do
{
mb[0]=i;
// if (IsDBLeadByteEx(codepage, i)) map[i]=-2; else {
CFStringRef cfstr = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)mb, 1, encoding, false);
if (!cfstr || CFStringGetBytes(cfstr, CFRangeMake(0,1), kCFStringEncodingUTF32, 0, false, (UInt8 *)(map+i), sizeof(*map), 0))
{
map[i]=-1;
}
// }
} while (i++ != 255);
}
static bool wcsmatch(const wchar_t *a, const wchar_t *b)
{
if (!a || !b)
return false; // wtf
while (*a || *b)
{
if (!*a)
return false;
if (!*b)
return false;
if (towlower(*a) != towlower(*b))
return false;
a++;
b++;
}
return true;
}
#define NUM_ENCODINGS (sizeof(encodings)/sizeof(AppleEncodings))
int XMLCALL UnknownEncoding(void *data, const XML_Char *name, XML_Encoding *info)
{
for (int i=0;i<NUM_ENCODINGS;i++)
{
if (!wcsmatch(name, encodings[i].name))
{
MakeMap(info->map, encodings[i].codePage);
info->data = 0;
info->convert = 0;
info->release = 0;
return XML_STATUS_OK;
}
}
return XML_STATUS_ERROR;
}