8
rcc_engine rcc_enca_engine = {
9
"Enca Library", &rccEncaInitContext, &rccEncaFreeContext, &rccEnca, {"UTF-8", NULL}
12
static rcc_library_handle enca_handle = NULL;
13
static rcc_engine enca_engines[sizeof(rcc_default_languages)/sizeof(rcc_language)];
16
static int rccEncaLibraryLoad() {
17
#ifdef RCC_ENCA_DYNAMIC
18
if (enca_handle) return 0;
20
enca_handle = rccLibraryLoad(RCC_ENCA_LIB);
21
if (!enca_handle) return -1;
23
enca_set_multibyte=rccLibraryFind(enca_handle,"enca_set_multibyte");
24
enca_set_interpreted_surfaces=rccLibraryFind(enca_handle,"enca_set_interpreted_surfaces");
25
enca_set_ambiguity=rccLibraryFind(enca_handle,"enca_set_ambiguity");
26
enca_set_filtering=rccLibraryFind(enca_handle,"enca_set_filtering");
27
enca_set_garbage_test=rccLibraryFind(enca_handle,"enca_set_garbage_test");
28
enca_set_termination_strictness=rccLibraryFind(enca_handle,"enca_set_termination_strictness");
29
enca_set_significant=rccLibraryFind(enca_handle,"enca_set_significant");
30
enca_set_threshold=rccLibraryFind(enca_handle,"enca_set_threshold");
31
enca_charset_name=rccLibraryFind(enca_handle,"enca_charset_name");
32
enca_get_language_charsets=rccLibraryFind(enca_handle,"enca_get_language_charsets");
33
enca_analyser_alloc=rccLibraryFind(enca_handle,"enca_analyser_alloc");
34
enca_analyser_free=rccLibraryFind(enca_handle,"enca_analyser_free");
35
enca_analyse_const=rccLibraryFind(enca_handle,"enca_analyse_const");
37
if ((!enca_set_multibyte)||(!enca_set_interpreted_surfaces)||(!enca_set_ambiguity)||
38
(!enca_set_filtering)||(!enca_set_garbage_test)||(!enca_set_termination_strictness)||
39
(!enca_set_significant)||(!enca_set_threshold)||(!enca_charset_name)||
40
(!enca_get_language_charsets)||(!enca_analyser_alloc)||(!enca_analyser_free)||
41
(!enca_analyse_const)) {
42
rccLibraryClose(enca_handle);
45
perror( "rccEnca. Incomplete function set in library" );
46
# endif /* RCC_DEBUG */
49
#endif /* RCC_ENCA_DYNAMIC */
53
static void rccEncaLibraryUnload() {
54
#ifdef RCC_ENCA_DYNAMIC
56
rccLibraryUnload(enca_handle);
59
#endif /* RCC_ENCA_DYNAMIC */
67
rcc_engine_list engines;
72
#ifdef RCC_ENCA_SUPPORT
73
err = rccEncaLibraryLoad();
76
for (i=0;rcc_default_languages[i];i++) {
77
engines = rcc_default_languages[i].engines;
78
for (j=0;engines[j];j++)
79
if (j >= RCC_MAX_ENGINES) continue;
81
charsets = enca_get_language_charsets(rcc_default_languages[i].sn, &ncharsets);
83
memcpy(enca_engines+i, &rcc_enca_engine, sizeof(rcc_engine));
84
for (k=0;enca_engines[i].charsets[k];k++);
85
if (n_charsets+k>=RCC_MAX_CHARSETS) n_charsets = RCC_MAX_CHARSETS-k;
87
for (l=0;l<n_charsets;l++)
88
enca_engines[j].charset[k++] = enca_charset_name(charsets[l], ENCA_NAME_STYLE_ICONV);
89
enca_engines[j].charset[k] = NULL;
91
engines[j] = enca_engines + i;
97
#endif /* RCC_ENCA_SUPPORT */
103
#ifdef RCC_ENCA_SUPPORT
104
rccEncaLibraryUnload();
105
#endif /* RCC_ENCA_SUPPORT */
109
rcc_engine_internal rccEncaInitContext(rcc_engine_context *ctx) {
110
#ifdef RCC_ENCA_SUPPORT
113
if ((!ctx)||(!ctx->language)) return NULL;
115
enca = enca_analyser_alloc(ctx->lanuage->sn);
116
if (!enca) return NULL;
118
enca_set_threshold(enca, 1);
119
enca_set_multibyte(enca, 1);
120
enca_set_ambiguity(enca, 1);
121
enca_set_garbage_test(enca, 0);
122
enca_set_filtering(enca, 0);
123
enca_set_significant(enca,1);
124
enca_set_termination_strictness(enca,0);
126
return (rcc_engine_internal)enca;
127
#else /* RCC_ENCA_SUPPORT */
129
#endif /* RCC_ENCA_SUPPORT */
132
void rccEncaFreeContext(rcc_engine_context ctx) {
133
rcc_engine_internal internal;
134
#ifdef RCC_ENCA_SUPPORT
135
internal = rccEngineGetInternal(ctx);
137
enca_analyser_free(internal);
138
#endif /* RCC_ENCA_SUPPORT */
141
rcc_charset_id rccEnca(rcc_engine_context ctx, char *buf, int len) {
142
#ifdef RCC_ENCA_SUPPORT
143
rcc_engine_internal internal;
147
internal = rccEngineGetInternal(ctx);
148
if ((!internal)||(!buf)) return -1;
151
len = STRLEN(buf, len);
153
ee = enca_analyse_const((EncaAnalyser)ctx->internal,buf,len);
154
if (ee.charset<0) return -1;
156
charset = enca_charset_name(ee.charset, ENCA_NAME_STYLE_ICONV);
157
return rccGetAutoCharsetByName(ctx->ctx, charset);
158
#else /* RCC_ENCA_SUPPORT */
160
#endif /* RCC_ENCA_SUPPORT */