24 #include "config_reader.h"
25 #include "converter.h"
26 #include "dict_group.h"
27 #include "dict_chain.h"
36 static opencc_error errnum = OPENCC_ERROR_VOID;
37 static int lib_initialized = 0;
39 static void lib_initialize(
void) {
41 bindtextdomain(PACKAGE_NAME, LOCALEDIR);
50 size_t* outbuf_left) {
51 if (!lib_initialized) {
55 size_t retval = converter_convert(opencc->converter,
60 if (retval == (
size_t)-1) {
61 errnum = OPENCC_ERROR_CONVERTER;
67 if (!lib_initialized) {
70 size_t actual_length = strlen(inbuf);
71 if ((length == (
size_t)-1) || (length > actual_length)) {
72 length = actual_length;
74 ucs4_t* winbuf = utf8_to_ucs4(inbuf, length);
75 if (winbuf == (ucs4_t*)-1) {
77 errnum = OPENCC_ERROR_ENCODING;
81 size_t outbuf_len = length;
82 size_t outsize = outbuf_len;
83 char* original_outbuf = (
char*)malloc(
sizeof(
char) * (outbuf_len + 1));
84 char* outbuf = original_outbuf;
85 original_outbuf[0] =
'\0';
87 size_t wbufsize = length + 64;
88 ucs4_t* woutbuf = (ucs4_t*)malloc(
sizeof(ucs4_t) * (wbufsize + 1));
89 ucs4_t* pinbuf = winbuf;
90 ucs4_t* poutbuf = woutbuf;
91 size_t inbuf_left, outbuf_left;
92 inbuf_left = ucs4len(winbuf);
93 outbuf_left = wbufsize;
94 while (inbuf_left > 0) {
100 if (retval == (
size_t)-1) {
107 char* ubuff = ucs4_to_utf8(woutbuf, (
size_t)-1);
108 if (ubuff == (
char*)-1) {
112 errnum = OPENCC_ERROR_ENCODING;
115 size_t ubuff_len = strlen(ubuff);
116 while (ubuff_len > outsize) {
117 size_t outbuf_offset = outbuf - original_outbuf;
118 outsize += outbuf_len;
119 outbuf_len += outbuf_len;
121 (
char*)realloc(original_outbuf,
sizeof(
char) * outbuf_len);
122 outbuf = original_outbuf + outbuf_offset;
124 strncpy(outbuf, ubuff, ubuff_len);
128 outbuf_left = wbufsize;
133 original_outbuf = (
char*)realloc(original_outbuf,
134 sizeof(
char) * (strlen(original_outbuf) + 1));
135 return original_outbuf;
139 if (!lib_initialized) {
144 opencc->dict_chain = NULL;
145 opencc->converter = converter_open();
146 converter_set_conversion_mode(opencc->converter, OPENCC_CONVERSION_FAST);
147 if (config_file == NULL) {
152 Config* config = config_open(config_file);
153 if (config == (
Config*)-1) {
154 errnum = OPENCC_ERROR_CONFIG;
157 opencc->dict_chain = config_get_dict_chain(config);
158 converter_assign_dictionary(opencc->converter, opencc->dict_chain);
159 config_close(config);
161 return (opencc_t)opencc;
165 if (!lib_initialized) {
169 converter_close(opencc->converter);
170 if (opencc->dict_chain != NULL) {
171 dict_chain_delete(opencc->dict_chain);
178 const char* dict_filename,
179 opencc_dictionary_type dict_type) {
180 if (!lib_initialized) {
185 if (opencc->dict_chain == NULL) {
186 opencc->dict_chain = dict_chain_new(NULL);
187 DictGroup = dict_chain_add_group(opencc->dict_chain);
189 DictGroup = dict_chain_get_group(opencc->dict_chain, 0);
191 int retval = dict_group_load(DictGroup, dict_filename, dict_type);
193 errnum = OPENCC_ERROR_DICTLOAD;
196 converter_assign_dictionary(opencc->converter, opencc->dict_chain);
201 opencc_conversion_mode conversion_mode) {
202 if (!lib_initialized) {
206 converter_set_conversion_mode(opencc->converter, conversion_mode);
210 if (!lib_initialized) {
217 if (!lib_initialized) {
223 case OPENCC_ERROR_VOID:
225 case OPENCC_ERROR_DICTLOAD:
226 dictionary_perror(_(
"Dictionary loading error"));
228 case OPENCC_ERROR_CONFIG:
229 config_perror(_(
"Configuration error"));
231 case OPENCC_ERROR_CONVERTER:
232 converter_perror(_(
"Converter error"));
234 case OPENCC_ERROR_ENCODING:
235 perr(_(
"Encoding error"));