~ubuntu-branches/ubuntu/trusty/sunpinyin/trusty-proposed

« back to all changes in this revision

Viewing changes to src/slm/tslmendian/slm_endian.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Zhengpeng Hou
  • Date: 2010-09-06 12:23:46 UTC
  • Revision ID: james.westby@ubuntu.com-20100906122346-yamofztk2j5p85fs
Tags: upstream-2.0.2
ImportĀ upstreamĀ versionĀ 2.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 ShowUsage(const char* progname)
 
43
{
 
44
    printf("Usage:\n");
 
45
    printf("    %s [-v] [-e endian] [-i <input-lm-file>] [-o <output-lm-file>]\n", progname);
 
46
    printf("\n");
 
47
    printf("Description:\n");
 
48
    printf("    %s converts the binary language model files used by SunPinyin from big-endian to small-endian or vice versa.\n", progname);
 
49
    printf("\nOptions:\n");
 
50
    printf("    -v                   # print out the endian-ness of <input-lm-file>.\n");
 
51
    printf("    -e endian            # the endian-ness of <output-lm-file>. It can be either \"be\" or \"le\".\n");
 
52
    printf("    -i <input-lm-file>   # input file name, e.g. lm_sc.t3g\n");
 
53
    printf("    -o <output-lm-file>  # converted output file name. the endian-ness is of host by default.\n");
 
54
    
 
55
    exit(100);
 
56
}
 
57
 
 
58
void showEndian(const CThreadSlmFile& slm_file)
 
59
{
 
60
    int endian = slm_file.getEndian();
 
61
    printf("%s\n", endian2str(endian));
 
62
}
 
63
 
 
64
int convert(CThreadSlmFile& slm_file, const char* output, int endian)
 
65
{
 
66
    printf("converting from %s to %s ...",
 
67
           endian2str(slm_file.getEndian()),
 
68
           endian2str(endian));
 
69
 
 
70
    size_t nwritten = slm_file.save(output, endian);
 
71
    if (nwritten != slm_file.size()) {
 
72
        fprintf(stderr, "\nfailed to write %s. %zu/%zu bytes written.\n", output, nwritten, slm_file.size());
 
73
        return 1;
 
74
    }
 
75
    printf("done.\n");
 
76
    return 0;
 
77
}
 
78
 
 
79
int
 
80
main(int argc, char* argv[])
 
81
{
 
82
    int opt;
 
83
    int endian = CThreadSlmFile::getHostEndian();
 
84
 
 
85
    bool opt_info = false;
 
86
    const char* input = NULL;
 
87
    const char* output = NULL;
 
88
    while ((opt = getopt(argc, argv, "e:i:o:v")) != -1) {
 
89
        switch (opt) {
 
90
        case 'e':
 
91
            endian = parse_endian(optarg);
 
92
            break;
 
93
        case 'v':
 
94
            opt_info = true;
 
95
            break;
 
96
        case 'i':
 
97
            input = optarg;
 
98
            break;
 
99
        case 'o':
 
100
            output = optarg;
 
101
            break;
 
102
        }
 
103
    }
 
104
 
 
105
    CThreadSlmFile slm_file;
 
106
    if (!input) {
 
107
        ShowUsage(argv[0]);
 
108
    }
 
109
    if (!slm_file.load(input)) {
 
110
        fprintf(stderr, "failed to parse %s. corrupt file?\n", input);
 
111
        return 1;
 
112
    }
 
113
    if (opt_info) {
 
114
        showEndian(slm_file);
 
115
    }
 
116
    if (output) {
 
117
        if (endian == -1) {
 
118
            ShowUsage(argv[0]);
 
119
        } else {
 
120
            return convert(slm_file, output, endian);
 
121
        }
 
122
    }
 
123
    return 0;
 
124
}