-WX_DECLARE_OBJARRAY(wxCharacterSet, wxCSArray);
-#include "wx/arrimpl.cpp"
-WX_DEFINE_OBJARRAY(wxCSArray);
-
-static wxCSArray wxCharsets;
-
-static void wxLoadCharacterSets(void)
-{
- static bool already_loaded = FALSE;
-
- if (already_loaded) return;
-
- already_loaded = TRUE;
-#if defined(__UNIX__) && wxUSE_TEXTFILE
- // search through files in /usr/share/i18n/charmaps
- wxString fname;
- for (fname = ::wxFindFirstFile(wxT("/usr/share/i18n/charmaps/*"));
- !fname.IsEmpty();
- fname = ::wxFindNextFile()) {
- wxTextFile cmap(fname);
- if (cmap.Open()) {
- wxCharacterSet *cset = new wxCharacterSet;
- wxString comchar,escchar;
- bool in_charset = FALSE;
-
- // wxFprintf(stderr,wxT("Loaded: %s\n"),fname.c_str());
-
- wxString line;
- for (line = cmap.GetFirstLine();
- !cmap.Eof();
- line = cmap.GetNextLine()) {
- // wxFprintf(stderr,wxT("line contents: %s\n"),line.c_str());
- wxStringTokenizer token(line);
- wxString cmd = token.GetNextToken();
- if (cmd == comchar) {
- if (token.GetNextToken() == wxT("alias"))
- cset->names.Add(token.GetNextToken());
- }
- else if (cmd == wxT("<code_set_name>"))
- cset->names.Add(token.GetNextToken());
- else if (cmd == wxT("<comment_char>"))
- comchar = token.GetNextToken();
- else if (cmd == wxT("<escape_char>"))
- escchar = token.GetNextToken();
- else if (cmd == wxT("<mb_cur_min>")) {
- delete cset;
- cset = (wxCharacterSet *) NULL;
- break; // we don't support multibyte charsets ourselves (yet)
- }
- else if (cmd == wxT("CHARMAP")) {
- cset->data = (wchar_t *)calloc(256, sizeof(wchar_t));
- in_charset = TRUE;
- }
- else if (cmd == wxT("END")) {
- if (token.GetNextToken() == wxT("CHARMAP"))
- in_charset = FALSE;
- }
- else if (in_charset) {
- // format: <NUL> /x00 <U0000> NULL (NUL)
- // <A> /x41 <U0041> LATIN CAPITAL LETTER A
- wxString hex = token.GetNextToken();
- // skip whitespace (why doesn't wxStringTokenizer do this?)
- while (wxIsEmpty(hex) && token.HasMoreTokens()) hex = token.GetNextToken();
- wxString uni = token.GetNextToken();
- // skip whitespace again
- while (wxIsEmpty(uni) && token.HasMoreTokens()) uni = token.GetNextToken();
- if ((hex.Len() > 2) && (wxString(hex.GetChar(0)) == escchar) && (hex.GetChar(1) == wxT('x')) &&
- (uni.Left(2) == wxT("<U"))) {
- hex.MakeUpper(); uni.MakeUpper();
- int pos = ::wxHexToDec(hex.Mid(2,2));
- if (pos>=0) {
- unsigned long uni1 = ::wxHexToDec(uni.Mid(2,2));
- unsigned long uni2 = ::wxHexToDec(uni.Mid(4,2));
- cset->data[pos] = (uni1 << 16) | uni2;
- // wxFprintf(stderr,wxT("char %02x mapped to %04x (%c)\n"),pos,cset->data[pos],cset->data[pos]);
+const char *IC_CharSet::ms_wcCharsetName = NULL;
+bool IC_CharSet::ms_wcNeedsSwap = FALSE;
+
+IC_CharSet::IC_CharSet(const wxChar *name)
+ : wxCharacterSet(name)
+{
+ // check for charset that represents wchar_t:
+ if (ms_wcCharsetName == NULL)
+ {
+ ms_wcNeedsSwap = FALSE;
+
+ // try charset with explicit bytesex info (e.g. "UCS-4LE"):
+ ms_wcCharsetName = WC_NAME_BEST;
+ m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+
+ if (m2w == (iconv_t)-1)
+ {
+ // try charset w/o bytesex info (e.g. "UCS4")
+ // and check for bytesex ourselves:
+ ms_wcCharsetName = WC_NAME;
+ m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+
+ // last bet, try if it knows WCHAR_T pseudo-charset
+ if (m2w == (iconv_t)-1)
+ {
+ ms_wcCharsetName = "WCHAR_T";
+ m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+ }
+
+ if (m2w != (iconv_t)-1)
+ {
+ char buf[2], *bufPtr;
+ wchar_t wbuf[2], *wbufPtr;
+ size_t insz, outsz;
+ size_t res;
+
+ buf[0] = 'A';
+ buf[1] = 0;
+ wbuf[0] = 0;
+ insz = 2;
+ outsz = SIZEOF_WCHAR_T * 2;
+ wbufPtr = wbuf;
+ bufPtr = buf;
+
+ res = iconv(m2w, ICONV_CHAR_CAST(&bufPtr), &insz,
+ (char**)&wbufPtr, &outsz);
+
+ if (ICONV_FAILED(res, insz))
+ {
+ ms_wcCharsetName = NULL;
+ wxLogLastError(wxT("iconv"));
+ wxLogError(_("Convertion to charset '%s' doesn't work."), name);
+ }
+ else
+ {
+ ms_wcNeedsSwap = wbuf[0] != (wchar_t)buf[0];
+ }