os/ossrv/genericopenlibs/cppstdlib/src/c_locale_impl.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// Name        : c_locale_libc.cpp
sl@0
    15
// Part of     : libstdcpp
sl@0
    16
// Adaptation layer to get locale functionality.
sl@0
    17
// Version     : 
sl@0
    18
// This material, including documentation and any related 
sl@0
    19
// computer programs, is protected by copyright controlled by 
sl@0
    20
// Nokia Corporation. All rights are reserved. Copying, 
sl@0
    21
// including reproducing, storing, adapting or translating, any 
sl@0
    22
// or all of this material requires the prior written consent of 
sl@0
    23
// Nokia Corporation. This material also contains confidential 
sl@0
    24
// information which may not be disclosed to others without the 
sl@0
    25
// prior written consent of Nokia Corporation.
sl@0
    26
//
sl@0
    27
sl@0
    28
sl@0
    29
sl@0
    30
//#include "stlport_prefix.h" 
sl@0
    31
#include <limits.h>
sl@0
    32
#include <locale.h>
sl@0
    33
#include <langinfo.h>
sl@0
    34
#include <string.h>
sl@0
    35
#include <stdlib.h>
sl@0
    36
#include <wctype.h>
sl@0
    37
#include "c_locale.h"
sl@0
    38
#include "e32cmn.h"
sl@0
    39
#include "e32std.h" 
sl@0
    40
sl@0
    41
#ifdef	_MESSAGE_CATALOG_
sl@0
    42
#include <libintl.h>
sl@0
    43
#endif
sl@0
    44
sl@0
    45
#define LOCALE_SYSTEM_DEFAULT	"C"
sl@0
    46
#define	MAX_NAME_LEN	30	
sl@0
    47
sl@0
    48
#if (defined (__GNUC__) || defined (_KCC) || defined(__ICC)) && (!defined (__SYMBIAN32__))
sl@0
    49
typedef unsigned short int _Locale_mask_t;
sl@0
    50
#else
sl@0
    51
typedef unsigned int _Locale_mask_t;
sl@0
    52
#endif
sl@0
    53
sl@0
    54
typedef struct _Locale_ctype { 
sl@0
    55
	char name[MAX_NAME_LEN];
sl@0
    56
	_Locale_mask_t	ctable[257];	
sl@0
    57
} L_ctype_t;
sl@0
    58
sl@0
    59
sl@0
    60
typedef struct _Locale_numeric	{  
sl@0
    61
  char name[MAX_NAME_LEN];
sl@0
    62
  char decimal_point[4];
sl@0
    63
  char thousands_sep[4];
sl@0
    64
  char *grouping;
sl@0
    65
} L_numeric_t;
sl@0
    66
sl@0
    67
typedef struct _Locale_time	{  
sl@0
    68
  char name[MAX_NAME_LEN];
sl@0
    69
  char *month[12];
sl@0
    70
  char *abbrev_month[12];
sl@0
    71
  char *dayofweek[7];
sl@0
    72
  char *abbrev_dayofweek[7];
sl@0
    73
} L_time_t;
sl@0
    74
sl@0
    75
typedef struct _Locale_collate	{
sl@0
    76
  char name[MAX_NAME_LEN];
sl@0
    77
} L_collate_t;
sl@0
    78
sl@0
    79
typedef struct _Locale_monetary	{  
sl@0
    80
  char name[MAX_NAME_LEN]; 
sl@0
    81
  char decimal_point[4];
sl@0
    82
  char thousands_sep[4];
sl@0
    83
  char *grouping;
sl@0
    84
  char int_curr_symbol[5]; // 3+1+1
sl@0
    85
  char curr_symbol[6];
sl@0
    86
  char negative_sign[5];
sl@0
    87
  char positive_sign[5];
sl@0
    88
  int frac_digits; 
sl@0
    89
  int int_frac_digits;
sl@0
    90
} L_monetary_t;
sl@0
    91
sl@0
    92
typedef struct _Locale_messages	{
sl@0
    93
  char name[MAX_NAME_LEN];
sl@0
    94
  char* domain;
sl@0
    95
} L_messages_t;
sl@0
    96
sl@0
    97
char* __getString(char* str)
sl@0
    98
{
sl@0
    99
	int len = strlen(str)+1;
sl@0
   100
	char* temp = (char*) new char[len];
sl@0
   101
	strcpy(temp, str);
sl@0
   102
	
sl@0
   103
	return temp;
sl@0
   104
	
sl@0
   105
}
sl@0
   106
sl@0
   107
size_t _Locale_strxfrm(L_collate_t* lcol, char* pDestStr, size_t destLen,
sl@0
   108
                        const char* pSrcStr, size_t srcLen);
sl@0
   109
sl@0
   110
size_t _Locale_strwxfrm(L_collate_t* lcol, wchar_t* pDestStr, size_t destLen,
sl@0
   111
                          const wchar_t* pSrcStr, size_t srcLen);
sl@0
   112
sl@0
   113
void _Locale_init()
sl@0
   114
	{}
sl@0
   115
sl@0
   116
void _Locale_final()
sl@0
   117
	{}
sl@0
   118
sl@0
   119
/* Gets the system locale name */
sl@0
   120
static const char* Locale_common_default( char* name)
sl@0
   121
{
sl@0
   122
	if(name != NULL)
sl@0
   123
	{
sl@0
   124
		strcpy(name,LOCALE_SYSTEM_DEFAULT);
sl@0
   125
	}
sl@0
   126
	return LOCALE_SYSTEM_DEFAULT;
sl@0
   127
}
sl@0
   128
sl@0
   129
sl@0
   130
static char * Locale_extract_name ( const char *cname, char *into, int category )
sl@0
   131
{
sl@0
   132
  int i = 0;
sl@0
   133
  const char * end;
sl@0
   134
  const char* strstar = "*", *strnull = "";  
sl@0
   135
  if ( cname[0] != '/' )
sl@0
   136
  {
sl@0
   137
  	if (strcmp(cname,strnull) == 0)
sl@0
   138
  		return strcpy(into, strstar);
sl@0
   139
  	else
sl@0
   140
  		return strcpy(into, cname); /* simple locale name */
sl@0
   141
  }  
sl@0
   142
  
sl@0
   143
  for ( i = 0; i <= category; i ++ ) {
sl@0
   144
    while ( *cname != '\0' && *cname != '/' )
sl@0
   145
      cname++;
sl@0
   146
    if ( *cname == '\0' )
sl@0
   147
      return into;
sl@0
   148
    cname++;
sl@0
   149
  }
sl@0
   150
  
sl@0
   151
  if ( *cname == '\0' )
sl@0
   152
    return into;  
sl@0
   153
  
sl@0
   154
  end = cname;
sl@0
   155
  while ( *end != '\0' && *end != '/' )
sl@0
   156
    end++;  
sl@0
   157
  strncpy ( into, cname, end - cname );
sl@0
   158
  into [ end - cname ] = '\0';  
sl@0
   159
  return into;
sl@0
   160
}
sl@0
   161
sl@0
   162
_Locale_mask_t  Get_locale_wchar_ctype(wint_t wc, _Locale_mask_t  /*mask*/)
sl@0
   163
{
sl@0
   164
	_Locale_mask_t  ret = 0;
sl@0
   165
	
sl@0
   166
	if (iswcntrl(wc))  ret |= _Locale_CNTRL;
sl@0
   167
	if (iswupper(wc))  ret |= _Locale_UPPER;
sl@0
   168
	if (iswlower(wc))  ret |= _Locale_LOWER;
sl@0
   169
	if (iswdigit(wc))  ret |= _Locale_DIGIT;
sl@0
   170
	if (iswxdigit(wc)) ret |= _Locale_XDIGIT;
sl@0
   171
	if (iswpunct(wc))  ret |= _Locale_PUNCT;
sl@0
   172
	if (iswspace(wc))  ret |= _Locale_SPACE;
sl@0
   173
	if (iswprint(wc))  ret |= _Locale_PRINT;
sl@0
   174
	if (iswalpha(wc))  ret |= _Locale_ALPHA;	
sl@0
   175
	return ret;
sl@0
   176
}
sl@0
   177
sl@0
   178
_Locale_mask_t  Get_locale_char_ctype(unsigned char c)
sl@0
   179
{
sl@0
   180
	_Locale_mask_t  ret = 0;
sl@0
   181
	
sl@0
   182
	if (iscntrl(c))  ret |= _Locale_CNTRL;    
sl@0
   183
	if (isupper(c))  ret |= _Locale_UPPER;
sl@0
   184
	if (islower(c))  ret |= _Locale_LOWER;
sl@0
   185
	if (isdigit(c))  ret |= _Locale_DIGIT;
sl@0
   186
	if (isxdigit(c)) ret |= _Locale_XDIGIT;
sl@0
   187
	if (ispunct(c))  ret |= _Locale_PUNCT;
sl@0
   188
	if (isspace(c))  ret |= _Locale_SPACE;
sl@0
   189
	if (isprint(c))  ret |= _Locale_PRINT;
sl@0
   190
	if (isalpha(c))  ret |= _Locale_ALPHA;
sl@0
   191
	
sl@0
   192
	return ret;  
sl@0
   193
}
sl@0
   194
sl@0
   195
   
sl@0
   196
void* _Locale_ctype_create(const char * name, struct _Locale_name_hint* /*hint*/)
sl@0
   197
{ 
sl@0
   198
   unsigned char buffer[256];
sl@0
   199
   int i;
sl@0
   200
   _Locale_mask_t* ctable;	
sl@0
   201
sl@0
   202
   L_ctype_t *plocCType = new (L_ctype_t); 	
sl@0
   203
   if (!plocCType)
sl@0
   204
      return NULL;
sl@0
   205
sl@0
   206
   strcpy(plocCType->name, name);
sl@0
   207
   char* ptemp = setlocale(LC_CTYPE, name); 
sl@0
   208
   if (!ptemp)
sl@0
   209
      return NULL;
sl@0
   210
sl@0
   211
   ctable = plocCType->ctable;
sl@0
   212
sl@0
   213
   /* Partial implementation for ANSI code page, need to implement for DBCS code pages*/
sl@0
   214
sl@0
   215
   /* Make table with all characters. */
sl@0
   216
   for(i = 0; i < 256; i++) 
sl@0
   217
   { 
sl@0
   218
      buffer[i] = i;  
sl@0
   219
   }    
sl@0
   220
   for (i=0;i<256;i++)
sl@0
   221
   {
sl@0
   222
      ctable[i+1] = Get_locale_char_ctype(buffer[i]);	
sl@0
   223
   }	
sl@0
   224
   ctable[0] = 0; //EOF
sl@0
   225
   return plocCType;
sl@0
   226
}
sl@0
   227
  
sl@0
   228
void* _Locale_numeric_create(const char *name, struct _Locale_name_hint* /*hint*/)
sl@0
   229
{ 
sl@0
   230
   L_numeric_t *plocNumeric = new (L_numeric_t);
sl@0
   231
   struct lconv *plconv;
sl@0
   232
sl@0
   233
   if (!plocNumeric)
sl@0
   234
      return NULL; 	
sl@0
   235
sl@0
   236
   strcpy(plocNumeric->name, name); 	
sl@0
   237
   char* ptemp = setlocale(LC_NUMERIC, name); 
sl@0
   238
   if (!ptemp)
sl@0
   239
      return NULL;
sl@0
   240
sl@0
   241
   plconv = localeconv();
sl@0
   242
sl@0
   243
   //copy locale numeric data to local structure
sl@0
   244
   plocNumeric->grouping = __getString(plconv->grouping);
sl@0
   245
   strcpy(plocNumeric->decimal_point, plconv->decimal_point); 	
sl@0
   246
   strcpy(plocNumeric->thousands_sep, plconv->thousands_sep);
sl@0
   247
sl@0
   248
   return plocNumeric; 
sl@0
   249
}
sl@0
   250
 
