summaryrefslogtreecommitdiff
path: root/tools/source/reversemap
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2010-12-14 16:01:39 +0000
committerCaolán McNamara <caolanm@redhat.com>2010-12-15 08:51:34 +0000
commitb52f6cc76ddc6ebdd3d2932da21ac4d4c3c49542 (patch)
treef30e3176e96741d6293aac4f1dc8bdaeadb136ed /tools/source/reversemap
parentc6b30952edc6cf64f657f1d27225844b6b13aa30 (diff)
Resolves: #i101057#/#i97332# A better converter to multiple legacy codepages
Diffstat (limited to 'tools/source/reversemap')
-rw-r--r--tools/source/reversemap/bestreversemap.cxx174
-rw-r--r--tools/source/reversemap/makefile.mk47
2 files changed, 221 insertions, 0 deletions
diff --git a/tools/source/reversemap/bestreversemap.cxx b/tools/source/reversemap/bestreversemap.cxx
new file mode 100644
index 000000000000..2391c6943a11
--- /dev/null
+++ b/tools/source/reversemap/bestreversemap.cxx
@@ -0,0 +1,174 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ * Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.)
+ * Portions created by the Initial Developer are Copyright (C) 2010 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Caolán McNamara <caolanm@redhat.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#include "sal/config.h"
+#include "rtl/textcvt.h"
+#include "sal/main.h"
+
+#include <stdio.h>
+
+struct Encoder
+{
+ rtl_UnicodeToTextConverter m_aConverter;
+ bool m_bCapable;
+ rtl_TextEncoding m_nEncoding;
+ const char *m_pEncoding;
+ Encoder(rtl_TextEncoding nEncoding, const char *pEncoding)
+ : m_bCapable(true)
+ , m_nEncoding(nEncoding)
+ , m_pEncoding(pEncoding)
+ {
+ m_aConverter = rtl_createUnicodeToTextConverter(m_nEncoding);
+ }
+ ~Encoder()
+ {
+ rtl_destroyUnicodeToTextConverter(m_aConverter);
+ }
+ void checkSupports(sal_Unicode c)
+ {
+ sal_Char aTempArray[8];
+ sal_Size nTempSize;
+ sal_uInt32 nCvtInfo;
+
+ sal_Size nChars = rtl_convertUnicodeToText(m_aConverter,
+ NULL, &c, 1, aTempArray, sizeof(aTempArray),
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
+ &nCvtInfo, &nTempSize);
+ m_bCapable = nChars > 0;
+ }
+ void reset()
+ {
+ m_bCapable = true;
+ }
+ bool isOK() const
+ {
+ return m_bCapable;
+ }
+ const char* getName() const
+ {
+ return m_pEncoding;
+ }
+
+};
+
+
+SAL_IMPLEMENT_MAIN()
+{
+# define EXP(x) Encoder(x, #x)
+
+ Encoder aConverters[15] =
+ {
+ EXP(RTL_TEXTENCODING_MS_1361),
+ EXP(RTL_TEXTENCODING_MS_950),
+ EXP(RTL_TEXTENCODING_MS_949),
+ EXP(RTL_TEXTENCODING_MS_936),
+ EXP(RTL_TEXTENCODING_MS_932),
+ EXP(RTL_TEXTENCODING_MS_874),
+ EXP(RTL_TEXTENCODING_MS_1258),
+ EXP(RTL_TEXTENCODING_MS_1257),
+ EXP(RTL_TEXTENCODING_MS_1256),
+ EXP(RTL_TEXTENCODING_MS_1255),
+ EXP(RTL_TEXTENCODING_MS_1254),
+ EXP(RTL_TEXTENCODING_MS_1253),
+ EXP(RTL_TEXTENCODING_MS_1251),
+ EXP(RTL_TEXTENCODING_MS_1250),
+ EXP(RTL_TEXTENCODING_MS_1252)
+ };
+
+ printf("//Do not edit manually, generated from bestreversemap.cxx\n");
+ printf("rtl_TextEncoding getBestMSEncodingByChar(sal_Unicode c)\n");
+ printf("{\n");
+
+ bool bFirstOutput = true;
+
+ sal_Unicode c = 0;
+ while (c < 0xFFFF)
+ {
+ for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
+ aConverters[i].reset();
+
+ int nMostCapable = -1;
+
+ while(c < 0xFFFF)
+ {
+ bool bSomethingCapable = false;
+ for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
+ {
+ if (aConverters[i].isOK())
+ aConverters[i].checkSupports(c);
+ if (aConverters[i].isOK())
+ {
+ bSomethingCapable = true;
+ nMostCapable = i;
+ }
+ }
+ if (!bSomethingCapable)
+ break;
+ ++c;
+ }
+ sal_Unicode cEnd = c;
+ if (bFirstOutput)
+ printf(" if (c < 0x%x)\n", c);
+ else
+ printf(" else if (c < 0x%x)\n", c);
+ printf(" return %s;\n", aConverters[nMostCapable].getName());
+ bFirstOutput = false;
+ while(c < 0xFFFF)
+ {
+ bool bNothingCapable = true;
+ for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
+ {
+ aConverters[i].checkSupports(c);
+ if (aConverters[i].isOK())
+ {
+ bNothingCapable = false;
+ break;
+ }
+ }
+ if (!bNothingCapable)
+ break;
+ ++c;
+ }
+ if (cEnd != c)
+ {
+ if (c < 0xFFFF)
+ {
+ printf(" else if (c < 0x%x)\n", c);
+ printf(" return RTL_TEXTENCODING_DONTKNOW;\n");
+ }
+ else
+ printf(" return RTL_TEXTENCODING_DONTKNOW;\n");
+ }
+ }
+
+ printf("}\n");
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/reversemap/makefile.mk b/tools/source/reversemap/makefile.mk
new file mode 100644
index 000000000000..bfd3400d2d84
--- /dev/null
+++ b/tools/source/reversemap/makefile.mk
@@ -0,0 +1,47 @@
+#*************************************************************************
+#
+#
+# Version: MPL 1.1 / GPLv3+ / LGPLv3+
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Initial Developer of the Original Code is
+# Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.)
+# Portions created by the Initial Developer are Copyright (C) 2010 the
+# Initial Developer. All Rights Reserved.
+#
+# Contributor(s): Caolán McNamara <caolanm@redhat.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+# instead of those above.
+#
+#*************************************************************************
+
+PRJ = ../..
+PRJNAME = tl
+TARGET = bestreversemap
+LIBTARGET = NO
+TARGETTYPE = CUI
+ENABLE_EXCEPTIONS=TRUE
+
+.INCLUDE: settings.mk
+
+OBJFILES = \
+ $(OBJ)$/bestreversemap.obj
+
+APP1TARGET = bestreversemap
+APP1OBJS = $(OBJ)$/bestreversemap.obj
+APP1STDLIBS = $(SALLIB)
+
+.INCLUDE: target.mk