1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
26 #include <sal/types.h>
27 #include <rtl/ustring.hxx>
29 #define MAX_ADDRESS 0x30000
30 #define MAX_INDEX MAX_ADDRESS/0x100
32 using namespace ::rtl
;
36 SAL_IMPLEMENT_MAIN_WITH_ARGS(argc
, argv
)
40 if (argc
< 4) exit(-1);
42 fp
= fopen(argv
[1], "rb"); // open the source file for read;
44 fprintf(stderr
, "Opening the rule source file %s for reading failed: %s\n", argv
[1], strerror(errno
));
50 sal_Int32 address
[MAX_ADDRESS
];
51 for (i
=0; i
<MAX_ADDRESS
; i
++) address
[i
]=-1;
52 OUString sep
=OUString(sal_Unicode('|'));
57 while (fgets(str
, 1024, fp
)) {
58 // don't convert last new line character to Ostr.
59 sal_Int32 len
= strlen(str
) - 1;
61 if (len
== 0 || str
[0] == '#')
64 // input file is in UTF-8 encoding
65 OUString Ostr
= OUString((const sal_Char
*)str
, len
, RTL_TEXTENCODING_UTF8
);
66 len
= Ostr
.getLength();
68 continue; // skip empty line.
71 sal_uInt32 nChar
= Ostr
.iterateCodePoints(&nPos
, 2);
72 if (nChar
>= MAX_ADDRESS
) {
73 printf("Code point 0x%lx exceeds MAX_ADDRESS 0x%x, Please increase MAX_ADDRESS", static_cast<long unsigned int>(nChar
), MAX_ADDRESS
);
76 OUString key
=Ostr
.copy(nPos
)+sep
;
77 sal_Int32 idx
= result
.indexOf(key
);
78 if (key
.getLength() > max
) max
=key
.getLength();
82 address
[nChar
]=result
.getLength();
88 fp
= fopen(argv
[2], "wb");
90 fprintf(stderr
, "Opening %s for writing failed: %s\n", argv
[2], strerror(errno
));
95 fprintf(fp
, " * Copyright(c) 1999 - 2006, Sun Microsystems, Inc.\n");
96 fprintf(fp
, " * All Rights Reserved.\n");
97 fprintf(fp
, " */\n\n");
98 fprintf(fp
, "/* !!!The file is generated automatically. DONOT edit the file manually!!! */\n\n");
99 fprintf(fp
, "#include <sal/types.h>\n");
100 fprintf(fp
, "\nextern \"C\" {\n");
102 sal_Int32 index
[MAX_INDEX
];
103 sal_Int32 max_index
=0;
104 for (i
=k
=0; i
<MAX_INDEX
; i
++) {
106 for (j
=0; j
<0x100; j
++) {
107 if (address
[i
*0x100+j
] >=0) {
115 fprintf(fp
, "\nstatic const sal_uInt16 idx1[] = {");
116 for (i
= k
= 0; i
<= max_index
; i
++) {
117 if (k
++ % 16 == 0) fprintf(fp
, "\n\t");
119 fp
, "0x%04lx, ", sal::static_int_cast
< unsigned long >(index
[i
]));
121 fprintf(fp
, "\n};\n\n");
123 sal_Int32 len
=result
.getLength();
124 const sal_Unicode
*ustr
=result
.getStr();
125 fprintf(fp
, "\nstatic const sal_uInt16 idx2[] = {");
126 for (i
= k
= 0; i
<= max_index
; i
++) {
127 if (index
[i
] != 0xFFFF) {
128 for (j
= 0; j
<0x100; j
++) {
129 if (k
++ % 16 == 0) fprintf(fp
, "\n\t");
130 sal_Int32 ad
=address
[i
*0x100+j
];
133 sal::static_int_cast
< unsigned long >(
134 ad
== -1 ? 0 : max
== 2 ? ustr
[ad
] : ad
));
139 fprintf(fp
, "\n};\n\n");
142 fprintf(fp
, "\nstatic const sal_uInt16 *idx3 = NULL;\n\n");
144 fprintf(fp
, "\nstatic const sal_uInt16 idx3[] = {");
145 for (i
= k
= 0; i
< len
; i
++) {
146 if (k
++ % 16 == 0) fprintf(fp
, "\n\t");
147 fprintf(fp
, "0x%04x, ", (sep
.toChar() == ustr
[i
]) ? 0 : ustr
[i
]);
149 fprintf(fp
, "\n};\n\n");
152 fprintf(fp
, "const sal_uInt16** get_%s(sal_Int16 &max_index)\n{\n\tstatic const sal_uInt16 *idx[]={idx1, idx2, idx3};\n\tmax_index=0x%x;\n\treturn idx;\n}\n\n", argv
[3], static_cast<unsigned int>(max_index
));
159 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */