1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericopenlibs/cppstdlib/src/c_locale_impl.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,970 @@
1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// Name : c_locale_libc.cpp
1.18 +// Part of : libstdcpp
1.19 +// Adaptation layer to get locale functionality.
1.20 +// Version :
1.21 +// This material, including documentation and any related
1.22 +// computer programs, is protected by copyright controlled by
1.23 +// Nokia Corporation. All rights are reserved. Copying,
1.24 +// including reproducing, storing, adapting or translating, any
1.25 +// or all of this material requires the prior written consent of
1.26 +// Nokia Corporation. This material also contains confidential
1.27 +// information which may not be disclosed to others without the
1.28 +// prior written consent of Nokia Corporation.
1.29 +//
1.30 +
1.31 +
1.32 +
1.33 +//#include "stlport_prefix.h"
1.34 +#include <limits.h>
1.35 +#include <locale.h>
1.36 +#include <langinfo.h>
1.37 +#include <string.h>
1.38 +#include <stdlib.h>
1.39 +#include <wctype.h>
1.40 +#include "c_locale.h"
1.41 +#include "e32cmn.h"
1.42 +#include "e32std.h"
1.43 +
1.44 +#ifdef _MESSAGE_CATALOG_
1.45 +#include <libintl.h>
1.46 +#endif
1.47 +
1.48 +#define LOCALE_SYSTEM_DEFAULT "C"
1.49 +#define MAX_NAME_LEN 30
1.50 +
1.51 +#if (defined (__GNUC__) || defined (_KCC) || defined(__ICC)) && (!defined (__SYMBIAN32__))
1.52 +typedef unsigned short int _Locale_mask_t;
1.53 +#else
1.54 +typedef unsigned int _Locale_mask_t;
1.55 +#endif
1.56 +
1.57 +typedef struct _Locale_ctype {
1.58 + char name[MAX_NAME_LEN];
1.59 + _Locale_mask_t ctable[257];
1.60 +} L_ctype_t;
1.61 +
1.62 +
1.63 +typedef struct _Locale_numeric {
1.64 + char name[MAX_NAME_LEN];
1.65 + char decimal_point[4];
1.66 + char thousands_sep[4];
1.67 + char *grouping;
1.68 +} L_numeric_t;
1.69 +
1.70 +typedef struct _Locale_time {
1.71 + char name[MAX_NAME_LEN];
1.72 + char *month[12];
1.73 + char *abbrev_month[12];
1.74 + char *dayofweek[7];
1.75 + char *abbrev_dayofweek[7];
1.76 +} L_time_t;
1.77 +
1.78 +typedef struct _Locale_collate {
1.79 + char name[MAX_NAME_LEN];
1.80 +} L_collate_t;
1.81 +
1.82 +typedef struct _Locale_monetary {
1.83 + char name[MAX_NAME_LEN];
1.84 + char decimal_point[4];
1.85 + char thousands_sep[4];
1.86 + char *grouping;
1.87 + char int_curr_symbol[5]; // 3+1+1
1.88 + char curr_symbol[6];
1.89 + char negative_sign[5];
1.90 + char positive_sign[5];
1.91 + int frac_digits;
1.92 + int int_frac_digits;
1.93 +} L_monetary_t;
1.94 +
1.95 +typedef struct _Locale_messages {
1.96 + char name[MAX_NAME_LEN];
1.97 + char* domain;
1.98 +} L_messages_t;
1.99 +
1.100 +char* __getString(char* str)
1.101 +{
1.102 + int len = strlen(str)+1;
1.103 + char* temp = (char*) new char[len];
1.104 + strcpy(temp, str);
1.105 +
1.106 + return temp;
1.107 +
1.108 +}
1.109 +
1.110 +size_t _Locale_strxfrm(L_collate_t* lcol, char* pDestStr, size_t destLen,
1.111 + const char* pSrcStr, size_t srcLen);
1.112 +
1.113 +size_t _Locale_strwxfrm(L_collate_t* lcol, wchar_t* pDestStr, size_t destLen,
1.114 + const wchar_t* pSrcStr, size_t srcLen);
1.115 +
1.116 +void _Locale_init()
1.117 + {}
1.118 +
1.119 +void _Locale_final()
1.120 + {}
1.121 +
1.122 +/* Gets the system locale name */
1.123 +static const char* Locale_common_default( char* name)
1.124 +{
1.125 + if(name != NULL)
1.126 + {
1.127 + strcpy(name,LOCALE_SYSTEM_DEFAULT);
1.128 + }
1.129 + return LOCALE_SYSTEM_DEFAULT;
1.130 +}
1.131 +
1.132 +
1.133 +static char * Locale_extract_name ( const char *cname, char *into, int category )
1.134 +{
1.135 + int i = 0;
1.136 + const char * end;
1.137 + const char* strstar = "*", *strnull = "";
1.138 + if ( cname[0] != '/' )
1.139 + {
1.140 + if (strcmp(cname,strnull) == 0)
1.141 + return strcpy(into, strstar);
1.142 + else
1.143 + return strcpy(into, cname); /* simple locale name */
1.144 + }
1.145 +
1.146 + for ( i = 0; i <= category; i ++ ) {
1.147 + while ( *cname != '\0' && *cname != '/' )
1.148 + cname++;
1.149 + if ( *cname == '\0' )
1.150 + return into;
1.151 + cname++;
1.152 + }
1.153 +
1.154 + if ( *cname == '\0' )
1.155 + return into;
1.156 +
1.157 + end = cname;
1.158 + while ( *end != '\0' && *end != '/' )
1.159 + end++;
1.160 + strncpy ( into, cname, end - cname );
1.161 + into [ end - cname ] = '\0';
1.162 + return into;
1.163 +}
1.164 +
1.165 +_Locale_mask_t Get_locale_wchar_ctype(wint_t wc, _Locale_mask_t /*mask*/)
1.166 +{
1.167 + _Locale_mask_t ret = 0;
1.168 +
1.169 + if (iswcntrl(wc)) ret |= _Locale_CNTRL;
1.170 + if (iswupper(wc)) ret |= _Locale_UPPER;
1.171 + if (iswlower(wc)) ret |= _Locale_LOWER;
1.172 + if (iswdigit(wc)) ret |= _Locale_DIGIT;
1.173 + if (iswxdigit(wc)) ret |= _Locale_XDIGIT;
1.174 + if (iswpunct(wc)) ret |= _Locale_PUNCT;
1.175 + if (iswspace(wc)) ret |= _Locale_SPACE;
1.176 + if (iswprint(wc)) ret |= _Locale_PRINT;
1.177 + if (iswalpha(wc)) ret |= _Locale_ALPHA;
1.178 + return ret;
1.179 +}
1.180 +
1.181 +_Locale_mask_t Get_locale_char_ctype(unsigned char c)
1.182 +{
1.183 + _Locale_mask_t ret = 0;
1.184 +
1.185 + if (iscntrl(c)) ret |= _Locale_CNTRL;
1.186 + if (isupper(c)) ret |= _Locale_UPPER;
1.187 + if (islower(c)) ret |= _Locale_LOWER;
1.188 + if (isdigit(c)) ret |= _Locale_DIGIT;
1.189 + if (isxdigit(c)) ret |= _Locale_XDIGIT;
1.190 + if (ispunct(c)) ret |= _Locale_PUNCT;
1.191 + if (isspace(c)) ret |= _Locale_SPACE;
1.192 + if (isprint(c)) ret |= _Locale_PRINT;
1.193 + if (isalpha(c)) ret |= _Locale_ALPHA;
1.194 +
1.195 + return ret;
1.196 +}
1.197 +
1.198 +
1.199 +void* _Locale_ctype_create(const char * name, struct _Locale_name_hint* /*hint*/)
1.200 +{
1.201 + unsigned char buffer[256];
1.202 + int i;
1.203 + _Locale_mask_t* ctable;
1.204 +
1.205 + L_ctype_t *plocCType = new (L_ctype_t);
1.206 + if (!plocCType)
1.207 + return NULL;
1.208 +
1.209 + strcpy(plocCType->name, name);
1.210 + char* ptemp = setlocale(LC_CTYPE, name);
1.211 + if (!ptemp)
1.212 + return NULL;
1.213 +
1.214 + ctable = plocCType->ctable;
1.215 +
1.216 + /* Partial implementation for ANSI code page, need to implement for DBCS code pages*/
1.217 +
1.218 + /* Make table with all characters. */
1.219 + for(i = 0; i < 256; i++)
1.220 + {
1.221 + buffer[i] = i;
1.222 + }
1.223 + for (i=0;i<256;i++)
1.224 + {
1.225 + ctable[i+1] = Get_locale_char_ctype(buffer[i]);
1.226 + }
1.227 + ctable[0] = 0; //EOF
1.228 + return plocCType;
1.229 +}
1.230 +
1.231 +void* _Locale_numeric_create(const char *name, struct _Locale_name_hint* /*hint*/)
1.232 +{
1.233 + L_numeric_t *plocNumeric = new (L_numeric_t);
1.234 + struct lconv *plconv;
1.235 +
1.236 + if (!plocNumeric)
1.237 + return NULL;
1.238 +
1.239 + strcpy(plocNumeric->name, name);
1.240 + char* ptemp = setlocale(LC_NUMERIC, name);
1.241 + if (!ptemp)
1.242 + return NULL;
1.243 +
1.244 + plconv = localeconv();
1.245 +
1.246 + //copy locale numeric data to local structure
1.247 + plocNumeric->grouping = __getString(plconv->grouping);
1.248 + strcpy(plocNumeric->decimal_point, plconv->decimal_point);
1.249 + strcpy(plocNumeric->thousands_sep, plconv->thousands_sep);
1.250 +
1.251 + return plocNumeric;
1.252 +}
1.253 +
1.254 +void*_Locale_time_create(const char * name, struct _Locale_name_hint* /*hint*/)
1.255 +{
1.256 + L_time_t *plocTime = new(L_time_t);
1.257 +
1.258 + if (!plocTime )
1.259 + return NULL;
1.260 +
1.261 + strcpy(plocTime ->name, name);
1.262 + char* ptemp = setlocale(LC_TIME, name);
1.263 + if (!ptemp)
1.264 + return NULL;
1.265 +
1.266 + int i;
1.267 +
1.268 + //Get all month names
1.269 + int index = (MON_1);
1.270 + for (i = 0;i<12;i++,index++)
1.271 + plocTime->month[i] = __getString(nl_langinfo(index));
1.272 +
1.273 + //Get all abbrevated month names
1.274 + index = (ABMON_1);
1.275 + for (i = 0;i<12;i++,index++)
1.276 + plocTime->abbrev_month[i] = __getString(nl_langinfo(index));
1.277 +
1.278 + //Get all weekday names
1.279 + index = (DAY_1);
1.280 + for (i = 0;i<7;i++,index++)
1.281 + plocTime->dayofweek[i] = __getString(nl_langinfo(index));
1.282 +
1.283 + //Get all weekday names
1.284 + index = (ABDAY_1);
1.285 + for (i = 0;i<7;i++,index++)
1.286 + plocTime->abbrev_dayofweek[i] = __getString(nl_langinfo(index));
1.287 +
1.288 + return plocTime;
1.289 +}
1.290 +
1.291 +void* _Locale_collate_create(const char *name, struct _Locale_name_hint* /*hint*/)
1.292 +{
1.293 + L_collate_t *plocCollate = new(L_collate_t);
1.294 +
1.295 + if (!plocCollate)
1.296 + return NULL;
1.297 +
1.298 + char* ptemp = setlocale(LC_COLLATE, name);
1.299 + if (!ptemp)
1.300 + return NULL;
1.301 +
1.302 + strcpy(plocCollate->name, name);
1.303 + return plocCollate;
1.304 +}
1.305 +
1.306 +void* _Locale_monetary_create(const char * name, struct _Locale_name_hint* /*hint*/)
1.307 +{
1.308 + L_monetary_t *plocMonetary = new(L_monetary_t);
1.309 + struct lconv *plconv;
1.310 +
1.311 + if (!plocMonetary)
1.312 + return NULL;
1.313 +
1.314 + strcpy(plocMonetary->name, name);
1.315 + char* ptemp = setlocale(LC_MONETARY, name);
1.316 + if (!ptemp)
1.317 + return NULL;
1.318 +
1.319 + plconv = localeconv();
1.320 +
1.321 + strcpy(plocMonetary->decimal_point,plconv->mon_decimal_point);
1.322 + strcpy(plocMonetary->thousands_sep, plconv->mon_thousands_sep);
1.323 + strcpy(plocMonetary->int_curr_symbol, plconv->int_curr_symbol);
1.324 + strcpy(plocMonetary->curr_symbol, plconv->currency_symbol);
1.325 + strcpy(plocMonetary->negative_sign, plconv->negative_sign);
1.326 + strcpy(plocMonetary->positive_sign, plconv->positive_sign);
1.327 + plocMonetary->grouping = __getString(plconv->mon_grouping);
1.328 + plocMonetary->frac_digits = plconv->frac_digits;
1.329 + plocMonetary->int_frac_digits = plconv->int_frac_digits;
1.330 +
1.331 + return plocMonetary;
1.332 +}
1.333 +
1.334 +void* _Locale_messages_create(const char *name, struct _Locale_name_hint* /*hint*/)
1.335 +{
1.336 + L_messages_t *plocMessages= new(L_messages_t);
1.337 +
1.338 + if (!plocMessages)
1.339 + return NULL;
1.340 +
1.341 + char* ptemp = setlocale(LC_MESSAGES, name);
1.342 + if (!ptemp)
1.343 + return NULL;
1.344 +
1.345 + strcpy(plocMessages->name, name);
1.346 + return plocMessages;
1.347 +}
1.348 +
1.349 +const char* _Locale_ctype_default(char* buff)
1.350 +{
1.351 + return Locale_common_default(buff);
1.352 +}
1.353 +
1.354 +const char* _Locale_numeric_default(char *buff)
1.355 +{
1.356 + return Locale_common_default(buff);
1.357 +}
1.358 +
1.359 +const char* _Locale_time_default(char* buff)
1.360 +{
1.361 + return Locale_common_default(buff);
1.362 +}
1.363 +
1.364 +const char* _Locale_collate_default(char* buff)
1.365 +{
1.366 + return Locale_common_default(buff);
1.367 +}
1.368 +
1.369 +const char* _Locale_monetary_default(char* buff)
1.370 +{
1.371 + return Locale_common_default(buff);
1.372 +}
1.373 +
1.374 +const char* _Locale_messages_default(char* buff)
1.375 +{
1.376 + return Locale_common_default(buff);
1.377 +}
1.378 +
1.379 +char const* _Locale_ctype_name(const void* cat, char* buff)
1.380 +{
1.381 + strcpy(buff, ((L_ctype_t*)cat)->name);
1.382 + return buff;
1.383 +}
1.384 +
1.385 +char const* _Locale_numeric_name(const void* cat, char* buff)
1.386 +{
1.387 + strcpy(buff, ((L_numeric_t*)cat)->name);
1.388 + return buff;
1.389 +}
1.390 +
1.391 +char const* _Locale_time_name(const void* cat, char* buff)
1.392 +{
1.393 + strcpy(buff, ((L_time_t*)cat)->name);
1.394 + return buff;
1.395 +}
1.396 +
1.397 +char const* _Locale_collate_name(const void* cat, char* buff)
1.398 +{
1.399 + strcpy(buff, ((L_collate_t*)cat)->name);
1.400 + return buff;
1.401 +}
1.402 +
1.403 +char const* _Locale_monetary_name(const void* cat, char* buff)
1.404 +{
1.405 + strcpy(buff, ((L_monetary_t*)cat)->name);
1.406 + return buff;
1.407 +}
1.408 +
1.409 +char const* _Locale_messages_name(const void* cat, char* buff)
1.410 +{
1.411 + strcpy(buff, ((L_messages_t*)cat)->name);
1.412 + return buff;
1.413 +}
1.414 +
1.415 +void _Locale_ctype_destroy(void* locale)
1.416 +{
1.417 + delete((L_ctype_t*)locale);
1.418 +}
1.419 +
1.420 +void _Locale_numeric_destroy(void* locale)
1.421 +{
1.422 + delete ((L_numeric_t*)locale)->grouping;
1.423 + delete (L_numeric_t*)locale;
1.424 +}
1.425 +
1.426 +void _Locale_time_destroy(void* locale)
1.427 +{
1.428 + int i; //count
1.429 + L_time_t* plocTime =(L_time_t*)locale;
1.430 +
1.431 + //delete months
1.432 + for (i = 0;i<12;i++)
1.433 + delete (plocTime->month[i]);
1.434 +
1.435 + //delete abbrevated months
1.436 + for (i = 0;i<12;i++)
1.437 + delete (plocTime->abbrev_month[i]);
1.438 +
1.439 + //delete week day
1.440 + for (i = 0;i<7;i++)
1.441 + delete (plocTime->dayofweek[i]);
1.442 +
1.443 + //delete abbrevated week day
1.444 + for (i = 0;i<7;i++)
1.445 + delete (plocTime->abbrev_dayofweek[i]);
1.446 +
1.447 + delete((L_time_t*)locale);
1.448 +}
1.449 +
1.450 +void _Locale_collate_destroy(void* locale)
1.451 +{
1.452 + delete((L_collate_t*)locale);
1.453 +}
1.454 +
1.455 +void _Locale_monetary_destroy(void* locale)
1.456 +{
1.457 + delete ((L_monetary_t*)locale)->grouping;
1.458 + delete((L_monetary_t*)locale);
1.459 +}
1.460 +
1.461 +void _Locale_messages_destroy(void* locale)
1.462 +{
1.463 + delete((L_messages_t*)locale);
1.464 +}
1.465 +
1.466 +char const* _Locale_extract_ctype_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.467 +{
1.468 + return Locale_extract_name(cname, buf, LC_CTYPE);
1.469 +}
1.470 +
1.471 +char const* _Locale_extract_numeric_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.472 +{
1.473 + return Locale_extract_name(cname, buf, LC_NUMERIC);
1.474 +}
1.475 +
1.476 +char const* _Locale_extract_time_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.477 +{
1.478 + return Locale_extract_name(cname, buf, LC_TIME);
1.479 +}
1.480 +
1.481 +char const* _Locale_extract_collate_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.482 +{
1.483 + return Locale_extract_name(cname, buf, LC_COLLATE);
1.484 +}
1.485 +
1.486 +char const* _Locale_extract_monetary_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.487 +{
1.488 + return Locale_extract_name(cname, buf, LC_MONETARY);
1.489 +}
1.490 +
1.491 +char const* _Locale_extract_messages_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
1.492 +{
1.493 + return Locale_extract_name(cname, buf, LC_MESSAGES);
1.494 +}
1.495 +
1.496 +const char* _Locale_compose_name(char* buf,
1.497 + const char* ctype, const char* numeric,
1.498 + const char* time, const char* collate,
1.499 + const char* monetary, const char* messages,
1.500 + const char* /*default_name*/)
1.501 +{
1.502 +
1.503 + if ( !strcmp ( ctype, numeric ) &&
1.504 + !strcmp ( ctype, time ) &&
1.505 + !strcmp ( ctype, collate ) &&
1.506 + !strcmp ( ctype, monetary ) &&
1.507 + !strcmp ( ctype, messages ) )
1.508 + return strcpy ( buf, ctype );
1.509 +
1.510 + strcpy ( buf, "/" );
1.511 + strcat ( buf, ctype );
1.512 +
1.513 + strcat ( buf, "/" );
1.514 + strcat ( buf, numeric );
1.515 +
1.516 + strcat ( buf, "/" );
1.517 + strcat ( buf, time );
1.518 +
1.519 + strcat ( buf, "/" );
1.520 + strcat ( buf, collate );
1.521 +
1.522 + strcat ( buf, "/" );
1.523 + strcat ( buf, monetary );
1.524 +
1.525 + strcat ( buf, "/" );
1.526 + strcat ( buf, messages );
1.527 +
1.528 + return buf;
1.529 +}
1.530 +
1.531 +struct _Locale_name_hint* _Locale_get_ctype_hint(struct _Locale_ctype* /*ctype*/)
1.532 +{ return 0; }
1.533 +struct _Locale_name_hint* _Locale_get_numeric_hint(struct _Locale_numeric* /*numeric*/)
1.534 +{ return 0; }
1.535 +struct _Locale_name_hint* _Locale_get_time_hint(struct _Locale_time* /*time*/)
1.536 +{ return 0; }
1.537 +struct _Locale_name_hint* _Locale_get_collate_hint(struct _Locale_collate* /*collate*/)
1.538 +{ return 0; }
1.539 +struct _Locale_name_hint* _Locale_get_monetary_hint(struct _Locale_monetary* /*monetary*/)
1.540 +{ return 0; }
1.541 +struct _Locale_name_hint* _Locale_get_messages_hint(struct _Locale_messages* /*messages*/)
1.542 +{ return 0; }
1.543 +
1.544 +/* ctype */
1.545 +
1.546 +const _Locale_mask_t* _Locale_ctype_table(struct _Locale_ctype* lctype)
1.547 +{
1.548 + return lctype->ctable;
1.549 +}
1.550 +
1.551 +int _Locale_toupper(struct _Locale_ctype* /*lctype*/, int c)
1.552 +{
1.553 + return toupper(c);
1.554 +}
1.555 +
1.556 +int _Locale_tolower(L_ctype_t* /*lctype*/, int c)
1.557 +{
1.558 + return tolower(c);
1.559 +}
1.560 +
1.561 +_Locale_mask_t _Locale_wchar_ctype(L_ctype_t* /*lctype*/, wint_t c, _Locale_mask_t which_bits)
1.562 +{
1.563 + _Locale_mask_t mask = Get_locale_wchar_ctype(c,which_bits);
1.564 + return mask & which_bits;
1.565 +}
1.566 +
1.567 +wint_t _Locale_wchar_tolower(L_ctype_t* /*lctype*/, wint_t c)
1.568 +{
1.569 + return towlower(c);
1.570 +}
1.571 +
1.572 +wint_t _Locale_wchar_toupper(L_ctype_t* /*lctype*/, wint_t c)
1.573 +{
1.574 + return towupper(c);
1.575 +}
1.576 +
1.577 +int _Locale_mb_cur_max (L_ctype_t * /*lctype*/)
1.578 +{
1.579 + return MB_CUR_MAX;
1.580 +}
1.581 +
1.582 +int _Locale_mb_cur_min (L_ctype_t * /*lctype*/)
1.583 +{
1.584 + return 1;
1.585 +}
1.586 +
1.587 +int _Locale_is_stateless (L_ctype_t * /*lctype*/)
1.588 +{
1.589 + return (MB_CUR_MAX == 1)?1:0;
1.590 +}
1.591 +
1.592 +wint_t _Locale_btowc(L_ctype_t * lctype, int c)
1.593 +{
1.594 + setlocale(LC_CTYPE, lctype->name);
1.595 + return btowc(c);
1.596 +}
1.597 +
1.598 +int _Locale_wctob(L_ctype_t * lctype, wint_t wc)
1.599 +{
1.600 + setlocale(LC_CTYPE, lctype->name);
1.601 + return wctob(wc);
1.602 +}
1.603 +
1.604 +size_t _Locale_mbtowc(struct _Locale_ctype *lctype,
1.605 + wchar_t *to, /* size_t n1 - removed in 5.x? */
1.606 + const char *from, size_t n,
1.607 + mbstate_t * /*shift_state*/)
1.608 +{
1.609 + setlocale(LC_CTYPE, lctype->name);
1.610 + return (size_t) mbtowc(to, from,n);
1.611 +}
1.612 +
1.613 +size_t _Locale_wctomb(L_ctype_t* lctype,
1.614 + char *to, size_t /*n*/,
1.615 + const wchar_t c,
1.616 + mbstate_t */*shift_state*/)
1.617 +{
1.618 + setlocale(LC_CTYPE, lctype->name);
1.619 + return (size_t) wctomb(to, c);
1.620 +}
1.621 +
1.622 +
1.623 +size_t _Locale_unshift(L_ctype_t * /*lctype*/,
1.624 + mbstate_t */*st*/,
1.625 + char *buff, size_t /*n*/, char ** next)
1.626 +{
1.627 + //Conversion is not required, because iconv will not do partial conversion.
1.628 + *next = buff;
1.629 + return 0;
1.630 +}
1.631 +
1.632 +/* Collate */
1.633 +
1.634 +int _Locale_strcmp(L_collate_t* lcol,
1.635 + const char* pStr1, size_t len1, const char* pStr2,
1.636 + size_t len2)
1.637 +{
1.638 +
1.639 + char *ptempStr1 = NULL, *ptempStr2 = NULL;
1.640 + int tempLen1, tempLen2;
1.641 +
1.642 + tempLen1 = _Locale_strxfrm(lcol, NULL, 0, pStr1, len1);
1.643 + tempLen2 = _Locale_strxfrm(lcol, NULL, 0, pStr2, len2);
1.644 + ptempStr1 = (char*) new char[tempLen1+1];
1.645 + ptempStr2 = (char*) new char[tempLen2+1];
1.646 + int ret;
1.647 + int minN = tempLen1 < tempLen2 ? tempLen1 : tempLen2;
1.648 + setlocale(LC_COLLATE, lcol->name);
1.649 + _Locale_strxfrm(lcol, ptempStr1, tempLen1, pStr1, len1);
1.650 + _Locale_strxfrm(lcol, ptempStr2, tempLen2, pStr2, len2);
1.651 + ret = strncmp(ptempStr1, ptempStr2, minN);
1.652 +
1.653 + delete [] ptempStr1;
1.654 + delete [] ptempStr2;
1.655 +
1.656 + if (ret == 0)
1.657 + {
1.658 + if (len1 < len2)
1.659 + return -1;
1.660 + else if (len1 > len2)
1.661 + return 1;
1.662 + else
1.663 + return 0;
1.664 + }
1.665 + else
1.666 + return ret;
1.667 +
1.668 +}
1.669 +
1.670 +int _Locale_strwcmp(L_collate_t* lcol,
1.671 + const wchar_t* pStr1, size_t len1,
1.672 + const wchar_t* pStr2, size_t len2)
1.673 +{
1.674 + wchar_t *ptempStr1 = NULL, *ptempStr2 = NULL;
1.675 + int tempLen1,tempLen2;
1.676 +
1.677 + tempLen1 = _Locale_strwxfrm(lcol, NULL,0,pStr1,len1);
1.678 + tempLen2 = _Locale_strwxfrm(lcol, NULL,0,pStr2,len2);
1.679 + ptempStr1 = (wchar_t*) new wchar_t[tempLen1+1];
1.680 + ptempStr2 = (wchar_t*) new wchar_t[tempLen2+1];
1.681 + int ret;
1.682 + int minN = tempLen1 < tempLen2 ? tempLen1 : tempLen2;
1.683 + setlocale(LC_COLLATE, lcol->name);
1.684 + _Locale_strwxfrm(lcol, ptempStr1,tempLen1+1,pStr1,len1);
1.685 + _Locale_strwxfrm(lcol, ptempStr2,tempLen2+1,pStr2,len2);
1.686 + ret = wcsncmp(ptempStr1, ptempStr2, minN);
1.687 +
1.688 + delete [] ptempStr1;
1.689 + delete [] ptempStr2;
1.690 +
1.691 + if (ret == 0)
1.692 + {
1.693 + if (len1 < len2)
1.694 + return -1;
1.695 + else if (len1 > len2)
1.696 + return 1;
1.697 + else
1.698 + return 0;
1.699 + }
1.700 + else
1.701 + return ret;
1.702 +}
1.703 +
1.704 +size_t _Locale_strxfrm(L_collate_t* lcol,
1.705 + char* pDestStr, size_t destLen,
1.706 + const char* pSrcStr, size_t srcLen)
1.707 +{
1.708 + size_t n;
1.709 + setlocale(LC_COLLATE, lcol->name);
1.710 +
1.711 + char* ptemp = (char*) new char[srcLen+1];
1.712 + if(ptemp == NULL)
1.713 + return 0;
1.714 + strncpy(ptemp, pSrcStr, srcLen);
1.715 + *(ptemp + srcLen) = 0;
1.716 +
1.717 + n = strxfrm(pDestStr, ptemp, destLen);
1.718 +
1.719 + delete []ptemp;
1.720 +
1.721 + if ((pDestStr == NULL) || (destLen ==0) )
1.722 + return n;
1.723 + else if(n > destLen)
1.724 + return (size_t)-1;
1.725 +
1.726 + pDestStr[n] = 0;
1.727 + return n;
1.728 +}
1.729 +
1.730 +size_t _Locale_strwxfrm(L_collate_t* lcol,
1.731 + wchar_t* pDestStr, size_t destLen,
1.732 + const wchar_t* pSrcStr, size_t srcLen)
1.733 +{
1.734 + size_t n;
1.735 + setlocale(LC_COLLATE, lcol->name);
1.736 + wchar_t* ptemp = (wchar_t*) new wchar_t[srcLen+1];
1.737 + if(ptemp == NULL)
1.738 + return 0;
1.739 + wcsncpy(ptemp, pSrcStr, srcLen);
1.740 + *(ptemp+srcLen) = 0;
1.741 + n = wcsxfrm(pDestStr, ptemp, destLen);
1.742 + delete []ptemp;
1.743 + if ((pDestStr == NULL) || (destLen ==0) )
1.744 + return n;
1.745 + else if(n > destLen)
1.746 + return (size_t)-1;
1.747 +
1.748 + pDestStr[n] = 0;
1.749 + return n;
1.750 +}
1.751 +
1.752 +/* Numeric */
1.753 +
1.754 +char _Locale_decimal_point(L_numeric_t* lnum)
1.755 +{
1.756 + return lnum->decimal_point[0];
1.757 +}
1.758 +
1.759 +char _Locale_thousands_sep(L_numeric_t* lnum)
1.760 +{
1.761 + return lnum->thousands_sep[0];
1.762 +}
1.763 +const char* _Locale_grouping(L_numeric_t*lnum)
1.764 +{
1.765 + return lnum->grouping;
1.766 +}
1.767 +
1.768 +const char * _Locale_true(L_numeric_t * /*lnum*/)
1.769 +{
1.770 + const char* __true_name="true"; //glib and NT doing the same
1.771 + return __true_name;
1.772 +}
1.773 +
1.774 +const char * _Locale_false(L_numeric_t * /*lnum*/)
1.775 +{
1.776 + const char* __false_name="false"; //glib and NT doing the same
1.777 + return __false_name;
1.778 +}
1.779 +
1.780 +
1.781 +/* Monetary */
1.782 +
1.783 +const char* _Locale_int_curr_symbol(L_monetary_t * lmon)
1.784 +{
1.785 + return lmon->int_curr_symbol;
1.786 +}
1.787 +
1.788 +const char* _Locale_currency_symbol(L_monetary_t * lmon)
1.789 +{
1.790 + return lmon->curr_symbol;
1.791 +}
1.792 +
1.793 +char _Locale_mon_decimal_point(L_monetary_t * lmon)
1.794 +{
1.795 + return lmon->decimal_point[0];
1.796 +}
1.797 +
1.798 +char _Locale_mon_thousands_sep(L_monetary_t * lmon)
1.799 +{
1.800 + return lmon->thousands_sep[0];
1.801 +}
1.802 +
1.803 +const char* _Locale_mon_grouping(L_monetary_t * lmon)
1.804 +{
1.805 + return lmon->grouping;
1.806 +}
1.807 +
1.808 +const char* _Locale_positive_sign(L_monetary_t * lmon)
1.809 +{
1.810 + return lmon->positive_sign;
1.811 +}
1.812 +
1.813 +const char* _Locale_negative_sign(L_monetary_t * lmon)
1.814 +{
1.815 + return lmon->negative_sign;
1.816 +}
1.817 +
1.818 +char _Locale_int_frac_digits(L_monetary_t * lmon)
1.819 +{
1.820 + return lmon->int_frac_digits;
1.821 +}
1.822 +
1.823 +char _Locale_frac_digits(L_monetary_t * lmon)
1.824 +{
1.825 + return lmon->frac_digits;
1.826 +}
1.827 +
1.828 +int _Locale_p_cs_precedes(L_monetary_t * lmon)
1.829 +{
1.830 + struct lconv* plconv;
1.831 + setlocale(LC_MONETARY, lmon->name);
1.832 + plconv = localeconv();
1.833 + return plconv->p_cs_precedes;
1.834 +}
1.835 +
1.836 +int _Locale_p_sep_by_space(L_monetary_t * lmon)
1.837 +{
1.838 + struct lconv* plconv;
1.839 + setlocale(LC_MONETARY, lmon->name);
1.840 + plconv = localeconv();
1.841 + return plconv->p_sep_by_space;
1.842 +}
1.843 +
1.844 +int _Locale_p_sign_posn(L_monetary_t * lmon)
1.845 +{
1.846 + struct lconv* plconv;
1.847 + setlocale(LC_MONETARY, lmon->name);
1.848 + plconv = localeconv();
1.849 + return plconv->p_sign_posn;
1.850 +}
1.851 +
1.852 +int _Locale_n_cs_precedes(L_monetary_t * lmon)
1.853 +{
1.854 + struct lconv* plconv;
1.855 + setlocale(LC_MONETARY, lmon->name);
1.856 + plconv = localeconv();
1.857 + return plconv->n_cs_precedes;
1.858 +}
1.859 +
1.860 +int _Locale_n_sep_by_space(L_monetary_t * lmon)
1.861 +{
1.862 + struct lconv* plconv;
1.863 + setlocale(LC_MONETARY, lmon->name);
1.864 + plconv = localeconv();
1.865 + return plconv->n_sep_by_space;
1.866 +}
1.867 +
1.868 +int _Locale_n_sign_posn(L_monetary_t * lmon)
1.869 +{
1.870 + struct lconv* plconv;
1.871 + setlocale(LC_MONETARY, lmon->name);
1.872 + plconv = localeconv();
1.873 + return plconv->n_sign_posn;
1.874 +}
1.875 +
1.876 +/* Time */
1.877 +const char * _Locale_full_monthname(L_time_t * ltime, int month)
1.878 +{
1.879 + return ltime->month[month];
1.880 +}
1.881 +
1.882 +const char * _Locale_abbrev_monthname(L_time_t * ltime, int month)
1.883 +{
1.884 + return ltime->abbrev_month[month];
1.885 +}
1.886 +
1.887 +const char * _Locale_full_dayofweek(L_time_t * ltime, int day)
1.888 +{
1.889 + return ltime->dayofweek[day];
1.890 +}
1.891 +
1.892 +const char * _Locale_abbrev_dayofweek(L_time_t * ltime, int day)
1.893 +{
1.894 + return ltime->abbrev_dayofweek[day];
1.895 +}
1.896 +
1.897 +const char* _Locale_d_t_fmt(L_time_t* ltime)
1.898 +{
1.899 + setlocale(LC_TIME, ltime->name);
1.900 + return nl_langinfo(D_T_FMT);
1.901 +}
1.902 +
1.903 +const char* _Locale_d_fmt(L_time_t* ltime)
1.904 +{
1.905 + setlocale(LC_TIME, ltime->name);
1.906 + return nl_langinfo(D_FMT);
1.907 +}
1.908 +
1.909 +const char* _Locale_t_fmt(L_time_t* ltime)
1.910 +{
1.911 + setlocale(LC_TIME, ltime->name);
1.912 + return nl_langinfo(T_FMT);
1.913 +}
1.914 +
1.915 +const char* _Locale_long_d_t_fmt(L_time_t* ltime)
1.916 +{
1.917 + setlocale(LC_TIME, ltime->name);
1.918 + return nl_langinfo(D_T_FMT);
1.919 +}
1.920 +
1.921 +const char* _Locale_long_d_fmt(L_time_t* ltime)
1.922 +{
1.923 + setlocale(LC_TIME, ltime->name);
1.924 + return nl_langinfo(D_FMT);
1.925 +}
1.926 +
1.927 +const char* _Locale_am_str(L_time_t* ltime)
1.928 +{
1.929 + setlocale(LC_TIME, ltime->name);
1.930 + return nl_langinfo(AM_STR);
1.931 +}
1.932 +
1.933 +const char* _Locale_pm_str(L_time_t* ltime)
1.934 +{
1.935 + setlocale(LC_TIME, ltime->name);
1.936 + return nl_langinfo(PM_STR);
1.937 +}
1.938 +
1.939 +const char* _Locale_t_fmt_ampm(L_time_t* ltime)
1.940 +{
1.941 + setlocale(LC_TIME, ltime->name);
1.942 + return nl_langinfo(T_FMT_AMPM);
1.943 +}
1.944 +
1.945 +/* Messages */
1.946 +
1.947 +nl_catd_type _Locale_catopen(struct _Locale_messages* lmessage, const char* catalogName)
1.948 +{
1.949 + lmessage->domain = __getString((char*)catalogName);
1.950 + return 1;
1.951 +}
1.952 +
1.953 +void _Locale_catclose(struct _Locale_messages* lmessage, nl_catd_type /*catalog_desc*/)
1.954 +{
1.955 + delete(lmessage->domain);
1.956 + lmessage->domain = NULL;
1.957 +}
1.958 +
1.959 +const char* _Locale_catgets(struct _Locale_messages* lmessage, nl_catd_type /*catalog_desc*/,
1.960 + int /*set*/, int /*message*/,
1.961 + const char * /*dfault*/)
1.962 +{
1.963 + char* locale = setlocale(LC_ALL, lmessage->name);
1.964 +#ifdef _MESSAGE_CATALOG_
1.965 + textdomain(lmessage->domain);
1.966 +
1.967 + return gettext(dfault);
1.968 +#else
1.969 + return NULL;
1.970 +#endif
1.971 +
1.972 +}
1.973 +