Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <sal/config.h>
11 : #include <rtl/textcvt.h>
12 :
13 : #include <stdio.h>
14 :
15 : struct Encoder
16 : {
17 : rtl_UnicodeToTextConverter m_aConverter;
18 : bool m_bCapable;
19 : rtl_TextEncoding m_nEncoding;
20 : const char *m_pEncoding;
21 15 : Encoder(rtl_TextEncoding nEncoding, const char *pEncoding)
22 : : m_bCapable(true)
23 : , m_nEncoding(nEncoding)
24 15 : , m_pEncoding(pEncoding)
25 : {
26 15 : m_aConverter = rtl_createUnicodeToTextConverter(m_nEncoding);
27 15 : }
28 15 : ~Encoder()
29 : {
30 15 : rtl_destroyUnicodeToTextConverter(m_aConverter);
31 15 : }
32 438109 : void checkSupports(sal_Unicode c)
33 : {
34 : sal_Char aTempArray[8];
35 : sal_Size nTempSize;
36 : sal_uInt32 nCvtInfo;
37 :
38 : sal_Size nChars = rtl_convertUnicodeToText(m_aConverter,
39 : NULL, &c, 1, aTempArray, sizeof(aTempArray),
40 : RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
41 438109 : &nCvtInfo, &nTempSize);
42 438109 : m_bCapable = nChars > 0;
43 438109 : }
44 3825 : void reset()
45 : {
46 3825 : m_bCapable = true;
47 3825 : }
48 1600502 : bool isOK() const
49 : {
50 1600502 : return m_bCapable;
51 : }
52 255 : const char* getName() const
53 : {
54 255 : return m_pEncoding;
55 : }
56 :
57 : };
58 :
59 1 : int main()
60 : {
61 : # define EXP(x) Encoder(x, #x)
62 :
63 : Encoder aConverters[15] =
64 : {
65 : EXP(RTL_TEXTENCODING_MS_1361),
66 : EXP(RTL_TEXTENCODING_MS_950),
67 : EXP(RTL_TEXTENCODING_MS_949),
68 : EXP(RTL_TEXTENCODING_MS_936),
69 : EXP(RTL_TEXTENCODING_MS_932),
70 : EXP(RTL_TEXTENCODING_MS_874),
71 : EXP(RTL_TEXTENCODING_MS_1258),
72 : EXP(RTL_TEXTENCODING_MS_1257),
73 : EXP(RTL_TEXTENCODING_MS_1256),
74 : EXP(RTL_TEXTENCODING_MS_1255),
75 : EXP(RTL_TEXTENCODING_MS_1254),
76 : EXP(RTL_TEXTENCODING_MS_1253),
77 : EXP(RTL_TEXTENCODING_MS_1251),
78 : EXP(RTL_TEXTENCODING_MS_1250),
79 : EXP(RTL_TEXTENCODING_MS_1252)
80 16 : };
81 :
82 1 : printf("//Do not edit manually, generated from bestreversemap.cxx\n");
83 1 : printf("#include <rtl/textenc.h>\n");
84 1 : printf("#include <tools/tenccvt.hxx>\n");
85 1 : printf("rtl_TextEncoding getBestMSEncodingByChar(sal_Unicode c)\n");
86 1 : printf("{\n");
87 :
88 1 : sal_Unicode c = 0;
89 257 : while (c < 0xFFFF)
90 : {
91 4080 : for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
92 3825 : aConverters[i].reset();
93 :
94 255 : int nMostCapable = -1;
95 :
96 41095 : while(c < 0xFFFF)
97 : {
98 40840 : bool bSomethingCapable = false;
99 653440 : for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
100 : {
101 612600 : if (aConverters[i].isOK())
102 62807 : aConverters[i].checkSupports(c);
103 612600 : if (aConverters[i].isOK())
104 : {
105 58982 : bSomethingCapable = true;
106 58982 : nMostCapable = i;
107 : }
108 : }
109 40840 : if (!bSomethingCapable)
110 255 : break;
111 40585 : ++c;
112 : }
113 255 : sal_Unicode cEnd = c;
114 255 : printf(" if (c < 0x%x)\n", c);
115 255 : printf(" return %s;\n", aConverters[nMostCapable].getName());
116 25460 : while(c < 0xFFFF)
117 : {
118 25204 : bool bNothingCapable = true;
119 400252 : for (size_t i = 0; i < SAL_N_ELEMENTS(aConverters); ++i)
120 : {
121 375302 : aConverters[i].checkSupports(c);
122 375302 : if (aConverters[i].isOK())
123 : {
124 254 : bNothingCapable = false;
125 254 : break;
126 : }
127 : }
128 25204 : if (!bNothingCapable)
129 254 : break;
130 24950 : ++c;
131 : }
132 255 : if (cEnd != c)
133 : {
134 209 : if (c < 0xFFFF)
135 : {
136 208 : printf(" if (c < 0x%x)\n", c);
137 208 : printf(" return RTL_TEXTENCODING_DONTKNOW;\n");
138 : }
139 : else
140 1 : printf(" return RTL_TEXTENCODING_DONTKNOW;\n");
141 : }
142 : }
143 :
144 1 : printf("}\n");
145 1 : fflush(stdout);
146 :
147 16 : return EXIT_SUCCESS;
148 : }
149 :
150 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|