diff options
Diffstat (limited to 'src/recode.c')
-rw-r--r-- | src/recode.c | 68 |
1 files changed, 58 insertions, 10 deletions
diff --git a/src/recode.c b/src/recode.c index a1b7f31..c44095c 100644 --- a/src/recode.c +++ b/src/recode.c @@ -9,6 +9,7 @@ #include "rccstring.h" #include "rccconfig.h" #include "rccdb4.h" +#include "rcctranslate.h" @@ -37,6 +38,7 @@ rcc_string rccSizedFrom(rcc_context ctx, rcc_class_id class_id, const char *buf, rcc_iconv icnv = NULL; rcc_string result; rcc_option_value usedb4; + const char *charset; if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; @@ -66,11 +68,17 @@ rcc_string rccSizedFrom(rcc_context ctx, rcc_class_id class_id, const char *buf, if (err) return NULL; charset_id = rccIConvAuto(ctx, class_id, buf, len); - if (charset_id != (rcc_autocharset_id)-1) icnv = ctx->iconv_auto[charset_id]; + if (charset_id != (rcc_autocharset_id)-1) { + icnv = ctx->iconv_auto[charset_id]; + if (rccGetOption(ctx, RCC_OPTION_AUTOENGINE_SET_CURRENT)) { + charset = rccGetAutoCharsetName(ctx, charset_id); + rccSetCharsetByName(ctx, class_id, charset); + } + } else icnv = ctx->iconv_from[class_id]; if (icnv) { - ret = rccIConv(ctx, icnv, buf, len); + ret = rccIConvInternal(ctx, icnv, buf, len); if (ret == (size_t)-1) return NULL; result = rccCreateString(language_id, ctx->tmpbuffer, ret); } else { @@ -92,8 +100,10 @@ char *rccSizedTo(rcc_context ctx, rcc_class_id class_id, rcc_const_string buf, s char *result; char *prefix, *name; const char *utfstring; + char *translated = NULL; rcc_language_config config; rcc_language_id language_id; + rcc_language_id current_language_id; rcc_class_type class_type; rcc_iconv icnv; @@ -117,6 +127,38 @@ char *rccSizedTo(rcc_context ctx, rcc_class_id class_id, rcc_const_string buf, s if (err) return NULL; class_type = rccGetClassType(ctx, class_id); + if ((class_type != RCC_CLASS_FS)&&(rccGetOption(ctx, RCC_OPTION_TRANSLATE))) { + current_language_id = rccGetCurrentLanguage(ctx); + if (current_language_id != language_id) { + if ((config->trans)&&(config->translang != current_language_id)) { + rccTranslateClose(config->trans); + config->trans = NULL; + } + if (!config->trans) { + config->trans = rccTranslateOpen(rccGetLanguageName(ctx, language_id), rccGetLanguageName(ctx, current_language_id)); + config->translang = current_language_id; + } + if (config->trans) { + translated = rccTranslate(config->trans, utfstring); + if (translated) { + language_id = current_language_id; + + config = rccGetConfig(ctx, language_id); + if (!config) { + free(translated); + return NULL; + } + + err = rccConfigConfigure(config); + if (err) { + free(translated); + return NULL; + } + } + } + } + } + if ((class_type == RCC_CLASS_FS)&&(rccGetOption(ctx, RCC_OPTION_AUTODETECT_FS_NAMES))) { if (rccIsASCII(utfstring)) { result = rccStringExtractString(buf); @@ -141,14 +183,20 @@ char *rccSizedTo(rcc_context ctx, rcc_class_id class_id, rcc_const_string buf, s icnv = config->iconv_to[class_id]; if (icnv) { - newlen = rccIConv(ctx, icnv, rccStringGetString((const char*)buf), newlen); + newlen = rccIConvInternal(ctx, icnv, translated?translated:utfstring, newlen); + if (translated) free(translated); if (newlen == (size_t)-1) return NULL; result = rccCreateResult(ctx, newlen); if (rlen) *rlen = newlen; } else { - result = rccStringExtractString(buf); - if (rlen) *rlen = newlen; + if (translated) { + result = translated; + if (rlen) *rlen = strlen(result); + } else { + result = rccStringExtractString(buf); + if (rlen) *rlen = newlen; + } } return result; @@ -274,7 +322,7 @@ rcc_string rccSizedFromCharset(rcc_context ctx, const char *charset, const char icnv = rccIConvOpen("UTF-8", charset); if (icnv) { - res = rccIConv(ctx, icnv, buf, len); + res = rccIConvInternal(ctx, icnv, buf, len); rccIConvClose(icnv); if (res == (size_t)-1) return NULL; return rccCreateString(language_id, ctx->tmpbuffer, res); @@ -293,7 +341,7 @@ char *rccSizedToCharset(rcc_context ctx, const char *charset, rcc_const_string b icnv = rccIConvOpen(charset, "UTF-8"); if (icnv) { - res = rccIConv(ctx, icnv, rccStringGetString(buf), res); + res = rccIConvInternal(ctx, icnv, rccStringGetString(buf), res); rccIConvClose(icnv); if (res == (size_t)-1) return NULL; @@ -321,7 +369,7 @@ char *rccSizedRecodeToCharset(rcc_context ctx, rcc_class_id class_id, const char icnv = rccIConvOpen(charset, "UTF-8"); if (icnv) { - res = rccIConv(ctx, icnv, str, 0); + res = rccIConvInternal(ctx, icnv, str, 0); rccIConvClose(icnv); free(utf8); @@ -349,7 +397,7 @@ char *rccSizedRecodeFromCharset(rcc_context ctx, rcc_class_id class_id, const ch icnv = rccIConvOpen("UTF-8", charset); if (icnv) { - res = rccIConv(ctx, icnv, buf, len); + res = rccIConvInternal(ctx, icnv, buf, len); rccIConvClose(icnv); if (res == (size_t)-1) return NULL; @@ -373,7 +421,7 @@ char *rccSizedRecodeCharsets(rcc_context ctx, const char *from, const char *to, icnv = rccIConvOpen(to, from); if (!icnv) return NULL; - res = rccIConv(ctx, icnv, buf, len); + res = rccIConvInternal(ctx, icnv, buf, len); rccIConvClose(icnv); if (res == (size_t)-1) return NULL; |