sl@0
   251
void*_Locale_time_create(const char * name, struct _Locale_name_hint* /*hint*/)
sl@0
   252
{ 
sl@0
   253
   L_time_t *plocTime = new(L_time_t);
sl@0
   254
sl@0
   255
   if (!plocTime )
sl@0
   256
      return NULL;
sl@0
   257
sl@0
   258
   strcpy(plocTime ->name, name); 	
sl@0
   259
   char* ptemp = setlocale(LC_TIME, name); 
sl@0
   260
   if (!ptemp)
sl@0
   261
      return NULL;
sl@0
   262
sl@0
   263
   int i;
sl@0
   264
sl@0
   265
   //Get all month names
sl@0
   266
   int index = (MON_1);   
sl@0
   267
   for (i = 0;i<12;i++,index++)
sl@0
   268
      plocTime->month[i] = __getString(nl_langinfo(index)); 	
sl@0
   269
sl@0
   270
   //Get all abbrevated month names
sl@0
   271
   index = (ABMON_1);
sl@0
   272
   for (i = 0;i<12;i++,index++)
sl@0
   273
      plocTime->abbrev_month[i] = __getString(nl_langinfo(index));
sl@0
   274
      
sl@0
   275
   //Get all weekday names
sl@0
   276
   index = (DAY_1);
sl@0
   277
   for (i = 0;i<7;i++,index++)
sl@0
   278
      plocTime->dayofweek[i] = __getString(nl_langinfo(index));
sl@0
   279
sl@0
   280
   //Get all weekday names
sl@0
   281
   index = (ABDAY_1);
sl@0
   282
   for (i = 0;i<7;i++,index++)
sl@0
   283
      plocTime->abbrev_dayofweek[i] = __getString(nl_langinfo(index)); 	
sl@0
   284
      
sl@0
   285
   return plocTime;
sl@0
   286
}
sl@0
   287
 
sl@0
   288
void* _Locale_collate_create(const char *name, struct _Locale_name_hint* /*hint*/)
sl@0
   289
{ 
sl@0
   290
   L_collate_t *plocCollate = new(L_collate_t);
sl@0
   291
sl@0
   292
   if (!plocCollate)
sl@0
   293
      return NULL;
sl@0
   294
sl@0
   295
   char* ptemp = setlocale(LC_COLLATE, name); 
sl@0
   296
   if (!ptemp)
sl@0
   297
	   return NULL;
sl@0
   298
   
sl@0
   299
   strcpy(plocCollate->name, name); 	
sl@0
   300
   return plocCollate;
sl@0
   301
}
sl@0
   302
 
sl@0
   303
void* _Locale_monetary_create(const char * name, struct _Locale_name_hint* /*hint*/)
sl@0
   304
{ 
sl@0
   305
 	L_monetary_t *plocMonetary = new(L_monetary_t);
sl@0
   306
 	struct lconv *plconv;
sl@0
   307
 	
sl@0
   308
 	if (!plocMonetary)
sl@0
   309
		return NULL; 	
sl@0
   310
 	
sl@0
   311
 	strcpy(plocMonetary->name, name); 	
sl@0
   312
	char* ptemp = setlocale(LC_MONETARY, name); 
sl@0
   313
	if (!ptemp)
sl@0
   314
		return NULL;
sl@0
   315
	
sl@0
   316
 	plconv = localeconv(); 	
sl@0
   317
 	
sl@0
   318
 	strcpy(plocMonetary->decimal_point,plconv->mon_decimal_point);
sl@0
   319
  	strcpy(plocMonetary->thousands_sep, plconv->mon_thousands_sep);  	
sl@0
   320
  	strcpy(plocMonetary->int_curr_symbol, plconv->int_curr_symbol); 
sl@0
   321
  	strcpy(plocMonetary->curr_symbol, plconv->currency_symbol);
sl@0
   322
  	strcpy(plocMonetary->negative_sign, plconv->negative_sign);
sl@0
   323
  	strcpy(plocMonetary->positive_sign, plconv->positive_sign);
sl@0
   324
  	plocMonetary->grouping		  = __getString(plconv->mon_grouping);
sl@0
   325
  	plocMonetary->frac_digits	  = plconv->frac_digits;
sl@0
   326
  	plocMonetary->int_frac_digits = plconv->int_frac_digits;
sl@0
   327
 	
sl@0
   328
 	return plocMonetary;
sl@0
   329
}
sl@0
   330
sl@0
   331
void* _Locale_messages_create(const char *name, struct _Locale_name_hint* /*hint*/)
sl@0
   332
{ 
sl@0
   333
 	L_messages_t *plocMessages= new(L_messages_t);
sl@0
   334
 	
sl@0
   335
 	if (!plocMessages)
sl@0
   336
		return NULL; 	
sl@0
   337
 	
sl@0
   338
 	char* ptemp = setlocale(LC_MESSAGES, name); 
sl@0
   339
 	if (!ptemp)
sl@0
   340
 		return NULL;
sl@0
   341
 	 	
sl@0
   342
 	strcpy(plocMessages->name, name); 	
sl@0
   343
 	return plocMessages;
sl@0
   344
}
sl@0
   345
sl@0
   346
const char* _Locale_ctype_default(char* buff)
sl@0
   347
{ 
sl@0
   348
 	return Locale_common_default(buff);
sl@0
   349
}
sl@0
   350
 
sl@0
   351
const char* _Locale_numeric_default(char *buff)
sl@0
   352
{ 
sl@0
   353
 	return Locale_common_default(buff);
sl@0
   354
}
sl@0
   355
 
sl@0
   356
const char* _Locale_time_default(char* buff)
sl@0
   357
{ 
sl@0
   358
 	return Locale_common_default(buff);
sl@0
   359
}
sl@0
   360
 
sl@0
   361
const char* _Locale_collate_default(char* buff)
sl@0
   362
{ 
sl@0
   363
 	return Locale_common_default(buff); 
sl@0
   364
}
sl@0
   365
 
sl@0
   366
