8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-26 08:43:03 +01:00
firebird-mirror/src/intl/ld.cpp
asfernandes 1305691003 Misc
2008-02-28 02:43:23 +00:00

594 lines
17 KiB
C++

/*
* PROGRAM: InterBase International support
* MODULE: ld.cpp
* DESCRIPTION: Language Driver lookup & support routines
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
* Adriano dos Santos Fernandes
*/
#include "firebird.h"
#include "../jrd/IntlUtil.h"
#include "../intl/ldcommon.h"
#include "../intl/ld_proto.h"
#include "../intl/cs_icu.h"
#include "../intl/lc_icu.h"
#include "fb_exception.h"
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h> /* for MAXPATHLEN */
#endif
#include <stdio.h>
using namespace Firebird;
/* Commented out to make Linux version work because it is inaccessiable on all
known platforms. Nickolay Samofatov, 10 Sept 2002
void gds__log(UCHAR*, ...);
*/
#define EXTERN_texttype(name) INTL_BOOL name (texttype*, charset*, const ASCII*, const ASCII*, USHORT, const UCHAR*, ULONG, const ASCII*)
// #define EXTERN_convert(name) INTL_BOOL name (csconvert*, const ASCII*, const ASCII*)
#define EXTERN_charset(name) INTL_BOOL name (charset*, const ASCII*)
EXTERN_texttype(DOS101_init);
EXTERN_texttype(DOS101_c2_init);
EXTERN_texttype(DOS101_c3_init);
EXTERN_texttype(DOS101_c4_init);
EXTERN_texttype(DOS101_c5_init);
EXTERN_texttype(DOS101_c6_init);
EXTERN_texttype(DOS101_c7_init);
EXTERN_texttype(DOS101_c8_init);
EXTERN_texttype(DOS101_c9_init);
EXTERN_texttype(DOS101_c10_init);
EXTERN_texttype(DOS102_init);
EXTERN_texttype(DOS105_init);
EXTERN_texttype(DOS106_init);
EXTERN_texttype(DOS107_init);
EXTERN_texttype(DOS107_c1_init);
EXTERN_texttype(DOS107_c2_init);
EXTERN_texttype(DOS107_c3_init);
EXTERN_texttype(DOS852_c0_init);
EXTERN_texttype(DOS852_c1_init);
EXTERN_texttype(DOS852_c2_init);
EXTERN_texttype(DOS852_c4_init);
EXTERN_texttype(DOS852_c5_init);
EXTERN_texttype(DOS852_c6_init);
EXTERN_texttype(DOS852_c7_init);
EXTERN_texttype(DOS852_c8_init);
EXTERN_texttype(DOS857_c0_init);
EXTERN_texttype(DOS857_c1_init);
EXTERN_texttype(DOS860_c0_init);
EXTERN_texttype(DOS860_c1_init);
EXTERN_texttype(DOS861_c0_init);
EXTERN_texttype(DOS861_c1_init);
EXTERN_texttype(DOS863_c0_init);
EXTERN_texttype(DOS863_c1_init);
EXTERN_texttype(DOS737_c0_init);
EXTERN_texttype(DOS775_c0_init);
EXTERN_texttype(DOS858_c0_init);
EXTERN_texttype(DOS862_c0_init);
EXTERN_texttype(DOS864_c0_init);
EXTERN_texttype(DOS866_c0_init);
EXTERN_texttype(DOS869_c0_init);
EXTERN_texttype(CYRL_c0_init);
EXTERN_texttype(CYRL_c1_init);
EXTERN_texttype(CYRL_c2_init);
/* Latin 1 character set */
EXTERN_texttype(ISO88591_cp_init);
/* Latin 1 collations */
EXTERN_texttype(ISO88591_39_init);
EXTERN_texttype(ISO88591_40_init);
EXTERN_texttype(ISO88591_41_init);
EXTERN_texttype(ISO88591_42_init);
EXTERN_texttype(ISO88591_43_init);
EXTERN_texttype(ISO88591_44_init);
EXTERN_texttype(ISO88591_45_init);
EXTERN_texttype(ISO88591_46_init);
EXTERN_texttype(ISO88591_48_init);
EXTERN_texttype(ISO88591_49_init);
EXTERN_texttype(ISO88591_51_init);
EXTERN_texttype(ISO88591_52_init);
EXTERN_texttype(ISO88591_53_init);
EXTERN_texttype(ISO88591_54_init);
EXTERN_texttype(ISO88591_55_init);
EXTERN_texttype(ISO88591_56_init);
/* Latin 2 character set */
EXTERN_texttype (ISO88592_cp_init);
/* latin 2 collations */
EXTERN_texttype (ISO88592_c1_init);
EXTERN_texttype (ISO88592_c2_init);
EXTERN_texttype (ISO88592_c3_init);
EXTERN_texttype (ISO88593_cp_init);
EXTERN_texttype (ISO88594_cp_init);
EXTERN_texttype (ISO88595_cp_init);
EXTERN_texttype (ISO88596_cp_init);
EXTERN_texttype (ISO88597_cp_init);
EXTERN_texttype (ISO88598_cp_init);
EXTERN_texttype (ISO88599_cp_init);
EXTERN_texttype (ISO885913_cp_init);
EXTERN_texttype (ISO885913_c1_init);
EXTERN_texttype(WIN1250_c0_init);
EXTERN_texttype(WIN1250_c1_init);
EXTERN_texttype(WIN1250_c2_init);
EXTERN_texttype(WIN1250_c3_init);
EXTERN_texttype(WIN1250_c4_init);
EXTERN_texttype(WIN1250_c5_init);
EXTERN_texttype(WIN1250_c6_init);
EXTERN_texttype(WIN1250_c7_init);
EXTERN_texttype(WIN1250_c8_init);
EXTERN_texttype(WIN1251_c0_init);
EXTERN_texttype(WIN1251_c1_init);
EXTERN_texttype(WIN1251_c2_init);
EXTERN_texttype(WIN1252_c0_init);
EXTERN_texttype(WIN1252_c1_init);
EXTERN_texttype(WIN1252_c2_init);
EXTERN_texttype(WIN1252_c3_init);
EXTERN_texttype(WIN1252_c4_init);
EXTERN_texttype(WIN1252_c5_init);
EXTERN_texttype(WIN1252_c6_init);
EXTERN_texttype(WIN1252_c7_init);
EXTERN_texttype(WIN1253_c0_init);
EXTERN_texttype(WIN1253_c1_init);
EXTERN_texttype(WIN1254_c0_init);
EXTERN_texttype(WIN1254_c1_init);
EXTERN_texttype(WIN1255_c0_init);
EXTERN_texttype(WIN1256_c0_init);
EXTERN_texttype(WIN1257_c0_init);
EXTERN_texttype(WIN1257_c1_init);
EXTERN_texttype(WIN1257_c2_init);
EXTERN_texttype(WIN1257_c3_init);
EXTERN_texttype(NEXT_c0_init);
EXTERN_texttype(NEXT_c1_init);
EXTERN_texttype(NEXT_c2_init);
EXTERN_texttype(NEXT_c3_init);
EXTERN_texttype(NEXT_c4_init);
EXTERN_texttype(DOS160_init);
EXTERN_texttype(DOS160_c1_init);
EXTERN_texttype(DOS160_c2_init);
EXTERN_texttype(DOS160_c3_init);
EXTERN_texttype(DOS160_c4_init);
EXTERN_texttype(DOS160_c5_init);
EXTERN_texttype(DOS160_c6_init);
EXTERN_texttype(DOS160_c7_init);
EXTERN_texttype(DOS160_c8_init);
EXTERN_texttype(DOS160_c9_init);
EXTERN_texttype(DOS160_c10_init);
EXTERN_texttype(UNI200_init);
EXTERN_texttype(UNI201_init);
EXTERN_texttype(JIS220_init);
EXTERN_texttype(JIS230_init);
EXTERN_texttype(KOI8R_c0_init);
EXTERN_texttype(KOI8R_c1_init);
EXTERN_texttype(KOI8U_c0_init);
EXTERN_texttype(KOI8U_c1_init);
EXTERN_texttype(WIN1258_c0_init);
EXTERN_charset(CS_iso_ISO8859_1);
EXTERN_charset(CS_iso_ISO8859_2);
EXTERN_charset(CS_iso_ISO8859_3);
EXTERN_charset(CS_iso_ISO8859_4);
EXTERN_charset(CS_iso_ISO8859_5);
EXTERN_charset(CS_iso_ISO8859_6);
EXTERN_charset(CS_iso_ISO8859_7);
EXTERN_charset(CS_iso_ISO8859_8);
EXTERN_charset(CS_iso_ISO8859_9);
EXTERN_charset(CS_iso_ISO8859_13);
EXTERN_charset(CS_win1250);
EXTERN_charset(CS_win1251);
EXTERN_charset(CS_win1252);
EXTERN_charset(CS_win1253);
EXTERN_charset(CS_win1254);
EXTERN_charset(CS_win1255);
EXTERN_charset(CS_win1256);
EXTERN_charset(CS_win1257);
EXTERN_charset(CS_next);
EXTERN_charset(CS_cyrl);
EXTERN_charset(CS_dos_437);
EXTERN_charset(CS_dos_850);
EXTERN_charset(CS_dos_852);
EXTERN_charset(CS_dos_857);
EXTERN_charset(CS_dos_860);
EXTERN_charset(CS_dos_861);
EXTERN_charset(CS_dos_863);
EXTERN_charset(CS_dos_865);
EXTERN_charset(CS_dos_737);
EXTERN_charset(CS_dos_775);
EXTERN_charset(CS_dos_858);
EXTERN_charset(CS_dos_862);
EXTERN_charset(CS_dos_864);
EXTERN_charset(CS_dos_866);
EXTERN_charset(CS_dos_869);
EXTERN_charset(CS_unicode_ucs2);
EXTERN_charset(CS_unicode_fss);
EXTERN_charset(CS_sjis);
EXTERN_charset(CS_euc_j);
EXTERN_charset(CS_big_5);
EXTERN_charset(CS_gb_2312);
EXTERN_charset(CS_ksc_5601);
EXTERN_charset(CS_koi8r);
EXTERN_charset(CS_koi8u);
EXTERN_charset(CS_win1258);
EXTERN_texttype(BIG5_init);
EXTERN_texttype(KSC_5601_init);
EXTERN_texttype(ksc_5601_dict_init);
EXTERN_texttype(GB_2312_init);
// ASF: FB 2.0 doesn't call LD_version function, then
// version should be INTL_VERSION_1 by default.
USHORT version = INTL_VERSION_1;
struct
{
const char* charSetName;
EXTERN_charset((*ptr));
} static const charSets[] =
{
// builtin charsets should not be listed here
{"SJIS_0208", CS_sjis},
{"EUCJ_0208", CS_euc_j},
{"DOS437", CS_dos_437},
{"DOS850", CS_dos_850},
{"DOS865", CS_dos_865},
{"ISO8859_1", CS_iso_ISO8859_1},
{"ISO8859_2", CS_iso_ISO8859_2},
{"ISO8859_3", CS_iso_ISO8859_3},
{"ISO8859_4", CS_iso_ISO8859_4},
{"ISO8859_5", CS_iso_ISO8859_5},
{"ISO8859_6", CS_iso_ISO8859_6},
{"ISO8859_7", CS_iso_ISO8859_7},
{"ISO8859_8", CS_iso_ISO8859_8},
{"ISO8859_9", CS_iso_ISO8859_9},
{"ISO8859_13", CS_iso_ISO8859_13},
{"DOS852", CS_dos_852},
{"DOS857", CS_dos_857},
{"DOS860", CS_dos_860},
{"DOS861", CS_dos_861},
{"DOS863", CS_dos_863},
{"CYRL", CS_cyrl},
{"DOS737", CS_dos_737},
{"DOS775", CS_dos_775},
{"DOS858", CS_dos_858},
{"DOS862", CS_dos_862},
{"DOS864", CS_dos_864},
{"DOS866", CS_dos_866},
{"DOS869", CS_dos_869},
{"WIN1250", CS_win1250},
{"WIN1251", CS_win1251},
{"WIN1252", CS_win1252},
{"WIN1253", CS_win1253},
{"WIN1254", CS_win1254},
{"NEXT", CS_next},
{"WIN1255", CS_win1255},
{"WIN1256", CS_win1256},
{"WIN1257", CS_win1257},
{"KSC_5601", CS_ksc_5601},
{"BIG_5", CS_big_5},
{"GB_2312", CS_gb_2312},
{"KOI8R", CS_koi8r},
{"KOI8U", CS_koi8u},
{"WIN1258", CS_win1258},
// ICU charsets should not be listed here
{NULL, NULL}
};
struct
{
const char* charSetName;
const char* collationName;
EXTERN_texttype((*ptr));
} static const collations[] =
{
// builtin collations should not be listed here
{"SJIS_0208", "SJIS_0208", JIS220_init},
{"EUCJ_0208", "EUCJ_0208", JIS230_init},
{"DOS437", "DOS437", DOS101_init},
{"DOS437", "PDOX_ASCII", DOS101_init},
{"DOS437", "PDOX_INTL", DOS102_init},
{"DOS437", "PDOX_SWEDFIN", DOS106_init},
{"DOS437", "DB_DEU437", DOS101_c2_init},
{"DOS437", "DB_ESP437", DOS101_c3_init},
{"DOS437", "DB_FIN437", DOS101_c4_init},
{"DOS437", "DB_FRA437", DOS101_c5_init},
{"DOS437", "DB_ITA437", DOS101_c6_init},
{"DOS437", "DB_NLD437", DOS101_c7_init},
{"DOS437", "DB_SVE437", DOS101_c8_init},
{"DOS437", "DB_UK437", DOS101_c9_init},
{"DOS437", "DB_US437", DOS101_c10_init},
{"DOS850", "DOS850", DOS160_init},
{"DOS850", "DB_FRC850", DOS160_c1_init},
{"DOS850", "DB_DEU850", DOS160_c2_init},
{"DOS850", "DB_ESP850", DOS160_c3_init},
{"DOS850", "DB_FRA850", DOS160_c4_init},
{"DOS850", "DB_ITA850", DOS160_c5_init},
{"DOS850", "DB_NLD850", DOS160_c6_init},
{"DOS850", "DB_PTB850", DOS160_c7_init},
{"DOS850", "DB_SVE850", DOS160_c8_init},
{"DOS850", "DB_UK850", DOS160_c9_init},
{"DOS850", "DB_US850", DOS160_c10_init},
{"DOS865", "DOS865", DOS107_init},
{"DOS865", "PDOX_NORDAN4", DOS107_c1_init},
{"DOS865", "DB_DAN865", DOS107_c2_init},
{"DOS865", "DB_NOR865", DOS107_c3_init},
{"ISO8859_1", "ISO8859_1", ISO88591_cp_init},
{"ISO8859_1", "DA_DA", ISO88591_39_init},
{"ISO8859_1", "DU_NL", ISO88591_40_init},
{"ISO8859_1", "FI_FI", ISO88591_41_init},
{"ISO8859_1", "FR_FR", ISO88591_42_init},
{"ISO8859_1", "FR_CA", ISO88591_43_init},
{"ISO8859_1", "DE_DE", ISO88591_44_init},
{"ISO8859_1", "IS_IS", ISO88591_45_init},
{"ISO8859_1", "IT_IT", ISO88591_46_init},
{"ISO8859_1", "NO_NO", ISO88591_48_init},
{"ISO8859_1", "ES_ES", ISO88591_49_init},
{"ISO8859_1", "SV_SV", ISO88591_51_init},
{"ISO8859_1", "EN_UK", ISO88591_52_init},
{"ISO8859_1", "EN_US", ISO88591_53_init},
{"ISO8859_1", "PT_PT", ISO88591_54_init},
{"ISO8859_1", "PT_BR", ISO88591_55_init},
{"ISO8859_1", "ES_ES_CI_AI", ISO88591_56_init},
{"ISO8859_1", "FR_FR_CI_AI", ISO88591_42_init},
{"ISO8859_2", "ISO8859_2", ISO88592_cp_init},
{"ISO8859_2", "CS_CZ", ISO88592_c1_init},
{"ISO8859_2", "ISO_HUN", ISO88592_c2_init},
{"ISO8859_2", "ISO_PLK", ISO88592_c3_init},
{"ISO8859_3", "ISO8859_3", ISO88593_cp_init},
{"ISO8859_4", "ISO8859_4", ISO88594_cp_init},
{"ISO8859_5", "ISO8859_5", ISO88595_cp_init},
{"ISO8859_6", "ISO8859_6", ISO88596_cp_init},
{"ISO8859_7", "ISO8859_7", ISO88597_cp_init},
{"ISO8859_8", "ISO8859_8", ISO88598_cp_init},
{"ISO8859_9", "ISO8859_9", ISO88599_cp_init},
{"ISO8859_13", "ISO8859_13", ISO885913_cp_init},
{"ISO8859_13", "LT_LT", ISO885913_c1_init},
{"DOS852", "DOS852", DOS852_c0_init},
{"DOS852", "DB_CSY", DOS852_c1_init},
{"DOS852", "DB_PLK", DOS852_c2_init},
{"DOS852", "DB_SLO", DOS852_c4_init},
{"DOS852", "PDOX_CSY", DOS852_c5_init},
{"DOS852", "PDOX_PLK", DOS852_c6_init},
{"DOS852", "PDOX_HUN", DOS852_c7_init},
{"DOS852", "PDOX_SLO", DOS852_c8_init},
{"DOS857", "DOS857", DOS857_c0_init},
{"DOS857", "DB_TRK", DOS857_c1_init},
{"DOS860", "DOS860", DOS860_c0_init},
{"DOS860", "DB_PTG860", DOS860_c1_init},
{"DOS861", "DOS861", DOS861_c0_init},
{"DOS861", "PDOX_ISL", DOS861_c1_init},
{"DOS863", "DOS863", DOS863_c0_init},
{"DOS863", "DB_FRC863", DOS863_c1_init},
{"CYRL", "CYRL", CYRL_c0_init},
{"CYRL", "DB_RUS", CYRL_c1_init},
{"CYRL", "PDOX_CYRL", CYRL_c2_init},
{"DOS737", "DOS737", DOS737_c0_init},
{"DOS737", "DOS775", DOS775_c0_init},
{"DOS858", "DOS858", DOS858_c0_init},
{"DOS862", "DOS862", DOS862_c0_init},
{"DOS864", "DOS864", DOS864_c0_init},
{"DOS866", "DOS866", DOS866_c0_init},
{"DOS869", "DOS869", DOS869_c0_init},
{"WIN1250", "WIN1250", WIN1250_c0_init},
{"WIN1250", "PXW_CSY", WIN1250_c1_init},
{"WIN1250", "PXW_HUNDC", WIN1250_c2_init},
{"WIN1250", "PXW_PLK", WIN1250_c3_init},
{"WIN1250", "PXW_SLOV", WIN1250_c4_init},
{"WIN1250", "PXW_HUN", WIN1250_c5_init},
{"WIN1250", "BS_BA", WIN1250_c6_init},
{"WIN1250", "WIN_CZ", WIN1250_c7_init},
{"WIN1250", "WIN_CZ_CI_AI", WIN1250_c8_init},
{"WIN1251", "WIN1251", WIN1251_c0_init},
{"WIN1251", "PXW_CYRL", WIN1251_c1_init},
{"WIN1251", "WIN1251_UA", WIN1251_c2_init},
{"WIN1252", "WIN1252", WIN1252_c0_init},
{"WIN1252", "PXW_INTL", WIN1252_c1_init},
{"WIN1252", "PXW_INTL850", WIN1252_c2_init},
{"WIN1252", "PXW_NORDAN4", WIN1252_c3_init},
{"WIN1252", "PXW_SPAN", WIN1252_c4_init},
{"WIN1252", "PXW_SWEDFIN", WIN1252_c5_init},
{"WIN1252", "WIN_PTBR", WIN1252_c6_init},
{"WIN1253", "WIN1253", WIN1253_c0_init},
{"WIN1253", "PXW_GREEK", WIN1253_c1_init},
{"WIN1254", "WIN1254", WIN1254_c0_init},
{"WIN1254", "PXW_TURK", WIN1254_c1_init},
{"NEXT", "NEXT", NEXT_c0_init},
{"NEXT", "NXT_US", NEXT_c1_init},
{"NEXT", "NXT_DEU", NEXT_c2_init},
{"NEXT", "NXT_FRA", NEXT_c3_init},
{"NEXT", "NXT_ITA", NEXT_c4_init},
{"NEXT", "NXT_ESP", NEXT_c0_init},
{"WIN1255", "WIN1255", WIN1255_c0_init},
{"WIN1256", "WIN1256", WIN1256_c0_init},
{"WIN1257", "WIN1257", WIN1257_c0_init},
{"WIN1257", "WIN1257_EE", WIN1257_c1_init},
{"WIN1257", "WIN1257_LT", WIN1257_c2_init},
{"WIN1257", "WIN1257_LV", WIN1257_c3_init},
{"KSC_5601", "KSC_5601", KSC_5601_init},
{"KSC_5601", "KSC_DICTIONARY", ksc_5601_dict_init},
{"BIG_5", "BIG_5", BIG5_init},
{"GB_2312", "GB_2312", GB_2312_init},
{"KOI8R", "KOI8R", KOI8R_c0_init},
{"KOI8R", "KOI8R_RU", KOI8R_c1_init},
{"KOI8U", "KOI8U", KOI8U_c0_init},
{"KOI8U", "KOI8U_UA", KOI8U_c1_init},
{"WIN1258", "WIN1258", WIN1258_c0_init},
// ICU collations should not be listed here
{NULL, NULL, NULL}
};
INTL_BOOL FB_DLL_EXPORT LD_lookup_charset(charset* cs, const ASCII* name, const ASCII* config_info)
{
// ASF: We can't read config_info if version < INTL_VERSION_2,
// since it wasn't pushed in the stack by the engine.
try
{
for (int i = 0; charSets[i].charSetName; ++i)
{
if (strcmp(charSets[i].charSetName, name) == 0)
return charSets[i].ptr(cs, name);
}
return CSICU_charset_init(cs, name);
}
catch (Firebird::BadAlloc)
{
fb_assert(false);
return false;
}
}
INTL_BOOL FB_DLL_EXPORT LD_lookup_texttype(texttype* tt, const ASCII* texttype_name, const ASCII* charset_name,
USHORT attributes, const UCHAR* specific_attributes,
ULONG specific_attributes_length, INTL_BOOL ignore_attributes,
const ASCII* config_info)
{
const ASCII* configInfo;
// ASF: We can't read config_info if version < INTL_VERSION_2,
// since it wasn't pushed in the stack by the engine.
if (version >= INTL_VERSION_2)
configInfo = config_info;
else
configInfo = "";
if (ignore_attributes)
{
attributes = TEXTTYPE_ATTR_PAD_SPACE;
specific_attributes = NULL;
specific_attributes_length = 0;
}
try
{
for (int i = 0; collations[i].collationName; ++i)
{
if (strcmp(collations[i].charSetName, charset_name) == 0 &&
strcmp(collations[i].collationName, texttype_name) == 0)
{
charset cs;
memset(&cs, 0, sizeof(cs));
int j;
for (j = 0; charSets[j].charSetName; ++j)
{
if (strcmp(charSets[j].charSetName, charset_name) == 0)
{
if (LD_lookup_charset(&cs, charset_name, configInfo))
break;
return false;
}
}
fb_assert(charSets[j].charSetName);
INTL_BOOL ret = collations[i].ptr(tt, &cs, texttype_name, charset_name,
attributes, specific_attributes, specific_attributes_length, config_info);
if (cs.charset_fn_destroy)
cs.charset_fn_destroy(&cs);
return ret;
}
}
return LCICU_texttype_init(
tt, texttype_name, charset_name, attributes, specific_attributes,
specific_attributes_length, configInfo);
}
catch (Firebird::BadAlloc)
{
fb_assert(false);
return false;
}
}
ULONG FB_DLL_EXPORT LD_setup_attributes(
const ASCII* textTypeName, const ASCII* charSetName, const ASCII* configInfo,
ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst)
{
Firebird::string specificAttributes((const char*) src, srcLen);
Firebird::string newSpecificAttributes = specificAttributes;
if (!LCICU_setup_attributes(textTypeName, charSetName, configInfo,
specificAttributes, newSpecificAttributes))
{
return INTL_BAD_STR_LENGTH;
}
if (dstLen == 0)
return newSpecificAttributes.length();
if (newSpecificAttributes.length() <= dstLen)
{
memcpy(dst, newSpecificAttributes.begin(), newSpecificAttributes.length());
return newSpecificAttributes.length();
}
return INTL_BAD_STR_LENGTH;
}
void FB_DLL_EXPORT LD_version(USHORT* version)
{
// We support version 1 and 2.
if (*version != INTL_VERSION_1)
*version = INTL_VERSION_2;
::version = *version;
}