This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Exclude undefined hash elements from localeconv()
authorKarl Williamson <khw@cpan.org>
Fri, 16 May 2014 00:30:37 +0000 (18:30 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 5 Jun 2014 17:23:00 +0000 (11:23 -0600)
A given platform may not have all the localeconv elements available, or
Perl may be compiled to not use them.  Don't define hash elements for
the missing ones.

ext/POSIX/POSIX.xs
pod/perldelta.pod
pod/perllocale.pod

index 758a20f..059f660 100644 (file)
@@ -291,26 +291,31 @@ struct lconv_offset {
 };
 
 const struct lconv_offset lconv_strings[] = {
+#ifdef USE_LOCALE_NUMERIC
     {"decimal_point",     STRUCT_OFFSET(struct lconv, decimal_point)},
     {"thousands_sep",     STRUCT_OFFSET(struct lconv, thousands_sep)},
-#ifndef NO_LOCALECONV_GROUPING
+#  ifndef NO_LOCALECONV_GROUPING
     {"grouping",          STRUCT_OFFSET(struct lconv, grouping)},
+#  endif
 #endif
+#ifdef USE_LOCALE_MONETARY
     {"int_curr_symbol",   STRUCT_OFFSET(struct lconv, int_curr_symbol)},
     {"currency_symbol",   STRUCT_OFFSET(struct lconv, currency_symbol)},
     {"mon_decimal_point", STRUCT_OFFSET(struct lconv, mon_decimal_point)},
-#ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
+#  ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
     {"mon_thousands_sep", STRUCT_OFFSET(struct lconv, mon_thousands_sep)},
-#endif
-#ifndef NO_LOCALECONV_MON_GROUPING
+#  endif
+#  ifndef NO_LOCALECONV_MON_GROUPING
     {"mon_grouping",      STRUCT_OFFSET(struct lconv, mon_grouping)},
-#endif
+#  endif
     {"positive_sign",     STRUCT_OFFSET(struct lconv, positive_sign)},
     {"negative_sign",     STRUCT_OFFSET(struct lconv, negative_sign)},
+#endif
     {NULL, 0}
 };
 
 const struct lconv_offset lconv_integers[] = {
+#ifdef USE_LOCALE_MONETARY
     {"int_frac_digits",   STRUCT_OFFSET(struct lconv, int_frac_digits)},
     {"frac_digits",       STRUCT_OFFSET(struct lconv, frac_digits)},
     {"p_cs_precedes",     STRUCT_OFFSET(struct lconv, p_cs_precedes)},
@@ -319,6 +324,7 @@ const struct lconv_offset lconv_integers[] = {
     {"n_sep_by_space",    STRUCT_OFFSET(struct lconv, n_sep_by_space)},
     {"p_sign_posn",       STRUCT_OFFSET(struct lconv, p_sign_posn)},
     {"n_sign_posn",       STRUCT_OFFSET(struct lconv, n_sign_posn)},
+#endif
     {NULL, 0}
 };
 
index dcd656d..7d82f2d 100644 (file)
@@ -497,6 +497,14 @@ destroy perl engines within the same process.
 C<POSIX::localeconv()> now returns the data for the program's underlying
 locale even when called from outside the scope of S<C<use locale>>.
 
+=item *
+
+C<POSIX::localeconv()> now works properly on platforms which don't have
+C<LC_NUMERIC> and/or C<LC_MONETARY>, or for which Perl has been compiled
+to disregard either or both of these locale categories.  In such
+circumstances, there are now no entries for the corresponding values in
+the hash returned by C<localeconv()>.
+
 =back
 
 =head1 Known Problems
index 3a5c811..ac96801 100644 (file)
@@ -684,6 +684,10 @@ parameters as integers correctly formatted in the current locale:
     }
     print "\n";
 
+Note that if the platform doesn't have C<LC_NUMERIC> and/or
+C<LC_MONETARY> available or enabled, the corresponding elements of the
+hash will be missing.
+
 =head2 I18N::Langinfo
 
 Another interface for querying locale-dependent information is the