const char* _Locale_monetary_default(char* buff)
sl@0
   367
{ 
sl@0
   368
 	return Locale_common_default(buff);
sl@0
   369
}
sl@0
   370
 
sl@0
   371
const char* _Locale_messages_default(char* buff) 
sl@0
   372
{ 
sl@0
   373
 	return Locale_common_default(buff);
sl@0
   374
}
sl@0
   375
sl@0
   376
char const* _Locale_ctype_name(const void* cat, char* buff)
sl@0
   377
{ 
sl@0
   378
	strcpy(buff, ((L_ctype_t*)cat)->name);
sl@0
   379
	return buff;
sl@0
   380
}
sl@0
   381
sl@0
   382
char const* _Locale_numeric_name(const void* cat, char* buff)
sl@0
   383
{ 
sl@0
   384
	strcpy(buff, ((L_numeric_t*)cat)->name);
sl@0
   385
	return buff;	
sl@0
   386
}
sl@0
   387
sl@0
   388
char const* _Locale_time_name(const void* cat, char* buff)
sl@0
   389
{ 
sl@0
   390
	strcpy(buff, ((L_time_t*)cat)->name); 
sl@0
   391
	return buff;
sl@0
   392
}
sl@0
   393
sl@0
   394
char const* _Locale_collate_name(const void* cat, char* buff)
sl@0
   395
{
sl@0
   396
	strcpy(buff, ((L_collate_t*)cat)->name); 
sl@0
   397
	return buff; 
sl@0
   398
}
sl@0
   399
sl@0
   400
char const* _Locale_monetary_name(const void* cat, char* buff)
sl@0
   401
{ 
sl@0
   402
	strcpy(buff, ((L_monetary_t*)cat)->name); 
sl@0
   403
	return buff;  
sl@0
   404
}
sl@0
   405
sl@0
   406
char const* _Locale_messages_name(const void* cat, char* buff)
sl@0
   407
{
sl@0
   408
	strcpy(buff, ((L_messages_t*)cat)->name); 
sl@0
   409
	return buff; 
sl@0
   410
}
sl@0
   411
sl@0
   412
void _Locale_ctype_destroy(void* locale)
sl@0
   413
{
sl@0
   414
 	delete((L_ctype_t*)locale);
sl@0
   415
}
sl@0
   416
 
sl@0
   417
void _Locale_numeric_destroy(void* locale)
sl@0
   418
{
sl@0
   419
 	delete ((L_numeric_t*)locale)->grouping;
sl@0
   420
 	delete (L_numeric_t*)locale;
sl@0
   421
}
sl@0
   422
 
sl@0
   423
void _Locale_time_destroy(void* locale)
sl@0
   424
{
sl@0
   425
 	int i; //count
sl@0
   426
 	L_time_t* plocTime =(L_time_t*)locale; 
sl@0
   427
 	
sl@0
   428
 	//delete months
sl@0
   429
 	for (i = 0;i<12;i++)
sl@0
   430
 		delete (plocTime->month[i]);
sl@0
   431
 	
sl@0
   432
 	//delete abbrevated months
sl@0
   433
 	for (i = 0;i<12;i++)
sl@0
   434
 		delete (plocTime->abbrev_month[i]);
sl@0
   435
 	
sl@0
   436
 	//delete week day
sl@0
   437
 	for (i = 0;i<7;i++)
sl@0
   438
 		delete (plocTime->dayofweek[i]);
sl@0
   439
 	
sl@0
   440
 	//delete abbrevated week day
sl@0
   441
 	for (i = 0;i<7;i++)
sl@0
   442
 		delete (plocTime->abbrev_dayofweek[i]);
sl@0
   443
 	 		
sl@0
   444
 	delete((L_time_t*)locale);
sl@0
   445
}
sl@0
   446
 
sl@0
   447
void _Locale_collate_destroy(void* locale)
sl@0
   448
{
sl@0
   449
 	delete((L_collate_t*)locale);
sl@0
   450
}
sl@0
   451
 
sl@0
   452
void _Locale_monetary_destroy(void* locale)
sl@0
   453
{
sl@0
   454
 	delete ((L_monetary_t*)locale)->grouping;
sl@0
   455
 	delete((L_monetary_t*)locale);
sl@0
   456
}
sl@0
   457
 
sl@0
   458
void _Locale_messages_destroy(void* locale)
sl@0
   459
{
sl@0
   460
 	delete((L_messages_t*)locale);
sl@0
   461
}
sl@0
   462
 
sl@0
   463
char const* _Locale_extract_ctype_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/) 
sl@0
   464
{ 
sl@0
   465
 	return Locale_extract_name(cname, buf, LC_CTYPE);
sl@0
   466
}
sl@0
   467
 
sl@0
   468
char const* _Locale_extract_numeric_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
sl@0
   469
{ 
sl@0
   470
 	return Locale_extract_name(cname, buf, LC_NUMERIC);
sl@0
   471
}
sl@0
   472
 
sl@0
   473
char const* _Locale_extract_time_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/)
sl@0
   474
{ 
sl@0
   475
 	return Locale_extract_name(cname, buf, LC_TIME);
sl@0
   476
}
sl@0
   477
 
sl@0
   478
char const* _Locale_extract_collate_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/) 
sl@0
   479
{ 
sl@0
   480
 	return Locale_extract_name(cname, buf, LC_COLLATE); 
sl@0
   481
}
sl@0
   482
 
sl@0
   483
char const* _Locale_extract_monetary_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/) 
sl@0
   484
{ 
sl@0
   485
 	return Locale_extract_name(cname, buf, LC_MONETARY);
sl@0
   486
}
sl@0
   487
 
sl@0
   488
char const* _Locale_extract_messages_name(const char* cname, char* buf, struct _Locale_name_hint* /*__hint*/) 
sl@0
   489
{ 
sl@0
   490
 	return Locale_extract_name(cname, buf, LC_MESSAGES);
sl@0
   491
}
sl@0
   492
sl@0
   493
