30#include <rtl/ustrbuf.hxx>
32#include <unicode/tblcoll.h>
38 FILE *fp = fopen(file,
"wb");
40 fprintf(stderr,
"Opening %s for writing failed: %s\n", file, strerror(errno));
45 fprintf(fp,
" * Copyright(c) 1999 - 2000, Sun Microsystems, Inc.\n");
46 fprintf(fp,
" * All Rights Reserved.\n");
47 fprintf(fp,
" */\n\n");
48 fprintf(fp,
"/* !!!The file is generated automatically. DO NOT edit the file manually!!! */\n\n");
49 fprintf(fp,
"#include <sal/types.h>\n");
50 fprintf(fp,
"\nextern \"C\" {\n");
53 fprintf(fp,
"\nalignas(4) static const sal_uInt8 %s[] = {",
name);
56 for (sal_Int32
i = 0;
i < len;
i++) {
58 if (
count++ % 16 == 0)
61 fprintf(fp,
"0x%04x, ", data[
i]);
63 fprintf(fp,
"\n};\n\n");
65 fprintf(fp,
"#ifndef DISABLE_DYNLOADING\n");
66 fprintf(fp,
"SAL_DLLPUBLIC_EXPORT const sal_uInt8* get_%s() { return %s; }\n",
name,
name);
67 fprintf(fp,
"SAL_DLLPUBLIC_EXPORT size_t get_%s_length() { return sizeof(%s); }\n",
name,
name);
68 fprintf(fp,
"#else\n");
69 fprintf(fp,
"SAL_DLLPUBLIC_EXPORT const sal_uInt8* get_collator_data_%s() { return %s; }\n",
name,
name);
70 fprintf(fp,
"SAL_DLLPUBLIC_EXPORT size_t get_collator_data_%s_length() { return sizeof(%s); }\n",
name,
name);
71 fprintf(fp,
"#endif\n");
83 if (argc < 4) exit(-1);
85 fp = fopen(argv[1],
"rb");
87 fprintf(stderr,
"Opening the rule source file %s for reading failed: %s\n", argv[1], strerror(errno));
91 fseek(fp, 0, SEEK_END);
92 int fileSize = ftell(fp);
96 OUStringBuffer Obuf(fileSize);
97 while (fgets(str, 1024, fp)) {
99 sal_Int32 len = strlen(str) - 1;
101 if (len == 0 || str[0] ==
'#')
105 OUString Ostr = OUString(str, len, RTL_TEXTENCODING_UTF8).trim();
107 len = Ostr.getLength();
115 UErrorCode status = U_ZERO_ERROR;
120 auto coll = std::make_unique<icu::RuleBasedCollator>(
reinterpret_cast<const UChar *
>(Obuf.getStr()), status);
122 if (U_SUCCESS(status)) {
123 std::vector<uint8_t> data;
124 int32_t len = coll->cloneBinary(
nullptr, 0, status);
125 if (status == U_BUFFER_OVERFLOW_ERROR) {
127 status = U_ZERO_ERROR;
128 len = coll->cloneBinary(data.data(), len, status);
130 if (U_SUCCESS(status))
131 data_write(argv[2], argv[3], data.data(), len);
133 printf(
"Could not get rule data from collator\n");
136 printf(
"\nRule parsing error\n");
139 return U_SUCCESS(status) ? 0 : 1;
static void data_write(char *file, char *name, sal_uInt8 *data, sal_Int32 len)
SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)