1 /*
2   LibRCC - default configuration
3 
4   Copyright (C) 2005-2008 Suren A. Chilingaryan <csa@dside.dyndns.org>
5 
6   This library is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License version 2.1 or later
8   as published by the Free Software Foundation.
9 
10   This library is distributed in the hope that it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
13   for more details.
14 
15   You should have received a copy of the GNU Lesser General Public License
16   along with this program; if not, write to the Free Software Foundation, Inc.,
17   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #include <stdio.h>
21 
22 #include <string.h>
23 #ifdef HAVE_STRINGS_H
24 # include <strings.h>
25 #endif /* HAVE_STRINGS_H */
26 
27 #include "internal.h"
28 #include "rccconfig.h"
29 #include "engine.h"
30 #include "opt.h"
31 
32 #define RCC_DEFAULT_RECODING_TIMEOUT 500000
33 
34 rcc_language_alias rcc_default_aliases[RCC_MAX_ALIASES + 1];
35 rcc_language_alias rcc_default_aliases_embeded[RCC_MAX_ALIASES + 1] = {
36 /*    { "cs_SK", "sk" },
37     { "ru_UA", "uk" },*/
38     { NULL, NULL }
39 };
40 
41 rcc_language_relation rcc_default_relations[RCC_MAX_RELATIONS + 1];
42 rcc_language_relation rcc_default_relations_embeded[RCC_MAX_RELATIONS + 1] = {
43     { "uk", "ru" },
44     { "be", "ru" },
45     { NULL, NULL }
46 };
47 
48 const char rcc_default_unicode_charsets[] = "unicode";
49 const char rcc_default_nonunicode_charsets[] = "nonunicode";
50 rcc_charset rcc_default_disabled_id3_charsets[] = { rcc_default_unicode_charsets, NULL };
51 rcc_charset rcc_default_additional_id3v2_charsets[] = { "UTF-8", "UTF-16", "UTF-16BE", NULL };
52 
53 const char rcc_default_all[] = "all";
54 const char rcc_default_language_sn[] = "default";
55 const char rcc_disabled_language_sn[] = "Off";
56 const char rcc_english_language_sn[] = "en";
57 const char rcc_russian_language_sn[] = "ru";
58 const char rcc_ukrainian_language_sn[] = "uk";
59 const char rcc_disabled_engine_sn[] = "Off";
60 const char rcc_default_charset[] = "Default";
61 
62 const char rcc_utf8_charset[] = "UTF-8";
63 const char rcc_engine_nonconfigured[] = "Default";
64 const char rcc_option_nonconfigured[] = "DEFAULT";
65 
66 rcc_engine rcc_default_engine = {
67     rcc_disabled_engine_sn, NULL, NULL, NULL, {NULL}
68 };
69 
70 rcc_engine rcc_russian_engine = {
71     "LibRCD", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-R","UTF-8","IBM866", "ISO8859-1", NULL}
72 };
73 
74 rcc_engine rcc_ukrainian_engine = {
75     "LibRCD", NULL, NULL, &rccAutoengineRussian, {"CP1251","KOI8-U","UTF-8","IBM865", "ISO8859-1", NULL}
76 };
77 
78 rcc_engine rcc_belarussian_engine = {
79     "LibRCD", NULL, NULL, &rccAutoengineRussian, {"CP1251","ISO-IR-111","UTF-8","IBM865", "ISO8859-1", NULL}
80 };
81 
82 rcc_language rcc_default_languages[RCC_MAX_LANGUAGES + 1];
83 
84 rcc_language rcc_default_languages_embeded[RCC_MAX_LANGUAGES + 1] = {
85 {rcc_default_language_sn, {rcc_default_charset, NULL}, {
86     &rcc_default_engine,
87     NULL
88 }},
89 {rcc_disabled_language_sn, {rcc_default_charset, NULL}, {
90     &rcc_default_engine,
91     NULL
92 }},
93 {rcc_english_language_sn, {rcc_default_charset, rcc_utf8_charset, "ISO8859-1", NULL}, {
94     &rcc_default_engine,
95     NULL
96 }},
97 {rcc_russian_language_sn, {rcc_default_charset,"KOI8-R","CP1251",rcc_utf8_charset,"IBM866","MACCYRILLIC","ISO8859-5", NULL}, {
98     &rcc_default_engine,
99 #ifdef RCC_RCD_SUPPORT
100     &rcc_russian_engine,
101 #endif /* RCC_RCD_SUPPORT */
102     NULL
103 }},
104 {rcc_ukrainian_language_sn, {rcc_default_charset,"KOI8-U","CP1251",rcc_utf8_charset,"IBM855","MACCYRILLIC","ISO8859-5","CP1125", NULL}, {
105     &rcc_default_engine,
106 #ifdef RCC_RCD_SUPPORT
107     &rcc_ukrainian_engine,
108 #endif /* RCC_RCD_SUPPORT */
109     NULL
110 }},
111 {"be", {rcc_default_charset, rcc_utf8_charset, "CP1251", "IBM866", "ISO-8859-5", "ISO-IR-111", "ISO-IR-111", "MACCYRILLIC" "IBM855", NULL},{
112     &rcc_default_engine,
113 #ifdef RCC_RCD_SUPPORT
114     &rcc_ukrainian_engine,
115 #endif /* RCC_RCD_SUPPORT */
116     NULL
117 }},
118 /*{"bg", {rcc_default_charset, rcc_utf8_charset, "CP1251", "ISO-8859-5", "IBM855", "maccyr", "ECMA-113", NULL},{
119     &rcc_default_engine,
120     NULL
121 }},
122 {"cs", {rcc_default_charset, rcc_utf8_charset, "ISO-8859-2", "CP1250", "IBM852", "KEYBCS2", "macce", "KOI-8_CS_2", "CORK", NULL},{
123     &rcc_default_engine,
124     NULL
125 }},
126 {"et", {rcc_default_charset, rcc_utf8_charset, "ISO-8859-4", "CP1257", "IBM775", "ISO-8859-13", "macce", "baltic", NULL},{
127     &rcc_default_engine,
128     NULL
129 }},
130 {"hr", {rcc_default_charset, rcc_utf8_charset, "CP1250", "ISO-8859-2", "IBM852", "macce", "CORK", NULL},{
131     &rcc_default_engine,
132     NULL
133 }},
134 {"hu", {rcc_default_charset, rcc_utf8_charset, "ISO-8859-2", "CP1250", "IBM852", "macce", "CORK", NULL},{
135     &rcc_default_engine,
136     NULL
137 }},
138 {"lt", {rcc_default_charset, rcc_utf8_charset, "CP1257", "ISO-8859-4", "IBM775", "ISO-8859-13", "macce", "baltic", NULL},{
139     &rcc_default_engine,
140     NULL
141 }},
142 {"lv", {rcc_default_charset, rcc_utf8_charset, "CP1257", "ISO-8859-4", "IBM775", "ISO-8859-13", "macce", "baltic", NULL},{
143     &rcc_default_engine,
144     NULL
145 }},
146 {"pl", {rcc_default_charset, rcc_utf8_charset, "ISO-8859-2", "CP1250", "IBM852", "macce", "ISO-8859-13", "ISO-8859-16", "baltic", "CORK", NULL},{
147     &rcc_default_engine,
148     NULL
149 }},
150 {"sk", {rcc_default_charset, rcc_utf8_charset, "CP1250", "ISO-8859-2", "IBM852", "KEYBCS2", "macce", "KOI-8_CS_2", "CORK", NULL},{
151     &rcc_default_engine,
152     NULL
153 }},
154 {"sl", {rcc_default_charset, rcc_utf8_charset, "ISO-8859-2", "CP1250", "IBM852", "macce", "CORK", NULL},{
155     &rcc_default_engine,
156     NULL
157 }},*/
158 {NULL}
159 };
160 rcc_option_value_name rcc_sn_boolean[] = { "OFF", "ON", NULL };
161 rcc_option_value_name rcc_sn_learning[] = { "OFF", "ON", "RELEARN", "LEARN", NULL };
162 rcc_option_value_name rcc_sn_clo[] = { "ALL", "CONFIGURED_AND_AUTO", "CONFIGURED_ONLY", NULL };
163 rcc_option_value_name rcc_sn_translate[] = { "OFF", "TRANSLITERATE", "TO_ENGLISH", "SKIP_RELATED", "SKIP_PARENT", "FULL", NULL };
164 
165 rcc_option_description rcc_option_descriptions[RCC_MAX_OPTIONS+1];
166 rcc_option_description rcc_option_descriptions_embeded[RCC_MAX_OPTIONS+1] = {
167 #ifdef HAVE_DB_H
168     {RCC_OPTION_LEARNING_MODE, 0, { RCC_OPTION_RANGE_TYPE_MENU, 0, 3, 1 }, RCC_OPTION_TYPE_STANDARD,  "LEARNING_MODE", rcc_sn_learning },
169 #else
170     {RCC_OPTION_LEARNING_MODE, 0, { RCC_OPTION_RANGE_TYPE_MENU, 0, 3, 1 }, RCC_OPTION_TYPE_INVISIBLE,  "LEARNING_MODE", rcc_sn_learning },
171 #endif /* HAVE_DB_H */
172     {RCC_OPTION_AUTODETECT_FS_NAMES, 1, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0}, RCC_OPTION_TYPE_STANDARD,  "AUTODETECT_FS_NAMES", rcc_sn_boolean},
173     {RCC_OPTION_AUTODETECT_FS_TITLES, 1, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0}, RCC_OPTION_TYPE_INVISIBLE, "AUTODETECT_FS_TITLES", rcc_sn_boolean},
174     {RCC_OPTION_CONFIGURED_LANGUAGES_ONLY, 1, { RCC_OPTION_RANGE_TYPE_MENU, 0, 2, 1}, RCC_OPTION_TYPE_INVISIBLE, "CONFIGURED_LANGUAGES_ONLY", rcc_sn_clo},
175 #ifdef HAVE_ASPELL
176     {RCC_OPTION_AUTODETECT_LANGUAGE, 0, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0}, RCC_OPTION_TYPE_STANDARD, "AUTODETECT_LANGUAGE", rcc_sn_boolean},
177 #else
178     {RCC_OPTION_AUTODETECT_LANGUAGE, 0, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0}, RCC_OPTION_TYPE_INVISIBLE, "AUTODETECT_LANGUAGE", rcc_sn_boolean},
179 #endif
180 #ifdef HAVE_LIBTRANSLATE
181     {RCC_OPTION_TRANSLATE, 0, { RCC_OPTION_RANGE_TYPE_MENU, 0, 3, 1}, RCC_OPTION_TYPE_STANDARD, "TRANSLATE", rcc_sn_translate },
182 #else
183     {RCC_OPTION_TRANSLATE, 0, { RCC_OPTION_RANGE_TYPE_MENU, 0, 3, 1}, RCC_OPTION_TYPE_INVISIBLE, "TRANSLATE", rcc_sn_translate },
184 #endif /* HAVE_LIBTRANSLATE */
185     {RCC_OPTION_AUTOENGINE_SET_CURRENT, 0, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0}, RCC_OPTION_TYPE_STANDARD, "AUTOENGINE_SET_CURRENT", rcc_sn_boolean },
186 #ifdef HAVE_LIBTRANSLATE
187     {RCC_OPTION_TIMEOUT, RCC_DEFAULT_RECODING_TIMEOUT, { RCC_OPTION_RANGE_TYPE_RANGE, 0, 5000000, 50000}, RCC_OPTION_TYPE_STANDARD, "TIMEOUT", NULL },
188 #else
189     {RCC_OPTION_TIMEOUT, RCC_DEFAULT_RECODING_TIMEOUT, { RCC_OPTION_RANGE_TYPE_RANGE, 0, 5000000, 50000}, RCC_OPTION_TYPE_INVISIBLE, "TIMEOUT", NULL },
190 #endif /* HAVE_LIBTRANSLATE */
191     {RCC_OPTION_OFFLINE, 0, { RCC_OPTION_RANGE_TYPE_BOOLEAN, 0, 0, 0 }, RCC_OPTION_TYPE_INVISIBLE, "OFFLINE_PROCESSING", rcc_sn_boolean},
192     {RCC_MAX_OPTIONS}
193 };
194 
rccGetOptionDescription(rcc_option option)195 rcc_option_description *rccGetOptionDescription(rcc_option option) {
196     unsigned int i;
197 
198     if ((option<0)||(option>=RCC_MAX_OPTIONS)) return NULL;
199 
200     for (i=0;rcc_option_descriptions[i].option!=RCC_MAX_OPTIONS;i++)
201 	if (rcc_option_descriptions[i].option == option)
202 	    return rcc_option_descriptions+i;
203 
204     return NULL;
205 }
206 
rccGetOptionDescriptionByName(const char * name)207 rcc_option_description *rccGetOptionDescriptionByName(const char *name) {
208     unsigned int i;
209 
210     if (!name) return NULL;
211 
212     for (i=0;rcc_option_descriptions[i].option!=RCC_MAX_OPTIONS;i++)
213 	if (!strcasecmp(rcc_option_descriptions[i].sn,name)) return rcc_option_descriptions+i;
214 
215     return NULL;
216 }
217 
rccDefaultGetLanguageByName(const char * name)218 rcc_language_id rccDefaultGetLanguageByName(const char *name) {
219     unsigned int i;
220 
221     if (!name) return (rcc_language_id)-1;
222 
223     for (i=0;rcc_default_languages[i].sn;i++)
224 	if (!strcasecmp(rcc_default_languages[i].sn, name)) return (rcc_language_id)i;
225 
226     return (rcc_language_id)-1;
227 }
228 
rccIsUTF8(const char * name)229 int rccIsUTF8(const char *name) {
230     if ((!name)||(strcasecmp(name, "UTF-8")&&strcasecmp(name, "UTF8"))) return 0;
231     return 1;
232 }
233 
rccIsUnicode(const char * name)234 int rccIsUnicode(const char *name) {
235     if ((!name)||(strncasecmp(name, "UTF",3)&&strncasecmp(name, "UCS",3))) return 0;
236     return 1;
237 }
238 
rccDefaultDropLanguageRelations(const char * lang)239 unsigned int rccDefaultDropLanguageRelations(const char *lang) {
240     unsigned long i, j;
241     for (i=0,j=0;rcc_default_relations[i].lang;i++) {
242 	if (strcasecmp(lang, rcc_default_relations[i].lang)) {
243 	    if (j<i) {
244 		rcc_default_relations[j].lang = rcc_default_relations[i].lang;
245 		rcc_default_relations[j++].parent = rcc_default_relations[i].parent;
246 	    } else j++;
247 	}
248     }
249     rcc_default_relations[j].lang = NULL;
250     rcc_default_relations[j].parent = NULL;
251     return j;
252 }
253