summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/inc/tools/tenccvt.hxx11
-rw-r--r--tools/prj/build.lst3
-rw-r--r--tools/source/reversemap/bestreversemap.cxx174
-rw-r--r--tools/source/reversemap/makefile.mk47
-rw-r--r--tools/source/string/makefile.mk8
5 files changed, 242 insertions, 1 deletions
diff --git a/tools/inc/tools/tenccvt.hxx b/tools/inc/tools/tenccvt.hxx
index cdef9d9285a7..f5ca13191e49 100644
--- a/tools/inc/tools/tenccvt.hxx
+++ b/tools/inc/tools/tenccvt.hxx
@@ -54,6 +54,17 @@ TOOLS_DLLPUBLIC rtl_TextEncoding GetOneByteTextEncoding( rtl_TextEncoding eEncod
TOOLS_DLLPUBLIC rtl_TextEncoding GetSOLoadTextEncoding( rtl_TextEncoding eEncoding, USHORT nVersion = SOFFICE_FILEFORMAT_50 );
TOOLS_DLLPUBLIC rtl_TextEncoding GetSOStoreTextEncoding( rtl_TextEncoding eEncoding, USHORT nVersion = SOFFICE_FILEFORMAT_50 );
+/*
+ * Given a Unicode character, return a legacy Microsoft Encoding which
+ * supports it. Returns RTL_TEXTENCODING_DONTKNOW if there is
+ * no encoding which could support the character
+ *
+ * Useful as a utility to categorize unicode characters into the best fit
+ * windows charset range for exporting to ww6 & wmf or as a hint to non \u
+ * unicode token aware rtf readers
+ */
+TOOLS_DLLPUBLIC rtl_TextEncoding getBestMSEncodingByChar(sal_Unicode c);
+
#endif // _TOOLS_TENCCVT_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/prj/build.lst b/tools/prj/build.lst
index f28d3a346aea..0c602a1e8890 100644
--- a/tools/prj/build.lst
+++ b/tools/prj/build.lst
@@ -19,7 +19,8 @@ tl tools\source\fsys nmake - all tl_fsys tl_inc NULL
tl tools\source\zcodec nmake - all tl_zco tl_fsys tl_inc NULL
tl tools\source\communi nmake - all tl_com tl_fsys tl_inc NULL
tl tools\source\inet nmake - all tl_inet tl_fsys tl_inc NULL
-tl tools\source\string nmake - all tl_string tl_fsys tl_inc NULL
+tl tools\source\reversemap nmake - all tl_reversemap NULL
+tl tools\source\string nmake - all tl_string tl_reversemap tl_fsys tl_inc NULL
tl tools\source\misc nmake - all tl_misc tl_inc NULL
tl tools\win\source\dll nmake - w tl_dllw tl_inc NULL
tl tools\os2\source\dll nmake - p tl_dllp tl_inc NULL
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
diff --git a/tools/source/string/makefile.mk b/tools/source/string/makefile.mk
index 255feac2e6f9..d99ef7be8c4a 100644
--- a/tools/source/string/makefile.mk
+++ b/tools/source/string/makefile.mk
@@ -48,11 +48,13 @@ ALWAYSDBGTARGET=do_it_alwaysdebug
SLOFILES= $(SLO)$/tstring.obj \
$(SLO)$/tustring.obj \
$(SLO)$/tenccvt.obj \
+ $(SLO)$/reversemap.obj \
$(SLO)$/debugprint.obj
OBJFILES= $(OBJ)$/tstring.obj \
$(OBJ)$/tustring.obj \
$(OBJ)$/tenccvt.obj \
+ $(OBJ)$/reversemap.obj \
$(OBJ)$/debugprint.obj
# --- Targets ------------------------------------------------------
@@ -63,6 +65,12 @@ TARGETDEPS+=$(ALWAYSDBGTARGET)
.INCLUDE : target.mk
+$(INCCOM)$/reversemap.hxx: $(BIN)$/bestreversemap
+ $(AUGMENT_LIBRARY_PATH) $(BIN)$/bestreversemap > $@
+
+$(SLO)$/reversemap.obj: $(INCCOM)$/reversemap.hxx
+$(OBJ)$/reversemap.obj: $(INCCOM)$/reversemap.hxx
+
.IF "$(ALWAYSDBGTARGET)" != ""
.IF "$(ALWAYSDBG_FLAG)" == ""
# --------------------------------------------------