const char* _Locale_compose_name(char* buf,
sl@0
   494
			     const char* ctype, const char* numeric,
sl@0
   495
			     const char* time, const char* collate,
sl@0
   496
			     const char* monetary, const char* messages,
sl@0
   497
			     const char* /*default_name*/)
sl@0
   498
{ 
sl@0
   499
 
sl@0
   500
 	if ( !strcmp ( ctype, numeric ) &&
sl@0
   501
		 !strcmp ( ctype, time ) &&
sl@0
   502
		 !strcmp ( ctype, collate ) &&
sl@0
   503
		 !strcmp ( ctype, monetary ) &&
sl@0
   504
		 !strcmp ( ctype, messages ) )
sl@0
   505
	return strcpy ( buf, ctype );
sl@0
   506
sl@0
   507
    strcpy ( buf, "/" );
sl@0
   508
    strcat ( buf, ctype );
sl@0
   509
sl@0
   510
    strcat ( buf, "/" );
sl@0
   511
    strcat ( buf, numeric );
sl@0
   512
sl@0
   513
    strcat ( buf, "/" );
sl@0
   514
    strcat ( buf, time );
sl@0
   515
sl@0
   516
    strcat ( buf, "/" );
sl@0
   517
    strcat ( buf, collate );
sl@0
   518
sl@0
   519
    strcat ( buf, "/" );
sl@0
   520
    strcat ( buf, monetary );
sl@0
   521
sl@0
   522
    strcat ( buf, "/" );
sl@0
   523
    strcat ( buf, messages );
sl@0
   524
sl@0
   525
    return buf;
sl@0
   526
}
sl@0
   527
sl@0
   528
struct _Locale_name_hint* _Locale_get_ctype_hint(struct _Locale_ctype* /*ctype*/)
sl@0
   529
{ return 0; }
sl@0
   530
struct _Locale_name_hint* _Locale_get_numeric_hint(struct _Locale_numeric* /*numeric*/)
sl@0
   531
{ return 0; }
sl@0
   532
struct _Locale_name_hint* _Locale_get_time_hint(struct _Locale_time* /*time*/)
sl@0
   533
{ return 0; }
sl@0
   534
struct _Locale_name_hint* _Locale_get_collate_hint(struct _Locale_collate* /*collate*/)
sl@0
   535
{ return 0; }
sl@0
   536
struct _Locale_name_hint* _Locale_get_monetary_hint(struct _Locale_monetary* /*monetary*/)
sl@0
   537
{ return 0; }
sl@0
   538
struct _Locale_name_hint* _Locale_get_messages_hint(struct _Locale_messages* /*messages*/)
sl@0
   539
{ return 0; }
sl@0
   540
sl@0
   541
/* ctype */
sl@0
   542
sl@0
   543
const  _Locale_mask_t* _Locale_ctype_table(struct _Locale_ctype* lctype)
sl@0
   544
{ 	    
sl@0
   545
	return lctype->ctable; 
sl@0
   546
}
sl@0
   547
sl@0
   548
int _Locale_toupper(struct _Locale_ctype* /*lctype*/, int c)
sl@0
   549
{ 
sl@0
   550
	return toupper(c); 
sl@0
   551
}
sl@0
   552
sl@0
   553
int _Locale_tolower(L_ctype_t* /*lctype*/, int c) 
sl@0
   554
{ 
sl@0
   555
	return tolower(c); 
sl@0
   556
}
sl@0
   557
sl@0
   558
_Locale_mask_t  _Locale_wchar_ctype(L_ctype_t* /*lctype*/, wint_t c, _Locale_mask_t  which_bits)
sl@0
   559
{ 
sl@0
   560
 	_Locale_mask_t mask = Get_locale_wchar_ctype(c,which_bits); 	
sl@0
   561
 	return mask & which_bits; 
sl@0
   562
}
sl@0
   563
sl@0
   564
wint_t _Locale_wchar_tolower(L_ctype_t* /*lctype*/, wint_t c)
sl@0
   565
{ 
sl@0
   566
 	return towlower(c); 
sl@0
   567
}
sl@0
   568
sl@0
   569
wint_t _Locale_wchar_toupper(L_ctype_t* /*lctype*/, wint_t c)
sl@0
   570
{ 
sl@0
   571
 	return towupper(c); 
sl@0
   572
}
sl@0
   573
 
sl@0
   574
int _Locale_mb_cur_max (L_ctype_t * /*lctype*/) 
sl@0
   575
{ 
sl@0
   576
	return MB_CUR_MAX;
sl@0
   577
}
sl@0
   578
sl@0
   579
int _Locale_mb_cur_min (L_ctype_t * /*lctype*/) 
sl@0
   580
{ 
sl@0
   581
	return 1; 
sl@0
   582
}
sl@0
   583
sl@0
   584
int _Locale_is_stateless (L_ctype_t * /*lctype*/) 
sl@0
   585
{ 
sl@0
   586
	return (MB_CUR_MAX == 1)?1:0; 
sl@0
   587
}
sl@0
   588
sl@0
   589
wint_t _Locale_btowc(L_ctype_t * lctype, int c) 
sl@0
   590
{ 
sl@0
   591
	setlocale(LC_CTYPE, lctype->name); 
sl@0
   592
	return btowc(c); 
sl@0
   593
}
sl@0
   594
sl@0
   595
int _Locale_wctob(L_ctype_t * lctype, wint_t wc) 
sl@0
   596
{ 
sl@0
   597
	setlocale(LC_CTYPE, lctype->name);  
sl@0
   598
	return wctob(wc); 
sl@0
   599
}
sl@0
   600
sl@0
   601
size_t _Locale_mbtowc(struct _Locale_ctype *lctype,
sl@0
   602
                      wchar_t *to,			/* size_t n1 - removed in 5.x?  */
sl@0
   603
                      const char *from, size_t n,
sl@0
   604
                      mbstate_t * /*shift_state*/)
sl@0
   605
{
sl@0
   606
	setlocale(LC_CTYPE, lctype->name);
sl@0
   607
	return (size_t) mbtowc(to, from,n); 
sl@0
   608
}
sl@0
   609
