diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/curconfig.c | 63 | ||||
-rw-r--r-- | src/internal.h | 10 | ||||
-rw-r--r-- | src/librcc.c | 93 | ||||
-rw-r--r-- | src/librcc.h | 144 | ||||
-rw-r--r-- | src/lng.c | 18 | ||||
-rw-r--r-- | src/lngconfig.c | 186 | ||||
-rw-r--r-- | src/rccconfig.c | 10 | ||||
-rw-r--r-- | src/rccconfig.h | 6 | ||||
-rw-r--r-- | src/rcclist.h | 7 | ||||
-rw-r--r-- | src/recode.c | 2 |
10 files changed, 489 insertions, 50 deletions
diff --git a/src/curconfig.c b/src/curconfig.c index ac1b722..6877f87 100644 --- a/src/curconfig.c +++ b/src/curconfig.c @@ -1,6 +1,34 @@ #include <stdio.h> #include "internal.h" +int rccGetCharsetNumber(rcc_context ctx) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return 0; + } + + return rccConfigGetCharsetNumber(ctx->current_config); +} + +int rccGetClassCharsetNumber(rcc_context ctx, rcc_class_id class_id) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return 0; + } + + return rccConfigGetClassCharsetNumber(ctx->current_config, class_id); +} + +int rccGetEngineNumber(rcc_context ctx) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return 0; + } + + return rccConfigGetEngineNumber(ctx->current_config); +} + + const char *rccGetEngineName(rcc_context ctx, rcc_engine_id engine_id) { if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; @@ -19,6 +47,15 @@ const char *rccGetCharsetName(rcc_context ctx, rcc_charset_id charset_id) { return rccConfigGetCharsetName(ctx->current_config, charset_id); } +const char *rccGetClassCharsetName(rcc_context ctx, rcc_class_id class_id, rcc_charset_id charset_id) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return NULL; + } + + return rccConfigGetClassCharsetName(ctx->current_config, class_id, charset_id); +} + const char *rccGetAutoCharsetName(rcc_context ctx, rcc_autocharset_id charset_id) { if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; @@ -46,6 +83,15 @@ rcc_charset_id rccGetCharsetByName(rcc_context ctx, const char *name) { return rccConfigGetCharsetByName(ctx->current_config, name); } +rcc_charset_id rccGetClassCharsetByName(rcc_context ctx, rcc_class_id class_id, const char *name) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return (rcc_charset_id)-1; + } + + return rccConfigGetClassCharsetByName(ctx->current_config, class_id, name); +} + rcc_autocharset_id rccGetAutoCharsetByName(rcc_context ctx, const char *name) { if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; @@ -161,6 +207,14 @@ rcc_charset_id rccGetLocaleCharset(rcc_context ctx, const char *locale_variable) return rccConfigGetLocaleCharset(ctx->current_config, locale_variable); } +rcc_charset_id rccGetLocaleClassCharset(rcc_context ctx, rcc_class_id class_id, const char *locale_variable) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return -1; + } + return rccConfigGetLocaleClassCharset(ctx->current_config, class_id, locale_variable); +} + rcc_autocharset_id rccDetectCharset(rcc_context ctx, rcc_class_id class_id, const char *buf, size_t len) { if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; @@ -169,3 +223,12 @@ rcc_autocharset_id rccDetectCharset(rcc_context ctx, rcc_class_id class_id, cons return rccConfigDetectCharset(ctx->current_config, class_id, buf, len); } + +int rccIsDisabledCharset(rcc_context ctx, rcc_class_id class_id, rcc_charset_id charset_id) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return -1; + } + + return rccConfigIsDisabledCharset(ctx->current_config, class_id, charset_id); +} diff --git a/src/internal.h b/src/internal.h index 089311f..5e64551 100644 --- a/src/internal.h +++ b/src/internal.h @@ -30,6 +30,8 @@ #include "rccmutex.h" #include "rcclocale.h" +#define RCC_MAX_ADDITION_CHARSETS 8 +#define RCC_MAX_DISABLED_CHARSETS 64 typedef rcc_language_id rcc_language_parrent_list[RCC_MAX_LANGUAGE_PARRENTS]; @@ -42,6 +44,13 @@ struct rcc_language_internal_t { typedef struct rcc_language_internal_t rcc_language_internal; typedef rcc_language_internal *rcc_language_internal_ptr; +struct rcc_class_internal_t { + rcc_class cl; + rcc_charset *additional; + rcc_charset *disabled; +}; +typedef struct rcc_class_internal_t rcc_class_internal; + struct rcc_context_t { char locale_variable[RCC_MAX_VARIABLE_CHARS+1]; @@ -58,6 +67,7 @@ struct rcc_context_t { unsigned int max_classes; unsigned int n_classes; + rcc_class_internal *iclass; rcc_class_ptr *classes; rcc_iconv *iconv_from; diff --git a/src/librcc.c b/src/librcc.c index c27c47d..98b609e 100644 --- a/src/librcc.c +++ b/src/librcc.c @@ -142,6 +142,7 @@ rcc_context rccCreateContext(const char *locale_variable, unsigned int max_langu rcc_language_ptr *languages; rcc_language_internal *ilang; rcc_class_ptr *classes; + rcc_class_internal *iclass; rcc_language_config configs; rcc_iconv *from; rcc_mutex mutex; @@ -168,17 +169,19 @@ rcc_context rccCreateContext(const char *locale_variable, unsigned int max_langu classes = (rcc_class_ptr*)malloc((max_classes+1)*sizeof(rcc_class_ptr)); from = (rcc_iconv*)malloc((max_classes)*sizeof(rcc_iconv)); ilang = (rcc_language_internal*)malloc((max_languages+1)*sizeof(rcc_language_internal)); + iclass = (rcc_class_internal*)malloc((max_classes+1)*sizeof(rcc_class_internal)); mutex = rccMutexCreate(); configs = (rcc_language_config)malloc((max_languages)*sizeof(struct rcc_language_config_t)); - if ((!ctx)||(!languages)||(!classes)||(!mutex)||(!from)||(!ilang)||(!mutex)) { + if ((!ctx)||(!languages)||(!classes)||(!mutex)||(!from)||(!ilang)||(!iclass)||(!mutex)) { if (mutex) rccMutexFree(mutex); if (from) free(from); if (configs) free(configs); if (classes) free(classes); if (languages) free(languages); if (ilang) free(ilang); + if (iclass) free(iclass); if (ctx) free(ctx); return NULL; } @@ -194,6 +197,7 @@ rcc_context rccCreateContext(const char *locale_variable, unsigned int max_langu rccRegisterLanguageAlias(ctx, rcc_default_aliases + i); ctx->ilang = ilang; + ctx->iclass = iclass; ctx->languages = languages; ctx->max_languages = max_languages; @@ -304,6 +308,7 @@ void rccFreeContext(rcc_context ctx) { rccConfigClear(ctx->configs+i); free(ctx->configs); } + if (ctx->iclass) free(ctx->iclass); if (ctx->classes) free(ctx->classes); if (ctx->ilang) free(ctx->ilang); if (ctx->languages) free(ctx->languages); @@ -489,11 +494,46 @@ rcc_class_id rccRegisterClass(rcc_context ctx, rcc_class *cl) { if (ctx->n_classes == ctx->max_classes) return (rcc_class_id)-1; ctx->configure = 1; - ctx->classes[ctx->n_classes++] = cl; + + memcpy(ctx->iclass + ctx->n_classes, cl, sizeof(rcc_class)); + ctx->iclass[ctx->n_classes].disabled = NULL; + ctx->iclass[ctx->n_classes].additional = NULL; + + ctx->classes[ctx->n_classes++] = (rcc_class_ptr)(ctx->iclass + ctx->n_classes); ctx->classes[ctx->n_classes] = NULL; + + if (!strcasecmp(cl->name, "id3")) { + rccRegisterDisabledCharsets(ctx, ctx->n_classes - 1, rcc_default_disabled_id3_charsets); + } else if (!strcasecmp(cl->name, "id3v2")) { + rccRegisterAdditionalCharsets(ctx, ctx->n_classes - 1, rcc_default_additional_id3v2_charsets); + } + return ctx->n_classes-1; } +int rccRegisterDisabledCharsets(rcc_context ctx, rcc_class_id class_id, rcc_charset *charsets) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return -1; + } + if (ctx->configuration_lock) return -1; + if ((class_id == (rcc_class_id)-1)||(class_id >= ctx->n_classes)) return -1; + + ctx->iclass[class_id].disabled = charsets; + return 0; +} + +int rccRegisterAdditionalCharsets(rcc_context ctx, rcc_class_id class_id, rcc_charset *charsets) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return -1; + } + if (ctx->configuration_lock) return -1; + if ((class_id == (rcc_class_id)-1)||(class_id >= ctx->n_classes)) return -1; + + ctx->iclass[class_id].additional = charsets; + return 0; +} rcc_class_type rccGetClassType(rcc_context ctx, rcc_class_id class_id) { rcc_class_type clt; @@ -515,6 +555,55 @@ rcc_class_type rccGetClassType(rcc_context ctx, rcc_class_id class_id) { return clt; } +const char *rccGetClassName(rcc_context ctx, rcc_class_id class_id) { + if ((class_id<0)||(class_id>=ctx->n_classes)) return NULL; + + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return NULL; + } + + return ctx->classes[class_id]->name; +} + +const char *rccGetClassFullName(rcc_context ctx, rcc_class_id class_id) { + if ((class_id<0)||(class_id>=ctx->n_classes)) return NULL; + + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return NULL; + } + + return ctx->classes[class_id]->fullname; +} + + +int rccIsDisabledCharsetName(rcc_context ctx, rcc_class_id class_id, const char *charset) { + unsigned int i; + rcc_charset *charsets; + + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return RCC_CLASS_INVALID; + } + + if ((!charset)||(class_id<0)||(class_id>=ctx->n_classes)) return -1; + + charsets = ctx->iclass[class_id].disabled; + if (!charsets) return 0; + + for (i=0;charsets[i];i++) { + if (!strcasecmp(charsets[i], charset)) return 1; + else if (!strcasecmp(charsets[i], rcc_default_unicode_charsets)) { + if (rccIsUnicode(charset)) return 1; + } + else if (!strcasecmp(charsets[i], rcc_default_nonunicode_charsets)) { + if (!rccIsUnicode(charset)) return 1; + } + } + return 0; +} + int rccConfigure(rcc_context ctx) { unsigned int i; diff --git a/src/librcc.h b/src/librcc.h index 0529682..9b064d1 100644 --- a/src/librcc.h +++ b/src/librcc.h @@ -365,12 +365,51 @@ typedef rcc_class_ptr rcc_class_list[RCC_MAX_CLASSES+1]; */ rcc_class_id rccRegisterClass(rcc_context ctx, rcc_class *cl); /** + * Register additional charsets for the current class. + * @param ctx is working context ( or default one if NULL supplied ) + * @param class_id is class id. + * @param charsets is NULL terminated list of classes. + * @return non zero value in the case of a error. + */ +int rccRegisterAdditionalCharsets(rcc_context ctx, rcc_class_id class_id, rcc_charset *charsets); +/** + * Register names of charsets disabled in the specified class. + * @param ctx is working context ( or default one if NULL supplied ) + * @param class_id is class id. + * @param charsets is NULL terminated list of classes ("unicode" / "nonunicode" specifies corespondent group of charsets). + * @return non zero value in the case of a error. + */ +int rccRegisterDisabledCharsets(rcc_context ctx, rcc_class_id class_id, rcc_charset *charsets); +/** + * Checks if charset is disabled for the specified class. + * @param ctx is working context ( or default one if NULL supplied ) + * @param class_id is class id. + * @param charset is charset name. + * @return 1 if charset is disabled, 0 if charset is enabled, -1 in the case of error. + */ +int rccIsDisabledCharsetName(rcc_context ctx, rcc_class_id class_id, const char *charset); + +/** * Determines 'class type' of supplied class. * @param ctx is working context ( or default one if NULL supplied ) * @param class_id is class id * @return class type or -1 in case of a error. */ rcc_class_type rccGetClassType(rcc_context ctx, rcc_class_id class_id); +/** + * Returns name of supplied class. + * @param ctx is working context ( or default one if NULL supplied ) + * @param class_id is class id + * @return class name or NULL in case of a error. + */ +const char *rccGetClassName(rcc_context ctx, rcc_class_id class_id); +/** + * Returns full name of supplied class. + * @param ctx is working context ( or default one if NULL supplied ) + * @param class_id is class id + * @return class full name or NULL in case of a error. + */ +const char *rccGetClassFullName(rcc_context ctx, rcc_class_id class_id); /******************************************************************************* ************************ Altering Configuaration ******************************* @@ -441,6 +480,21 @@ typedef struct rcc_option_range_t { }rcc_option_range; /* lng.c */ + +/** + * Return number of configured languages + * + * @param ctx is working context ( or default one if NULL supplied ) + * @return number of configured languages or 0 in the case of error + */ +int rccGetLanguageNumber(rcc_context ctx); +/** + * Return number of configured classes + * + * @param ctx is working context ( or default one if NULL supplied ) + * @return number of configured classes or 0 in the case of error + */ +int rccGetClassNumber(rcc_context ctx); /** * Determines name of the supplied language. * @@ -636,7 +690,7 @@ rcc_language_config rccCheckConfig(rcc_context ctx, rcc_language_id language_id) * @param ctx is working context ( or default one if NULL supplied ) * @param language_id is concerned language id * @return configuration context. The NULL is returned in the case of errors or - * dummy (Dissable LibRCC) language is selected. + * dummy (Disable LibRCC) language is selected. */ rcc_language_config rccGetConfig(rcc_context ctx, rcc_language_id language_id); /** @@ -690,6 +744,29 @@ rcc_language_id rccConfigGetLanguage(rcc_language_config config); const char *rccConfigGetLanguageName(rcc_language_config config); /** + * Return number of configured charsets + * + * @param config is language configuration + * @return number of charsets available in the configuration or 0 in the case of error + */ +int rccConfigGetCharsetNumber(rcc_language_config config); +/** + * Return number of configured charsets + * + * @param config is language configuration + * @param class_id is class id. + * @return number of charsets available in the configuration or 0 in the case of error + */ +int rccConfigGetClassCharsetNumber(rcc_language_config config, rcc_class_id class_id); +/** + * Return number of configured encoding auto-detection engines + * + * @param config is language configuration + * @return number of engines or 0 in the case of error + */ +int rccConfigGetEngineNumber(rcc_language_config config); + +/** * Return supplied engine name * * @param config is language configuration @@ -706,6 +783,16 @@ const char *rccConfigGetEngineName(rcc_language_config config, rcc_engine_id eng */ const char *rccConfigGetCharsetName(rcc_language_config config, rcc_charset_id charset_id); /** + * Return supplied encoding name + * + * @param config is language configuration + * @param class_id is charset encodings + * @param charset_id is desired charset + * @return selected encoding name or NULL in case of error. + */ +const char *rccConfigGetClassCharsetName(rcc_language_config config, rcc_class_id class_id, rcc_charset_id charset_id); + +/** * Function finds engine id by the supplied name. * * @param config is language configuration @@ -721,14 +808,30 @@ rcc_engine_id rccConfigGetEngineByName(rcc_language_config config, const char *n * @return encoding id [0-n] or -1 if not found. */ rcc_charset_id rccConfigGetCharsetByName(rcc_language_config config, const char *name); - +/** + * Function finds encoding id by the supplied name. + * + * @param config is language configuration + * @param class_id is encoding class + * @param name is encoding name + * @return encoding id [0-n] or -1 if not found. + */ +rcc_charset_id rccConfigGetClassCharsetByName(rcc_language_config config, rcc_class_id class_id, const char *name); +/** + * Checks if charset is disabled for the specified class. + * @param config is language configuration + * @param class_id is class id. + * @param charset is charset name. + * @return 1 if charset is disabled, 0 if charset is enabled, -1 in the case of error. + */ +int rccConfigIsDisabledCharset(rcc_language_config config, rcc_class_id class_id, rcc_charset_id charset_id); /** * Return selected engin id. * * @param config is language configuration * @return selected engine id [-1-n] * - -1 engine is not configured and first available will be used - * - 0 engines are dissabled + * - 0 engines are disabled * - >0 paticular engine id */ rcc_engine_id rccConfigGetSelectedEngine(rcc_language_config config); @@ -743,11 +846,11 @@ const char *rccConfigGetSelectedEngineName(rcc_language_config config); /** * Return current engine_id. The default value will be resolved to paticular engine id. Normally, * the id of the first available engine will be returned. If no engines registered for supplied - * language the 0 will be returned, indicating id of dummy(dissabled) engine. + * language the 0 will be returned, indicating id of dummy(disabled) engine. * * @param config is language configuration * @return selected engine id [0-n] or -1 in case of error - * - 0 engines are dissabled + * - 0 engines are disabled * - >0 paticular engine id */ rcc_engine_id rccConfigGetCurrentEngine(rcc_language_config config); @@ -845,14 +948,30 @@ int rccConfigSetCharsetByName(rcc_language_config config, rcc_class_id class_id, * @return encoding id */ rcc_charset_id rccConfigGetLocaleCharset(rcc_language_config config, const char *locale_variable); - +/** + * Function will return encoding id of charset specified by locale configuration. + * + * @param config is language configuration + * @param class_id is encoding class + * @param locale_variable is locale variable (Default(NULL) is LC_CTYPE) + * @return encoding id + */ +rcc_charset_id rccConfigGetLocaleClassCharset(rcc_language_config config, rcc_class_id class_id, const char *locale_variable); /* curconfig.c */ +int rccGetCharsetNumber(rcc_context ctx); +int rccGetClassCharsetNumber(rcc_context ctx, rcc_class_id class_id); +int rccGetEngineNumber(rcc_context ctx); + const char *rccGetEngineName(rcc_context ctx, rcc_engine_id engine_id); const char *rccGetCharsetName(rcc_context ctx, rcc_charset_id charset_id); +const char *rccGetClassCharsetName(rcc_context ctx, rcc_class_id class_id, rcc_charset_id charset_id); rcc_engine_id rccGetEngineByName(rcc_context ctx, const char *name); rcc_charset_id rccGetCharsetByName(rcc_context ctx, const char *name); +rcc_charset_id rccGetClassCharsetByName(rcc_context ctx, rcc_class_id class_id, const char *name); + +int rccIsDisabledCharset(rcc_context ctx, rcc_class_id class_id, rcc_charset_id charset_id); rcc_engine_id rccGetSelectedEngine(rcc_context ctx); const char *rccGetSelectedEngineName(rcc_context ctx); @@ -869,20 +988,13 @@ int rccSetEngineByName(rcc_context ctx, const char *name); int rccSetCharsetByName(rcc_context ctx, rcc_class_id class_id, const char *name); rcc_charset_id rccGetLocaleCharset(rcc_context ctx, const char *locale_variable); +rcc_charset_id rccGetLocaleClassCharset(rcc_context ctx, rcc_class_id class_id, const char *locale_variable); rcc_autocharset_id rccDetectCharset(rcc_context ctx, rcc_class_id class_id, const char *buf, size_t len); /******************************************************************************* ************************ Language Configuaration ******************************* *******************************************************************************/ -/* rcclist.c */ -rcc_language_ptr *rccGetLanguageList(rcc_context ctx); -rcc_charset *rccGetCharsetList(rcc_context ctx, rcc_language_id language_id); -rcc_engine_ptr *rccGetEngineList(rcc_context ctx, rcc_language_id language_id); -rcc_charset *rccGetCurrentCharsetList(rcc_context ctx); -rcc_engine_ptr *rccGetCurrentEngineList(rcc_context ctx); -rcc_charset *rccGetCurrentAutoCharsetList(rcc_context ctx); -rcc_class_ptr *rccGetClassList(rcc_context ctx); /******************************************************************************* ************************ RCC_STRING Manipulations ****************************** @@ -1283,9 +1395,11 @@ char *rccConfigSizedRecode(rcc_language_config config, rcc_class_id from, rcc_cl * Recode string from specified encoding to #rcc_string. * * @param config is language configuration + * @param class_id is encoding class * @param charset is source encoding * @param buf is original string (perhaps not zero terminated) * @param len is exact size of string or 0. In the last case the size is determined using 'strlen' function. + * @param rlen in rlen the size of recoded string will be returned. * @result is recoded string or NULL if recoding is not required or failed. It is up to the caller to free memory. */ rcc_string rccConfigSizedRecodeFromCharset(rcc_language_config config, rcc_class_id class_id, const char *charset, const char *buf, size_t len, size_t *rlen); @@ -1293,8 +1407,10 @@ rcc_string rccConfigSizedRecodeFromCharset(rcc_language_config config, rcc_class * Recode string from #rcc_string to specified encoding. * * @param config is language configuration + * @param class_id is encoding class * @param charset is destination encoding * @param buf is original zero terminated string + * @param len is exact size of string or 0. In the last case the size is determined using 'strlen' function. * @param rlen in rlen the size of recoded string will be returned. * @result is recoded string or NULL if recoding is not required or failed. It is up to the caller to free memory. */ @@ -5,6 +5,24 @@ #include "rccconfig.h" #include "rcclocale.h" +int rccGetLanguageNumber(rcc_context ctx) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return 0; + } + + return ctx->n_languages; +} + +int rccGetClassNumber(rcc_context ctx) { + if (!ctx) { + if (rcc_default_ctx) ctx = rcc_default_ctx; + else return 0; + } + + return ctx->n_classes; +} + rcc_language_ptr rccGetLanguagePointer(rcc_context ctx, rcc_language_id language_id) { if (!ctx) { if (rcc_default_ctx) ctx = rcc_default_ctx; diff --git a/src/lngconfig.c b/src/lngconfig.c index 7e5a428..20aff63 100644 --- a/src/lngconfig.c +++ b/src/lngconfig.c @@ -7,6 +7,7 @@ #include "internal.h" #include "rccconfig.h" #include "rcclocale.h" +#include "rcclist.h" #include "lng.h" rcc_language_id rccConfigGetLanguage(rcc_language_config config) { @@ -34,19 +35,54 @@ const char *rccConfigGetLanguageName(rcc_language_config config) { return config->language->sn; } +int rccConfigGetCharsetNumber(rcc_language_config config) { + int i; + rcc_charset *charsets; -rcc_engine_ptr rccConfigGetEnginePointer(rcc_language_config config, rcc_engine_id engine_id) { - unsigned int i; - rcc_engine_ptr *engines; + if ((!config)||(!config->language)) return 0; - if ((!config)||(!config->language)) return NULL; - if (engine_id == (rcc_engine_id)-1) return NULL; + charsets = config->language->charsets; + + for (i=0;charsets[i];i++); + + return i; +} + +int rccConfigGetClassCharsetNumber(rcc_language_config config, rcc_class_id class_id) { + int sum, i; + rcc_charset *charsets; + + if ((!config)||(!config->language)) return 0; + if ((class_id<0)||(class_id>=config->ctx->n_classes)) return 0; + + sum = rccConfigGetCharsetNumber(config); + + charsets = config->ctx->iclass[class_id].additional; + if (charsets) { + for (i=0;charsets[i];i++) + if (rccConfigGetCharsetByName(config, charsets[i]) == (rcc_language_id)-1) sum++; + } + + return sum; +} + +int rccConfigGetEngineNumber(rcc_language_config config) { + int i; + rcc_engine_ptr *engines; + if ((!config)||(!config->language)) return 0; engines = config->language->engines; for (i=0;engines[i];i++); - if (engine_id>=i) return NULL; + return i; +} + + +rcc_engine_ptr rccConfigGetEnginePointer(rcc_language_config config, rcc_engine_id engine_id) { + if ((!config)||(!config->language)) return NULL; + if (engine_id == (rcc_engine_id)-1) return NULL; + if (engine_id>=rccConfigGetEngineNumber(config)) return NULL; - return engines[engine_id]; + return config->language->engines[engine_id]; } rcc_engine_ptr rccConfigCheckEnginePointer(rcc_language_config config, rcc_engine_id engine_id) { @@ -78,6 +114,7 @@ rcc_engine_ptr rccConfigCheckCurrentEnginePointer(rcc_language_config config) { const char *rccConfigGetEngineName(rcc_language_config config, rcc_engine_id engine_id) { rcc_engine_ptr engine; + if (!engine_id) return rcc_disabled_engine_sn; if ((!config)||(!config->language)) return NULL; if (engine_id == (rcc_engine_id)-1) return rcc_engine_nonconfigured; @@ -89,17 +126,38 @@ const char *rccConfigGetEngineName(rcc_language_config config, rcc_engine_id eng } const char *rccConfigGetCharsetName(rcc_language_config config, rcc_charset_id charset_id) { - unsigned int i; + if (!charset_id) return rcc_default_charset; + + if ((!config)||(!config->language)) return NULL; + if (charset_id>=rccConfigGetCharsetNumber(config)) return NULL; + + return config->language->charsets[charset_id]; +} + +const char *rccConfigGetClassCharsetName(rcc_language_config config, rcc_class_id class_id, rcc_charset_id charset_id) { + unsigned int i, pos; rcc_charset *charsets; + if (!charset_id) return rcc_default_charset; + if ((!config)||(!config->language)) return NULL; + if ((class_id<0)||(class_id>=config->ctx->n_classes)) return NULL; - charsets = config->language->charsets; + pos = rccConfigGetCharsetNumber(config); + if (charset_id < pos) return rccConfigGetCharsetName(config, charset_id); + + charset_id -= pos; - for (i=0;charsets[i];i++); - if (charset_id>=i) return NULL; + charsets = config->ctx->iclass[class_id].additional; + if (!charsets) return NULL; - return charsets[charset_id]; + for (i=0;charsets[i];i++) + if (rccConfigGetCharsetByName(config, charsets[i]) == (rcc_language_id)-1) { + if (!charset_id) break; + charset_id--; + } + + return charsets[i]; } const char *rccConfigGetAutoCharsetName(rcc_language_config config, rcc_autocharset_id charset_id) { @@ -148,6 +206,31 @@ rcc_charset_id rccConfigGetCharsetByName(rcc_language_config config, const char return (rcc_charset_id)-1; } +rcc_charset_id rccConfigGetClassCharsetByName(rcc_language_config config, rcc_class_id class_id, const char *name) { + unsigned int pos, i = 0; + rcc_charset_id charset_id; + rcc_charset *charsets; + + if ((!config)||(!config->language)||(!name)) return (rcc_charset_id)-1; + if ((class_id<0)||(class_id>=config->ctx->n_classes)) return (rcc_charset_id)-1; + + charset_id = rccConfigGetCharsetByName(config, name); + if (charset_id != (rcc_charset_id)-1) return charset_id; + + pos = rccConfigGetCharsetNumber(config); + + charsets = config->ctx->iclass[class_id].additional; + if (!charsets) return (rcc_charset_id)-1; + + for (i=0;charsets[i];i++) + if (rccConfigGetCharsetByName(config, charsets[i]) == (rcc_language_id)-1) { + if (!strcasecmp(charsets[i], name)) return pos; + pos++; + } + + return (rcc_charset_id)-1; +} + rcc_autocharset_id rccConfigGetAutoCharsetByName(rcc_language_config config, const char *name) { unsigned int i; rcc_engine_id engine_id; @@ -168,6 +251,17 @@ rcc_autocharset_id rccConfigGetAutoCharsetByName(rcc_language_config config, con return (rcc_autocharset_id)-1; } +int rccConfigIsDisabledCharset(rcc_language_config config, rcc_class_id class_id, rcc_charset_id charset_id) { + rcc_charset charset; + + if ((!config)||(!config->language)) return (rcc_autocharset_id)-1; + + charset = rccConfigGetClassCharsetName(config, class_id, charset_id); + if (!charset) return -1; + + return rccIsDisabledCharsetName(config->ctx, class_id, charset); +} + int rccConfigInit(rcc_language_config config, rcc_context ctx) { int err; unsigned int i; @@ -469,19 +563,19 @@ const char *rccConfigGetSelectedCharsetName(rcc_language_config config, rcc_clas charset_id = rccConfigGetSelectedCharset(config, class_id); if ((charset_id == (rcc_charset_id)-1)||(!config->language)) return NULL; - return rccConfigGetCharsetName(config, charset_id); + return rccConfigGetClassCharsetName(config, class_id, charset_id); } rcc_charset_id rccConfigGetCurrentCharset(rcc_language_config config, rcc_class_id class_id) { - unsigned int i; + unsigned int i, max; rcc_charset_id charset_id; + rcc_charset_id all_charset_id = (rcc_language_id)-1; rcc_class_default_charset *defcharset; const char *lang; rcc_language *language; rcc_class_ptr *classes; - rcc_charset *charsets; rcc_class *cl; @@ -509,7 +603,7 @@ rcc_charset_id rccConfigGetCurrentCharset(rcc_language_config config, rcc_class_ if (config->default_charset[class_id]) return config->default_charset[class_id]; if (cl->defvalue) { - charset_id = rccConfigGetLocaleCharset(config, defvalue); + charset_id = rccConfigGetLocaleClassCharset(config, class_id, defvalue); if ((charset_id != 0)&&(charset_id != (rcc_charset_id)-1)) { config->default_charset[class_id] = charset_id; return charset_id; @@ -517,7 +611,7 @@ rcc_charset_id rccConfigGetCurrentCharset(rcc_language_config config, rcc_class_ } if (cl->defvalue) { - charset_id = rccConfigGetCharsetByName(config, defvalue); + charset_id = rccConfigGetClassCharsetByName(config, class_id, defvalue); if ((charset_id != 0)&&(charset_id != (rcc_charset_id)-1)) { config->default_charset[class_id] = charset_id; return charset_id; @@ -530,26 +624,35 @@ rcc_charset_id rccConfigGetCurrentCharset(rcc_language_config config, rcc_class_ for (i = 0; cl->defcharset[i].lang; i++) { if (!strcasecmp(lang, defcharset[i].lang)) { - charset_id = rccConfigGetCharsetByName(config, defcharset[i].charset); + charset_id = rccConfigGetClassCharsetByName(config, class_id, defcharset[i].charset); if ((charset_id != 0)&&(charset_id != (rcc_charset_id)-1)) { config->default_charset[class_id] = charset_id; return charset_id; } else break; + } else if (!strcasecmp(rcc_default_all, defcharset[i].lang)) { + charset_id = rccConfigGetClassCharsetByName(config, class_id, defcharset[i].charset); + if ((charset_id != 0)&&(charset_id != (rcc_charset_id)-1)) { + all_charset_id = charset_id; + } } } + + if (all_charset_id != (rcc_language_id)-1) { + config->default_charset[class_id] = all_charset_id; + return all_charset_id; + } } - charset_id = rccConfigGetLocaleCharset(config, defvalue); + charset_id = rccConfigGetLocaleClassCharset(config, class_id, defvalue); if ((charset_id != 0)&&(charset_id != (rcc_charset_id)-1)) { config->default_charset[class_id] = charset_id; return charset_id; } - charsets=language->charsets; - if ((charsets[0])&&(charsets[1])) { - config->default_charset[class_id]=(rcc_charset_id)1; - return (rcc_charset_id)1; - } + max = rccConfigGetClassCharsetNumber(config, class_id); + for (i = 1; i< max; i++) + if (!rccConfigIsDisabledCharset(config, class_id, (rcc_charset_id)i)) return (rcc_charset_id)i; + return (rcc_charset_id)-1; } @@ -559,7 +662,7 @@ const char *rccConfigGetCurrentCharsetName(rcc_language_config config, rcc_class charset_id = rccConfigGetCurrentCharset(config, class_id); if ((charset_id == (rcc_charset_id)-1)||(!config->language)) return NULL; - return rccConfigGetCharsetName(config, charset_id); + return rccConfigGetClassCharsetName(config, class_id, charset_id); } @@ -601,13 +704,10 @@ int rccConfigSetEngineByName(rcc_language_config config, const char *name) { } int rccConfigSetCharset(rcc_language_config config, rcc_class_id class_id, rcc_charset_id charset_id) { - unsigned int i; - if ((!config)||(!config->language)||(class_id < 0)||(class_id >= config->ctx->n_classes)) return -1; - - for (i=0;config->language->charsets[i];i++); - if (charset_id >= i) return -1; + if (charset_id >= rccConfigGetClassCharsetNumber(config, class_id)) return -1; + if (rccConfigIsDisabledCharset(config, class_id, charset_id)) return -1; if (config->charset[class_id] != charset_id) { if (config->ctx->classes[class_id]->flags&RCC_CLASS_FLAG_CONST) return -1; @@ -627,7 +727,7 @@ int rccConfigSetCharset(rcc_language_config config, rcc_class_id class_id, rcc_c int rccConfigSetCharsetByName(rcc_language_config config, rcc_class_id class_id, const char *name) { rcc_charset_id charset_id; - charset_id = rccConfigGetCharsetByName(config, name); + charset_id = rccConfigGetClassCharsetByName(config, class_id, name); if (charset_id == (rcc_charset_id)-1) return -1; return rccConfigSetCharset(config, class_id, charset_id); @@ -656,6 +756,30 @@ rcc_charset_id rccConfigGetLocaleCharset(rcc_language_config config, const char return (rcc_charset_id)-1; } +rcc_charset_id rccConfigGetLocaleClassCharset(rcc_language_config config, rcc_class_id class_id, const char *locale_variable) { + const char *lv; + rcc_language_id language_id; + char lang[RCC_MAX_CHARSET_CHARS+1]; + char stmp[RCC_MAX_CHARSET_CHARS+1]; + + if ((!config)||(!config->language)) return (rcc_charset_id)-1; + + lv = locale_variable?locale_variable:config->ctx->locale_variable; + + language_id = rccGetLanguageByName(config->ctx, config->language->sn); + if (language_id != (rcc_language_id)-1) { + if (!rccLocaleGetCharset(stmp, lv, RCC_MAX_CHARSET_CHARS)) { + if (rccIsUnicode(stmp)) + return rccConfigGetClassCharsetByName(config, class_id, stmp); + if ((!rccLocaleGetLanguage(lang, lv, RCC_MAX_CHARSET_CHARS))&&(!strcmp(config->language->sn, lang))) + return rccConfigGetClassCharsetByName(config, class_id, stmp); + } + } + + return (rcc_charset_id)-1; +} + + int rccConfigConfigure(rcc_language_config config) { int err; rcc_context ctx; diff --git a/src/rccconfig.c b/src/rccconfig.c index 5fecb6b..0752ee3 100644 --- a/src/rccconfig.c +++ b/src/rccconfig.c @@ -22,6 +22,12 @@ rcc_language_relation rcc_default_relations_embeded[RCC_MAX_RELATIONS + 1] = { { NULL, NULL } }; +const char rcc_default_unicode_charsets[] = "unicode"; +const char rcc_default_nonunicode_charsets[] = "nonunicode"; +rcc_charset rcc_default_disabled_id3_charsets[] = { rcc_default_unicode_charsets, NULL }; +rcc_charset rcc_default_additional_id3v2_charsets[] = { "UTF-8", "UTF-16", "UTF-16BE", NULL }; + +const char rcc_default_all[] = "all"; const char rcc_default_language_sn[] = "default"; const char rcc_disabled_language_sn[] = "Off"; const char rcc_english_language_sn[] = "en"; @@ -37,11 +43,11 @@ rcc_engine rcc_default_engine = { }; rcc_engine rcc_russian_engine = { - "Russian", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-R","UTF-8","IBM866", NULL} + "LibRCD", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-R","UTF-8","IBM866", NULL} }; rcc_engine rcc_ukrainian_engine = { - "Russian", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-U","UTF-8","IBM865", NULL} + "LibRCD", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-U","UTF-8","IBM865", NULL} }; rcc_language rcc_default_languages[RCC_MAX_LANGUAGES + 1]; diff --git a/src/rccconfig.h b/src/rccconfig.h index 7361910..f7f70dd 100644 --- a/src/rccconfig.h +++ b/src/rccconfig.h @@ -7,6 +7,7 @@ #undef RCC_DEBUG_LANGDETECT #define RCC_LOCALE_VARIABLE "LC_CTYPE" +extern const char rcc_default_all[]; extern const char rcc_default_language_sn[]; extern const char rcc_english_language_sn[]; extern const char rcc_disabled_language_sn[]; @@ -19,6 +20,11 @@ extern rcc_language_relation rcc_default_relations_embeded[]; extern const char rcc_default_charset[]; extern const char rcc_utf8_charset[]; +extern const char rcc_default_unicode_charsets[]; +extern const char rcc_default_nonunicode_charsets[]; +extern rcc_charset rcc_default_disabled_id3_charsets[]; +extern rcc_charset rcc_default_additional_id3v2_charsets[]; + extern const char rcc_engine_nonconfigured[]; extern const char rcc_option_nonconfigured[]; diff --git a/src/rcclist.h b/src/rcclist.h index 000e09c..71076b7 100644 --- a/src/rcclist.h +++ b/src/rcclist.h @@ -1,5 +1,12 @@ #ifndef _RCC_LIST_H #define _RCC_LIST_H +rcc_language_ptr *rccGetLanguageList(rcc_context ctx); +rcc_charset *rccGetCharsetList(rcc_context ctx, rcc_language_id language_id); +rcc_engine_ptr *rccGetEngineList(rcc_context ctx, rcc_language_id language_id); +rcc_charset *rccGetCurrentCharsetList(rcc_context ctx); +rcc_engine_ptr *rccGetCurrentEngineList(rcc_context ctx); +rcc_charset *rccGetCurrentAutoCharsetList(rcc_context ctx); +rcc_class_ptr *rccGetClassList(rcc_context ctx); #endif /* _RCC_LIST_H */ diff --git a/src/recode.c b/src/recode.c index ee9ac53..a528481 100644 --- a/src/recode.c +++ b/src/recode.c @@ -368,7 +368,7 @@ static char *rccRecodeTranslate(rcc_language_config *config, rcc_class_id class_ if (trans) { translated = rccTranslate(trans, utfstring); if (translated) { - if ((!((rcc_language_internal*)curconfig->language)->latin)&&(rccIsASCII(translated))) { + if (((translate != RCC_OPTION_TRANSLATE_TO_ENGLISH))&&(!((rcc_language_internal*)curconfig->language)->latin)&&(rccIsASCII(translated))) { free(translated); translated = NULL; } |