summaryrefslogtreecommitdiffstats
path: root/src/recode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/recode.c')
-rw-r--r--src/recode.c68
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;