sl@0
   610
size_t _Locale_wctomb(L_ctype_t* lctype,
sl@0
   611
                                 char *to, size_t /*n*/,
sl@0
   612
                                 const wchar_t c,
sl@0
   613
                                 mbstate_t */*shift_state*/) 
sl@0
   614
{
sl@0
   615
	setlocale(LC_CTYPE, lctype->name);
sl@0
   616
  	return (size_t) wctomb(to, c);
sl@0
   617
}
sl@0
   618
sl@0
   619
 
sl@0
   620
size_t _Locale_unshift(L_ctype_t * /*lctype*/,
sl@0
   621
                                  mbstate_t */*st*/,
sl@0
   622
                                  char *buff, size_t /*n*/, char ** next) 
sl@0
   623
{
sl@0
   624
	//Conversion is not required, because iconv will not do partial conversion.
sl@0
   625
	*next = buff;
sl@0
   626
	return 0;
sl@0
   627
}
sl@0
   628
sl@0
   629
/* Collate */
sl@0
   630
sl@0
   631
int _Locale_strcmp(L_collate_t* lcol,
sl@0
   632
                    const char* pStr1, size_t len1, const char* pStr2,
sl@0
   633
                    size_t len2) 
sl@0
   634
{
sl@0
   635
sl@0
   636
	char *ptempStr1 = NULL, *ptempStr2 = NULL;
sl@0
   637
	int tempLen1, tempLen2;
sl@0
   638
sl@0
   639
	tempLen1 = _Locale_strxfrm(lcol, NULL, 0, pStr1, len1);
sl@0
   640
	tempLen2 = _Locale_strxfrm(lcol, NULL, 0, pStr2, len2);
sl@0
   641
	ptempStr1 = (char*) new char[tempLen1+1];
sl@0
   642
	ptempStr2 = (char*) new char[tempLen2+1];
sl@0
   643
	int ret;
sl@0
   644
	int minN = tempLen1 < tempLen2 ? tempLen1 : tempLen2;	
sl@0
   645
	setlocale(LC_COLLATE, lcol->name);
sl@0
   646
	_Locale_strxfrm(lcol, ptempStr1, tempLen1, pStr1, len1);
sl@0
   647
	_Locale_strxfrm(lcol, ptempStr2, tempLen2, pStr2, len2);
sl@0
   648
	ret = strncmp(ptempStr1, ptempStr2, minN);
sl@0
   649
sl@0
   650
	delete [] ptempStr1;
sl@0
   651
	delete [] ptempStr2;
sl@0
   652
sl@0
   653
	if (ret == 0) 
sl@0
   654
	{
sl@0
   655
		if (len1 < len2) 
sl@0
   656
			return -1;
sl@0
   657
		else if (len1 > len2) 
sl@0
   658
			return 1;
sl@0
   659
		else 
sl@0
   660
			return 0;
sl@0
   661
	} 
sl@0
   662
	else
sl@0
   663
		return ret;
sl@0
   664
sl@0
   665
}
sl@0
   666
sl@0
   667
int _Locale_strwcmp(L_collate_t* lcol,
sl@0
   668
                     const wchar_t* pStr1, size_t len1,
sl@0
   669
                     const wchar_t* pStr2, size_t len2) 
sl@0
   670
{
sl@0
   671
	wchar_t *ptempStr1 = NULL, *ptempStr2 = NULL;
sl@0
   672
	int tempLen1,tempLen2;
sl@0
   673
sl@0
   674
	tempLen1 = _Locale_strwxfrm(lcol, NULL,0,pStr1,len1);
sl@0
   675
	tempLen2 = _Locale_strwxfrm(lcol, NULL,0,pStr2,len2);
sl@0
   676
	ptempStr1 = (wchar_t*) new wchar_t[tempLen1+1];
sl@0
   677
	ptempStr2 = (wchar_t*) new wchar_t[tempLen2+1];
sl@0
   678
	int ret;
sl@0
   679
	int minN = tempLen1 < tempLen2 ? tempLen1 : tempLen2;
sl@0
   680
	setlocale(LC_COLLATE, lcol->name);
sl@0
   681
	_Locale_strwxfrm(lcol, ptempStr1,tempLen1+1,pStr1,len1);
sl@0
   682
	_Locale_strwxfrm(lcol, ptempStr2,tempLen2+1,pStr2,len2);
sl@0
   683
	ret = wcsncmp(ptempStr1, ptempStr2, minN);
sl@0
   684
	
sl@0
   685
	delete [] ptempStr1;
sl@0
   686
	delete [] ptempStr2;
sl@0
   687
	
sl@0
   688
	if (ret == 0) 
sl@0
   689
	{
sl@0
   690
		if (len1 < len2) 
sl@0
   691
			return -1;
sl@0
   692
		else if (len1 > len2) 
sl@0
   693
			return 1;
sl@0
   694
		else 
sl@0
   695
			return 0;
sl@0
   696
	} 
sl@0
   697
	else
sl@0
   698
		return ret;	
sl@0
   699
}
sl@0
   700
sl@0
   701
size_t _Locale_strxfrm(L_collate_t* lcol,
sl@0
   702
                        char* pDestStr, size_t destLen,
sl@0
   703
                        const char* pSrcStr, size_t srcLen) 
sl@0
   704
{
sl@0
   705
	size_t n;
sl@0
   706
	setlocale(LC_COLLATE, lcol->name);
sl@0
   707
sl@0
   708
	char* ptemp = (char*) new char[srcLen+1];
sl@0
   709
	if(ptemp == NULL)
sl@0
   710
		return 0;
sl@0
   711
	strncpy(ptemp, pSrcStr, srcLen);
sl@0
   712
	*(ptemp + srcLen) = 0;
sl@0
   713
	
sl@0
   714
	n = strxfrm(pDestStr, ptemp, destLen);
sl@0
   715
	
sl@0
   716
	delete []ptemp;
sl@0
   717
	
sl@0
   718
	if ((pDestStr == NULL) || (destLen ==0) )
sl@0
   719
		return n;
sl@0
   720
	else if(n > destLen)
sl@0
   721
		return (size_t)-1;
sl@0
   722
	
sl@0
   723
	pDestStr[n] = 0;
sl@0
   724
	return n;
sl@0
   725
}
sl@0
   726
