18
rcc_context rccInitContext(rcc_init_flags flags, unsigned int max_languages, unsigned int max_classes, const char *locale) {
22
rcc_language_ptr *languages;
23
rcc_class_ptr *classes;
24
rcc_language_config *configs;
27
if (!max_languages) max_languages = RCC_MAX_LANGUAGES;
28
if (!max_classes) max_classes = RCC_MAX_CLASSES;
30
ctx = (rcc_context*)malloc(sizeof(rcc_context));
31
languages = (rcc_language_ptr*)malloc((max_languages+1)*sizeof(rcc_language_ptr));
32
classes = (rcc_class_ptr*)malloc((max_classes+1)*sizeof(rcc_class_ptr));
33
from = (iconv_t*)malloc((max_classes)*sizeof(iconv_t));
34
to = (iconv_t*)malloc((max_classes)*sizeof(iconv_t));
36
configs = (rcc_language_config*)malloc((max_languages)*sizeof(rcc_language_config));
38
if ((!ctx)||(!languages)||(!classes)) {
41
if (configs) free(configs);
42
if (classes) free(classes);
43
if (languages) free(languages);
48
ctx->languages = languages;
49
ctx->max_languages = max_languages;
53
ctx->classes = classes;
54
ctx->max_classes = max_classes;
58
ctx->fsiconv = (iconv_t)-1;
60
ctx->iconv_from = from;
62
for (i=0;i<max_classes;i++) {
63
from[i] = (iconv_t)-1;
67
for (i=0;i<RCC_MAX_CHARSETS;i++)
68
ctx->iconv_auto[i] = (iconv_t)-1;
70
ctx->configs = configs;
71
for (i=0;i<max_languages;i++)
72
configs[i].charset = NULL;
74
err = rccEngineInit(&ctx->engine_ctx, ctx);
80
ctx->current_language = 0;
83
if (strlen(locale)>=RCC_MAX_VARIABLE_CHARS) {
87
strcpy(ctx->locale_variable, locale);
89
strcpy(ctx->locale_variable, RCC_LOCALE_VARIABLE);
92
if (flags&RCC_DEFAULT_CONFIGURATION) {
93
if (sizeof(languages)<sizeof(rcc_default_languages)) {
98
for (i=0;rcc_default_languages[i];i++)
99
rccRegisterLanguage(ctx, rcc_default_language[i]);
101
ctx->current_config = rccGetCurrentConfig(ctx);
103
rccRegisterLanguage(ctx, rcc_default_language[0]);
104
ctx->current_config = NULL;
112
static void rccFreeIConv(rcc_context *ctx) {
115
if ((!ctx)||(!ctx->iconv_from)||(!ctx->iconv_to)) return;
117
if ((ctx->fsiconv_t != (iconv_t)-1)&&(ctx->fsiconv_t != (iconv_t)-2)) {
118
iconv_close(ctx->fsiconv);
119
ctx->fsiconv = (iconv_t)-1;
122
for (i=0;i<ctx->n_classes;i++) {
123
if ((ctx->iconv_from[i] != (iconv_t)-1)&&(ctx->iconv_from[i] != (iconv_t)-2)) {
124
iconv_close(ctx->iconv_from[i]);
125
ctx->iconv_from[i] = (iconv_t)-1;
127
if ((ctx->iconv_to[i] != (iconv_t)-1)&&(ctx->iconv_to[i] != (iconv_t)-2)) {
128
iconv_close(ctx->iconv_to[i]);
129
ctx->iconv_to[i] = (iconv_t)-1;
132
for (i=0;i<RCC_MAX_CHARSETS;i++) {
133
if ((ctx->iconv_auto[i] != (iconv_t)-1)&&(ctx->iconv_auto[i] != (iconv_t)-2)) {
134
iconv_close(ctx->iconv_auto[i]);
135
ctx->iconv_auto[i] = (iconv_t)-1;
140
void rccFreeContext(rcc_context *ctx) {
142
rccFreeEngine(&ctx->engine_ctx);
144
if (ctx->iconv_from) free(ctx->iconv_from);
145
if (ctx->iconv_to) free(ctx->iconv_to);
148
for (i=0;i<ctx->max_languages;i++)
149
rccFreeConfig(configs+i);
152
if (ctx->charsets) free(ctx->charsets);
153
if (ctx->classes) free(ctx->classes);
154
if (ctx->languages) free(ctx->languages);
159
rcc_language_id rccRegisterLanguage(rcc_context *ctx, rcc_language *language) {
160
if ((!ctx)||(!language)) return -1;
161
if (ctx->n_languages == ctx->max_languages) return -2;
162
ctx->languages[ctx->n_languages++] = language;
163
ctx->languages[ctx->n_languages] = NULL;
165
if (!ctx->current_language)
166
ctx->current_config = rccGetCurrentConfig(ctx);
168
return ctx->n_languages-1;
171
rcc_charset_id rccLanguageRegisterCharset(rcc_language *language, rcc_charset charset) {
174
if ((!language)||(!charset)) return -1;
175
for (i=0;language->charsets[i];i++);
176
if (i>=RCC_MAX_CHARSETS) return -2;
177
language->charsets[i++] = charset;
178
language->charsets[i] = NULL;
182
rcc_engine_id rccLanguageRegisterEngine(rcc_language *language, rcc_engine *engine) {
185
if ((!language)||(!engine)) return -1;
186
for (i=0;language->engines[i];i++);
187
if (i>=RCC_MAX_ENGINES) return -2;
188
language->engines[i++] = engine;
189
language->engines[i] = NULL;
193
rcc_class_id rccRegisterClass(rcc_context *ctx, rcc_class *cl) {
194
if ((!ctx)||(!cl)) return -1;
195
if (ctx->n_classes == ctx->max_classes) return -2;
197
ctx->classes[ctx->n_languages++] = cl;
198
ctx->classes[ctx->n_languages] = NULL;
199
return ctx->n_classes-1;
203
rcc_class_type rccGetClassType(rcc_context *ctx, rcc_class_id class_id) {
206
if (!ctx)||(class_id<0)||(class_id>=ctx->n_classes)) return RCC_CLASS_INVALID;
208
cl = rcc->classes[class_id];
209
return cl->class_type;
212
static rcc_language *rccGetLanguageList(rcc_context *ctx) {
213
if (!ctx) return NULL;
214
return ctx->languages;
217
static rcc_charset *rccGetCharsetList(rcc_context *ctx, rcc_language_id language_id) {
218
if ((!ctx)||(language_id<0)||(language_id>=ctx->n_languages)) return NULL;
219
return ctx->languages[language_id]->charsets;
222
static rcc_engine *rccGetEngineList(rcc_context *ctx, rcc_language_id language_id) {
223
if ((!ctx)||(language_id<0)||(language_id>=ctx->n_languages)) return NULL;
224
return ctx->languages[language_id]->engines;
227
static rcc_charset *rccGetCurrentCharsetList(rcc_context *ctx) {
228
rcc_language_id language_id;
230
if (!ctx) return NULL;
232
language_id = rccGetCurrentLanguage(ctx);
233
if (language_id<0) return NULL;
235
return rccGetCharsetList(ctx, language_id);
238
static rcc_charset *rccGetCurrentEngineList(rcc_context *ctx) {
239
rcc_language_id language_id;
241
if (!ctx) return NULL;
243
language_id = rccGetCurrentLanguage(ctx);
244
if (language_id<0) return NULL;
246
return rccGetEngineList(ctx, language_id);
249
static rcc_charset *rccGetCurrentAutoCharsetList(rcc_context *ctx) {
250
rcc_language_id language_id;
251
rcc_engine_id engine_id;
253
if (!ctx) return NULL;
255
language_id = rccGetCurrentLanguage(ctx);
256
engine_id = rccGetCurrentEngine(ctx);
257
if ((language_id<0)||(engine_id<0)) return NULL;
260
return ctx->languages[language_id]->engine[engine_id]->charsets;
264
int rccConfigure(rcc_engine_context *ctx) {
266
rcc_charset *charsets;
270
if (!ctx->configure) return 0;
273
for (i=0;i<ctx->n_classes;i++) {
274
charset = rccGetCurrentCharsetName(ctx, i);
275
if (strcmp(charset, "UTF-8")&&strcmp(charset, "UTF8")) {
276
iconv_from = iconv_open("UTF-8", charset);
277
iconv_to = iconv_open(charset, "UTF-8");
279
iconv_from = (iconv_t)-2;
280
iconv_to = (iconv_t)-2;
284
charsets = rccGetCurrentAutoCharsetList(ctx);
285
for (i=0;charsets[i];i++) {
286
charset = charsets[i];
287
if (strcmp(charset, "UTF-8")&&strcmp(charset, "UTF8"))
288
iconv_auto = iconv_open("UTF-8", charset);
290
iconv_auto = (iconv_t)-2;
293
rccEngineConfigure(&ctx->engine_ctx);
298
char *rccCreateResult(rcc_context *ctx, int len, int *rlen) {
301
if (!len) len = strlen(ctx->tmpbuffer);
303
res = (char*)malloc(len+1);
304
if (!res) return NULL;
306
memcpy(res, ctx->tmpbuffer, len);
309
if (rlen) *rlen = len;