os/ossrv/genericopenlibs/cppstdlib/src/c_locale_impl.cpp
changeset 0 bde4ae8d615e
     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 +