sl@0
   727
size_t _Locale_strwxfrm(L_collate_t* lcol,
sl@0
   728
                          wchar_t* pDestStr, size_t destLen,
sl@0
   729
                          const wchar_t* pSrcStr, size_t srcLen)
sl@0
   730
{
sl@0
   731
	size_t n;
sl@0
   732
	setlocale(LC_COLLATE, lcol->name);
sl@0
   733
	wchar_t* ptemp = (wchar_t*) new wchar_t[srcLen+1];
sl@0
   734
	if(ptemp == NULL)
sl@0
   735
		return 0;
sl@0
   736
	wcsncpy(ptemp, pSrcStr, srcLen);
sl@0
   737
	*(ptemp+srcLen) = 0;
sl@0
   738
	n = wcsxfrm(pDestStr, ptemp, destLen);
sl@0
   739
	delete []ptemp;
sl@0
   740
	if ((pDestStr == NULL) || (destLen ==0) )
sl@0
   741
		return n;
sl@0
   742
	else if(n > destLen)
sl@0
   743
		return (size_t)-1;
sl@0
   744
	
sl@0
   745
	pDestStr[n] = 0;
sl@0
   746
	return n;
sl@0
   747
}
sl@0
   748
sl@0
   749
/* Numeric */
sl@0
   750
sl@0
   751
char _Locale_decimal_point(L_numeric_t* lnum)
sl@0
   752
{  	
sl@0
   753
 	return lnum->decimal_point[0];
sl@0
   754
}
sl@0
   755
 
sl@0
   756
char _Locale_thousands_sep(L_numeric_t* lnum) 
sl@0
   757
{  	 	
sl@0
   758
 	return lnum->thousands_sep[0]; 
sl@0
   759
}
sl@0
   760
const char* _Locale_grouping(L_numeric_t*lnum) 
sl@0
   761
{  	 	
sl@0
   762
 	return lnum->grouping;
sl@0
   763
}
sl@0
   764
sl@0
   765
const char * _Locale_true(L_numeric_t * /*lnum*/)  
sl@0
   766
{ 
sl@0
   767
 	const char* __true_name="true"; //glib and NT doing the same	
sl@0
   768
 	return __true_name; 
sl@0
   769
}
sl@0
   770
 
sl@0
   771
const char * _Locale_false(L_numeric_t * /*lnum*/) 
sl@0
   772
{
sl@0
   773
 	const char* __false_name="false"; //glib and NT doing the same 	
sl@0
   774
 	return __false_name;
sl@0
   775
}
sl@0
   776
sl@0
   777
sl@0
   778
/* Monetary */
sl@0
   779
sl@0
   780
const char* _Locale_int_curr_symbol(L_monetary_t * lmon)
sl@0
   781
{  	 	
sl@0
   782
 	return lmon->int_curr_symbol;
sl@0
   783
}
sl@0
   784
 
sl@0
   785
const char* _Locale_currency_symbol(L_monetary_t * lmon)
sl@0
   786
{  	 	
sl@0
   787
 	return lmon->curr_symbol;
sl@0
   788
}
sl@0
   789
 
sl@0
   790
char _Locale_mon_decimal_point(L_monetary_t * lmon)
sl@0
   791
{ 
sl@0
   792
 	return lmon->decimal_point[0];
sl@0
   793
}
sl@0
   794
 
sl@0
   795
char _Locale_mon_thousands_sep(L_monetary_t * lmon)
sl@0
   796
{  	 	
sl@0
   797
 	return lmon->thousands_sep[0];
sl@0
   798
}
sl@0
   799
 
sl@0
   800
const char* _Locale_mon_grouping(L_monetary_t * lmon)
sl@0
   801
{  	 	
sl@0
   802
 	return lmon->grouping;
sl@0
   803
}
sl@0
   804
 
sl@0
   805
const char* _Locale_positive_sign(L_monetary_t * lmon)
sl@0
   806
{  	 	
sl@0
   807
 	return lmon->positive_sign;
sl@0
   808
}
sl@0
   809
 
sl@0
   810
const char* _Locale_negative_sign(L_monetary_t * lmon)
sl@0
   811
{  	 	
sl@0
   812
 	return lmon->negative_sign;
sl@0
   813
}
sl@0
   814
 
sl@0
   815
char _Locale_int_frac_digits(L_monetary_t * lmon)
sl@0
   816
{  	 	
sl@0
   817
 	return lmon->int_frac_digits;
sl@0
   818
}
sl@0
   819
 
sl@0
   820
char _Locale_frac_digits(L_monetary_t * lmon)
sl@0
   821
{  	 	
sl@0
   822
 	return lmon->frac_digits;
sl@0
   823
}
sl@0
   824
 
sl@0
   825
int _Locale_p_cs_precedes(L_monetary_t * lmon)
sl@0
   826
{ 
sl@0
   827
 	struct lconv* plconv;
sl@0
   828
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   829
 	plconv = localeconv(); 	 	
sl@0
   830
 	return plconv->p_cs_precedes;
sl@0
   831
}
sl@0
   832
 
sl@0
   833
int _Locale_p_sep_by_space(L_monetary_t * lmon)
sl@0
   834
{ 
sl@0
   835
 	struct lconv* plconv;
sl@0
   836
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   837
 	plconv = localeconv(); 		 	
sl@0
   838
 	return plconv->p_sep_by_space;
sl@0
   839
}
sl@0
   840
 
sl@0
   841
int _Locale_p_sign_posn(L_monetary_t * lmon)
sl@0
   842
{ 
sl@0
   843
	struct lconv* plconv;
sl@0
   844
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   845
 	plconv = localeconv(); 	 	 	
sl@0
   846
 	return plconv->p_sign_posn;
sl@0
   847
}
sl@0
   848
 
