Tizen 2.1 base
[platform/core/uifw/ise-engine-sunpinyin.git] / src / slm / tslmendian / slm_endian.cpp
1 /*
2  * Copyright (c) 2009 Kov Chai <tchaikov@gmail.com>
3  *
4  * The contents of this file are subject to the terms of either the GNU Lesser
5  * General Public License Version 2.1 only ("LGPL") or the Common Development and
6  * Distribution License ("CDDL")(collectively, the "License"). You may not use this
7  * file except in compliance with the License. You can obtain a copy of the CDDL at
8  * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
9  * http://www.opensource.org/licenses/lgpl-license.php. See the License for the
10  * specific language governing permissions and limitations under the License. When
11  * distributing the software, include this License Header Notice in each file and
12  * include the full text of the License in the License file as well as the
13  * following notice:
14  *
15  * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
16  * (CDDL)
17  * For Covered Software in this distribution, this License shall be governed by the
18  * laws of the State of California (excluding conflict-of-law provisions).
19  * Any litigation relating to this License shall be subject to the jurisdiction of
20  * the Federal Courts of the Northern District of California and the state courts
21  * of the State of California, with venue lying in Santa Clara County, California.
22  *
23  * Contributor(s):
24  *
25  * If you wish your version of this file to be governed by only the CDDL or only
26  * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
27  * include this software in this distribution under the [CDDL or LGPL Version 2.1]
28  * license." If you don't indicate a single choice of license, a recipient has the
29  * option to distribute your version of this file under either the CDDL or the LGPL
30  * Version 2.1, or to extend the choice of license to its licensees as provided
31  * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
32  * Version 2 license, then the option applies only if the new code is made subject
33  * to such option by the copyright holder.
34  */
35
36 #include <unistd.h>
37 #include <stdlib.h>
38 #include <assert.h>
39 #include "slm_file.h"
40 #include "writer.h"
41
42 void
43 ShowUsage(const char* progname)
44 {
45     printf("Usage:\n");
46     printf(
47         "    %s [-v] [-e endian] [-i <input-lm-file>] [-o <output-lm-file>]\n",
48         progname);
49     printf("\n");
50     printf("Description:\n");
51     printf(
52         "    %s converts the binary language model files used by SunPinyin from big-endian to small-endian or vice versa.\n",
53         progname);
54     printf("\nOptions:\n");
55     printf(
56         "    -v                   # print out the endian-ness of <input-lm-file>.\n");
57     printf(
58         "    -e endian            # the endian-ness of <output-lm-file>. It can be either \"be\" or \"le\".\n");
59     printf("    -i <input-lm-file>   # input file name, e.g. lm_sc.t3g\n");
60     printf(
61         "    -o <output-lm-file>  # converted output file name. the endian-ness is of host by default.\n");
62
63     exit(100);
64 }
65
66 void
67 showEndian(const CThreadSlmFile& slm_file)
68 {
69     int endian = slm_file.getEndian();
70     printf("%s\n", endian2str(endian));
71 }
72
73 int
74 convert(CThreadSlmFile& slm_file, const char* output, int endian)
75 {
76     printf("converting from %s to %s ...",
77            endian2str(slm_file.getEndian()),
78            endian2str(endian));
79
80     size_t nwritten = slm_file.save(output, endian);
81     if (nwritten != slm_file.size()) {
82         fprintf(stderr,
83                 "\nfailed to write %s. %zu/%zu bytes written.\n",
84                 output,
85                 nwritten,
86                 slm_file.size());
87         return 1;
88     }
89     printf("done.\n");
90     return 0;
91 }
92
93 int
94 main(int argc, char* argv[])
95 {
96     int opt;
97     int endian = CThreadSlmFile::getHostEndian();
98
99     bool opt_info = false;
100     const char* input = NULL;
101     const char* output = NULL;
102     while ((opt = getopt(argc, argv, "e:i:o:v")) != -1) {
103         switch (opt) {
104         case 'e':
105             endian = parse_endian(optarg);
106             break;
107         case 'v':
108             opt_info = true;
109             break;
110         case 'i':
111             input = optarg;
112             break;
113         case 'o':
114             output = optarg;
115             break;
116         }
117     }
118
119     CThreadSlmFile slm_file;
120     if (!input) {
121         ShowUsage(argv[0]);
122     }
123     if (!slm_file.load(input)) {
124         fprintf(stderr, "failed to parse %s. corrupt file?\n", input);
125         return 1;
126     }
127     if (opt_info) {
128         showEndian(slm_file);
129     }
130     if (output) {
131         if (endian == -1) {
132             ShowUsage(argv[0]);
133         } else {
134             return convert(slm_file, output, endian);
135         }
136     }
137     return 0;
138 }