44 *
55 * Portions Copyright (c) 2002-2010, PostgreSQL Global Development Group
66 *
7- * $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.52 2010/02/27 20:16:17 momjian Exp $
7+ * $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.53 2010/02/27 20:20:44 momjian Exp $
88 *
99 *-----------------------------------------------------------------------
1010 */
@@ -386,70 +386,6 @@ free_struct_lconv(struct lconv * s)
386386 free (s -> positive_sign );
387387}
388388
389- #ifdef WIN32
390- static char * db_strdup (const char * item , const char * str )
391- {
392- int db_encoding = GetDatabaseEncoding ();
393- size_t wchars , ilen , wclen , dstlen ;
394- int utflen , bytes_per_char ;
395- wchar_t * wbuf ;
396- char * dst ;
397-
398- if (!str [0 ])
399- return strdup (str );
400- ilen = strlen (str ) + 1 ;
401- wclen = ilen * sizeof (wchar_t );
402- wbuf = (wchar_t * ) palloc (wclen );
403-
404- /* convert multi-byte string to a wide-character string */
405- wchars = mbstowcs (wbuf , str , ilen );
406- if (wchars == (size_t ) -1 )
407- elog (ERROR ,
408- "could not convert string to wide characters: error %lu" , GetLastError ());
409-
410- /* allocate target string */
411- bytes_per_char = pg_encoding_max_length (PG_UTF8 );
412- if (pg_encoding_max_length (db_encoding ) > bytes_per_char )
413- bytes_per_char = pg_encoding_max_length (db_encoding );
414- dstlen = wchars * bytes_per_char + 1 ;
415- if ((dst = malloc (dstlen )) == NULL )
416- elog (ERROR , "could not allocate a destination buffer" );
417-
418- /* Convert wide string to UTF8 */
419- utflen = WideCharToMultiByte (CP_UTF8 , 0 , wbuf , wchars , dst , dstlen , NULL , NULL );
420- if (utflen == 0 )
421- elog (ERROR ,
422- "could not convert string %04x to UTF-8: error %lu" , wbuf [0 ], GetLastError ());
423- pfree (wbuf );
424-
425- dst [utflen ] = '\0' ;
426- if (db_encoding != PG_UTF8 )
427- {
428- PG_TRY ();
429- {
430- char * convstr = pg_do_encoding_conversion (dst , utflen , PG_UTF8 , db_encoding );
431- if (dst != convstr )
432- {
433- strlcpy (dst , convstr , dstlen );
434- pfree (convstr );
435- }
436- }
437- PG_CATCH ();
438- {
439- FlushErrorState ();
440- dst [0 ] = '\0' ;
441- }
442- PG_END_TRY ();
443- }
444-
445- return dst ;
446- }
447- #else
448- static char * db_strdup (const char * item , const char * str )
449- {
450- return strdup (str );
451- }
452- #endif /* WIN32 */
453389
454390/*
455391 * Return the POSIX lconv struct (contains number/money formatting
@@ -462,9 +398,6 @@ PGLC_localeconv(void)
462398 struct lconv * extlconv ;
463399 char * save_lc_monetary ;
464400 char * save_lc_numeric ;
465- #ifdef WIN32
466- char * save_lc_ctype = NULL ;
467- #endif
468401
469402 /* Did we do it already? */
470403 if (CurrentLocaleConvValid )
@@ -480,83 +413,30 @@ PGLC_localeconv(void)
480413 if (save_lc_numeric )
481414 save_lc_numeric = pstrdup (save_lc_numeric );
482415
483- #ifdef WIN32
484- /*
485- * WIN32 returns an inaccurately encoded symbol, e.g. Euro,
486- * when the LC_CTYPE does not match the numeric or monetary
487- * lc types, so we switch to matching LC_CTYPEs as we access them.
488- */
489-
490- if ((save_lc_ctype = setlocale (LC_CTYPE , NULL )) != NULL )
491- {
492- /* Save for later restore */
493- save_lc_ctype = pstrdup (save_lc_ctype );
494-
495- /* Set LC_CTYPE to match LC_MONETARY? */
496- if (pg_strcasecmp (save_lc_ctype , locale_monetary ) != 0 )
497- setlocale (LC_CTYPE , locale_monetary );
498- }
499- else
500- /* LC_CTYPE not set, unconditionally set it */
501- setlocale (LC_CTYPE , locale_monetary );
502-
503- /*
504- * If LC_NUMERIC and LC_MONETARY match, we can set it now and
505- * avoid a second localeconv() call.
506- */
507- if (pg_strcasecmp (locale_numeric , locale_monetary ) == 0 )
508- #else
509- setlocale (LC_NUMERIC , locale_numeric );
510- #endif
511-
512416 setlocale (LC_MONETARY , locale_monetary );
513- /*
514- * Get formatting information for LC_MONETARY, and LC_NUMERIC if they
515- * are the same.
516- */
417+ setlocale (LC_NUMERIC , locale_numeric );
418+
419+ /* Get formatting information */
517420 extlconv = localeconv ();
518421
519422 /*
520- * Must copy all values since restoring internal settings might overwrite
423+ * Must copy all values since restoring internal settings may overwrite
521424 * localeconv()'s results.
522425 */
523426 CurrentLocaleConv = * extlconv ;
524-
525- /* The first argument of db_strdup() is only used on WIN32 */
526- CurrentLocaleConv .currency_symbol = db_strdup ("currency_symbol" , extlconv -> currency_symbol );
527- CurrentLocaleConv .int_curr_symbol = db_strdup ("int_curr_symbol" , extlconv -> int_curr_symbol );
528- CurrentLocaleConv .mon_decimal_point = db_strdup ("mon_decimal_point" , extlconv -> mon_decimal_point );
427+ CurrentLocaleConv .currency_symbol = strdup (extlconv -> currency_symbol );
428+ CurrentLocaleConv .decimal_point = strdup (extlconv -> decimal_point );
429+ CurrentLocaleConv .grouping = strdup (extlconv -> grouping );
430+ CurrentLocaleConv .thousands_sep = strdup (extlconv -> thousands_sep );
431+ CurrentLocaleConv .int_curr_symbol = strdup (extlconv -> int_curr_symbol );
432+ CurrentLocaleConv .mon_decimal_point = strdup (extlconv -> mon_decimal_point );
529433 CurrentLocaleConv .mon_grouping = strdup (extlconv -> mon_grouping );
530- CurrentLocaleConv .mon_thousands_sep = db_strdup ( "mon_thousands_sep" , extlconv -> mon_thousands_sep );
531- CurrentLocaleConv .negative_sign = db_strdup ( "negative_sign" , extlconv -> negative_sign );
532- CurrentLocaleConv .positive_sign = db_strdup ( "positive_sign" , extlconv -> positive_sign );
434+ CurrentLocaleConv .mon_thousands_sep = strdup ( extlconv -> mon_thousands_sep );
435+ CurrentLocaleConv .negative_sign = strdup ( extlconv -> negative_sign );
436+ CurrentLocaleConv .positive_sign = strdup ( extlconv -> positive_sign );
533437 CurrentLocaleConv .n_sign_posn = extlconv -> n_sign_posn ;
534438
535- #ifdef WIN32
536- /* Do we need to change LC_CTYPE to match LC_NUMERIC? */
537- if (pg_strcasecmp (locale_numeric , locale_monetary ) != 0 )
538- {
539- setlocale (LC_CTYPE , locale_numeric );
540- setlocale (LC_NUMERIC , locale_numeric );
541- /* Get formatting information for LC_NUMERIC */
542- extlconv = localeconv ();
543- }
544- #endif
545-
546- CurrentLocaleConv .decimal_point = db_strdup ("decimal_point" , extlconv -> decimal_point );
547- CurrentLocaleConv .grouping = strdup (extlconv -> grouping );
548- CurrentLocaleConv .thousands_sep = db_strdup ("thousands_sep" , extlconv -> thousands_sep );
549-
550- /*
551- * Restore internal settings
552- */
553- #ifdef WIN32
554- if (save_lc_ctype )
555- {
556- setlocale (LC_CTYPE , save_lc_ctype );
557- pfree (save_lc_ctype );
558- }
559- #endif
439+ /* Try to restore internal settings */
560440 if (save_lc_monetary )
561441 {
562442 setlocale (LC_MONETARY , save_lc_monetary );
0 commit comments