sl@0
   849
int _Locale_n_cs_precedes(L_monetary_t * lmon)
sl@0
   850
{ 
sl@0
   851
	struct lconv* plconv;
sl@0
   852
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   853
 	plconv = localeconv(); 	
sl@0
   854
 	return plconv->n_cs_precedes;
sl@0
   855
}
sl@0
   856
 
sl@0
   857
int _Locale_n_sep_by_space(L_monetary_t * lmon)
sl@0
   858
{ 
sl@0
   859
	struct lconv* plconv;
sl@0
   860
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   861
 	plconv = localeconv(); 	 	 	 	
sl@0
   862
 	return plconv->n_sep_by_space; 
sl@0
   863
}
sl@0
   864
 
sl@0
   865
int _Locale_n_sign_posn(L_monetary_t * lmon)
sl@0
   866
{ 
sl@0
   867
 	struct lconv* plconv;
sl@0
   868
 	setlocale(LC_MONETARY, lmon->name);
sl@0
   869
 	plconv = localeconv(); 	
sl@0
   870
 	return plconv->n_sign_posn; 
sl@0
   871
}
sl@0
   872
sl@0
   873
/* Time */
sl@0
   874
const char * _Locale_full_monthname(L_time_t * ltime, int month)
sl@0
   875
{ 	 	
sl@0
   876
 	return ltime->month[month];
sl@0
   877
}
sl@0
   878
 
sl@0
   879
const char * _Locale_abbrev_monthname(L_time_t * ltime, int month)
sl@0
   880
{ 	 	
sl@0
   881
 	return ltime->abbrev_month[month];
sl@0
   882
}
sl@0
   883
 
sl@0
   884
const char * _Locale_full_dayofweek(L_time_t * ltime, int day)
sl@0
   885
{ 	 	
sl@0
   886
 	return ltime->dayofweek[day];
sl@0
   887
}
sl@0
   888
 
sl@0
   889
const char * _Locale_abbrev_dayofweek(L_time_t * ltime, int day)
sl@0
   890
{ 	 	
sl@0
   891
 	return ltime->abbrev_dayofweek[day];
sl@0
   892
}
sl@0
   893
sl@0
   894
const char* _Locale_d_t_fmt(L_time_t* ltime)    
sl@0
   895
{ 
sl@0
   896
 	setlocale(LC_TIME, ltime->name);
sl@0
   897
 	return nl_langinfo(D_T_FMT);
sl@0
   898
}
sl@0
   899
 
sl@0
   900
const char* _Locale_d_fmt(L_time_t* ltime)
sl@0
   901
{
sl@0
   902
 	setlocale(LC_TIME, ltime->name); 
sl@0
   903
	return nl_langinfo(D_FMT);
sl@0
   904
}
sl@0
   905
 
sl@0
   906
const char* _Locale_t_fmt(L_time_t* ltime)
sl@0
   907
{ 
sl@0
   908
 	setlocale(LC_TIME, ltime->name);
sl@0
   909
 	return nl_langinfo(T_FMT);
sl@0
   910
}
sl@0
   911
 
sl@0
   912
const char* _Locale_long_d_t_fmt(L_time_t* ltime)
sl@0
   913
{ 
sl@0
   914
 	setlocale(LC_TIME, ltime->name);
sl@0
   915
 	return nl_langinfo(D_T_FMT); 
sl@0
   916
}
sl@0
   917
 
sl@0
   918
const char* _Locale_long_d_fmt(L_time_t* ltime)
sl@0
   919
{ 
sl@0
   920
	setlocale(LC_TIME, ltime->name);
sl@0
   921
	return nl_langinfo(D_FMT); 
sl@0
   922
}
sl@0
   923
sl@0
   924
const char* _Locale_am_str(L_time_t* ltime)     
sl@0
   925
{ 
sl@0
   926
	setlocale(LC_TIME, ltime->name);
sl@0
   927
	return nl_langinfo(AM_STR);
sl@0
   928
}
sl@0
   929
sl@0
   930
const char* _Locale_pm_str(L_time_t* ltime)     
sl@0
   931
{ 
sl@0
   932
	setlocale(LC_TIME, ltime->name);
sl@0
   933
	return nl_langinfo(PM_STR);
sl@0
   934
}
sl@0
   935
sl@0
   936
const char* _Locale_t_fmt_ampm(L_time_t* ltime) 
sl@0
   937
{ 
sl@0
   938
	setlocale(LC_TIME, ltime->name);
sl@0
   939
	return nl_langinfo(T_FMT_AMPM);
sl@0
   940
}
sl@0
   941
sl@0
   942
/* Messages */ 
sl@0
   943
 
sl@0
   944
nl_catd_type _Locale_catopen(struct _Locale_messages* lmessage, const char* catalogName)
sl@0
   945
{ 
sl@0
   946
   lmessage->domain = __getString((char*)catalogName);
sl@0
   947
   return 1;  
sl@0
   948
}
sl@0
   949
 
sl@0
   950
void _Locale_catclose(struct _Locale_messages* lmessage, nl_catd_type /*catalog_desc*/) 
sl@0
   951
{
sl@0
   952
 	delete(lmessage->domain);
sl@0
   953
 	lmessage->domain = NULL;
sl@0
   954
}
sl@0
   955
sl@0
   956
const char* _Locale_catgets(struct _Locale_messages* lmessage, nl_catd_type /*catalog_desc*/,
sl@0
   957
                             int /*set*/, int /*message*/,
sl@0
   958
                             const char * /*dfault*/)
sl@0
   959
{ 
sl@0
   960
 	char* locale = setlocale(LC_ALL, lmessage->name);
sl@0
   961
#ifdef _MESSAGE_CATALOG_ 	
sl@0
   962
 	textdomain(lmessage->domain);	
sl@0
   963
	
sl@0
   964
 	return gettext(dfault);
sl@0
   965
#else
sl@0
   966
	return NULL;
sl@0
   967
#endif
sl@0
   968
sl@0
   969
}
sl@0
   970