/rusxmms/librcc

To get this branch, use:
bzr branch http://suren.me/webbzr/rusxmms/librcc

« back to all changes in this revision

Viewing changes to src/enca.c

  • Committer: Suren A. Chilingaryan
  • Date: 2005-06-16 23:14:30 UTC
  • Revision ID: Arch-1:ds@dside.dyndns.org--darksoft-2004%librcc--main--0.1--base-0
Initial Import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
 
 
3
#include "librcc.h"
 
4
 
 
5
#include "plugin.h"
 
6
#include "enca.h"
 
7
 
 
8
rcc_engine rcc_enca_engine = {
 
9
    "Enca Library", &rccEncaInitContext, &rccEncaFreeContext, &rccEnca, {"UTF-8", NULL}
 
10
};
 
11
 
 
12
static rcc_library_handle enca_handle = NULL;
 
13
static rcc_engine enca_engines[sizeof(rcc_default_languages)/sizeof(rcc_language)]; 
 
14
 
 
15
 
 
16
static int rccEncaLibraryLoad() {
 
17
#ifdef RCC_ENCA_DYNAMIC
 
18
    if (enca_handle) return 0;
 
19
    
 
20
    enca_handle = rccLibraryLoad(RCC_ENCA_LIB);
 
21
    if (!enca_handle) return -1;
 
22
 
 
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");
 
36
 
 
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);
 
43
            enca_handle = NULL;
 
44
# ifdef RCC_DEBUG
 
45
            perror( "rccEnca. Incomplete function set in library" );
 
46
# endif /* RCC_DEBUG */
 
47
    }
 
48
 
 
49
#endif /* RCC_ENCA_DYNAMIC */
 
50
    return 0;
 
51
}
 
52
 
 
53
static void rccEncaLibraryUnload() {
 
54
#ifdef RCC_ENCA_DYNAMIC
 
55
    if (enca_handle) {
 
56
        rccLibraryUnload(enca_handle);
 
57
        enca_handle = NULL;
 
58
    }
 
59
#endif /* RCC_ENCA_DYNAMIC */
 
60
}
 
61
 
 
62
 
 
63
int rccEncaInit() {
 
64
    int err;
 
65
    unsigned int i,j,k,l;
 
66
 
 
67
    rcc_engine_list engines;
 
68
    
 
69
    int *charsets;
 
70
    size_t ncharsets;
 
71
 
 
72
#ifdef RCC_ENCA_SUPPORT
 
73
    err = rccEncaLibraryLoad();
 
74
    if (err) return err;
 
75
 
 
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;
 
80
        
 
81
        charsets = enca_get_language_charsets(rcc_default_languages[i].sn, &ncharsets);
 
82
        if (charsets) {
 
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;
 
86
            
 
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;
 
90
 
 
91
            engines[j] = enca_engines + i;
 
92
            engines[j+1] = NULL;
 
93
 
 
94
            free(charsets);
 
95
        }
 
96
    }
 
97
#endif /* RCC_ENCA_SUPPORT */
 
98
 
 
99
    return 0;
 
100
}           
 
101
            
 
102
void rccEncaFree() {
 
103
#ifdef RCC_ENCA_SUPPORT
 
104
    rccEncaLibraryUnload();
 
105
#endif /* RCC_ENCA_SUPPORT */
 
106
}                           
 
107
 
 
108
 
 
109
rcc_engine_internal rccEncaInitContext(rcc_engine_context *ctx) {
 
110
#ifdef RCC_ENCA_SUPPORT
 
111
    EncaAnalyser enca;
 
112
    
 
113
    if ((!ctx)||(!ctx->language)) return NULL;
 
114
    
 
115
    enca = enca_analyser_alloc(ctx->lanuage->sn);    
 
116
    if (!enca) return NULL;
 
117
 
 
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);
 
125
    
 
126
    return (rcc_engine_internal)enca;
 
127
#else /* RCC_ENCA_SUPPORT */
 
128
    return NULL;
 
129
#endif /* RCC_ENCA_SUPPORT */
 
130
}
 
131
 
 
132
void rccEncaFreeContext(rcc_engine_context ctx) {
 
133
    rcc_engine_internal internal;
 
134
#ifdef RCC_ENCA_SUPPORT
 
135
    internal = rccEngineGetInternal(ctx);
 
136
    if (internal)
 
137
        enca_analyser_free(internal);
 
138
#endif /* RCC_ENCA_SUPPORT */
 
139
}
 
140
 
 
141
rcc_charset_id rccEnca(rcc_engine_context ctx, char *buf, int len) {
 
142
#ifdef RCC_ENCA_SUPPORT
 
143
    rcc_engine_internal internal;
 
144
    const char *charset;
 
145
    EncaEncoding ee;
 
146
 
 
147
    internal = rccEngineGetInternal(ctx);
 
148
    if ((!internal)||(!buf)) return -1;
 
149
    
 
150
    
 
151
    len = STRLEN(buf, len);
 
152
 
 
153
    ee = enca_analyse_const((EncaAnalyser)ctx->internal,buf,len);
 
154
    if (ee.charset<0) return -1;
 
155
 
 
156
    charset = enca_charset_name(ee.charset, ENCA_NAME_STYLE_ICONV);
 
157
    return rccGetAutoCharsetByName(ctx->ctx, charset);
 
158
#else /* RCC_ENCA_SUPPORT */
 
159
    return -1;
 
160
#endif /* RCC_ENCA_SUPPORT */
 
161
}