standards/172215: localeconv() grouping appears not to match POSIX

Ed Maste emaste at FreeBSD.org
Mon Oct 1 15:50:02 UTC 2012


>Number:         172215
>Category:       standards
>Synopsis:       localeconv() grouping appears not to match POSIX
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-standards
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 01 15:50:02 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Ed Maste
>Release:        FreeBSD 9.0-STABLE i386
>Organization:
FreeBSD
>Environment:
System: FreeBSD freefall.freebsd.org 9.0-STABLE FreeBSD 9.0-STABLE #6 r235139: Tue May 8 21:19:03 UTC 2012 simon at freefall.freebsd.org:/usr/obj/usr/src/sys/FREEFALL i386

>Description:

I can find two references to the expected return from localeconv() for
grouping / mon_grouping.  First, the behaviour in SUSv2
http://pubs.opengroup.org/onlinepubs/007908799/xbd/locale.html matches what
FreeBSD currently does -- { CHAR_MAX, '\0' }:

  The third column shows the equivalent string in the ISO C standard that
  would be used by the localeconv() function to accommodate this grouping

  mon_grouping   Formatted Value   ISO C String
  -1             123456789         "\177" 

In 1003.1 (2004) for POSIX Locale
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html
it suggests that the return should be empty string:

               langinfo   POSIX Locale   localeconv()   localedef
Item           Constant      Value           Value        Value
mon_grouping       -          N/A             ""           -1

This came up on the gnulib mailing list recently, which has a testcase
for localeconv that contains #ifdef'd-out cases for l->grouping and
l->mon_gropuing on FreeBSD.

http://lists.gnu.org/archive/html/bug-gnulib/2012-08/msg00142.html

>How-To-Repeat:
	
>Fix:

I suspect this could be accomplished with the following patch:

Index: lib/libc/locale/fix_grouping.c
===================================================================
--- fix_grouping.c      (revision 240919)
+++ fix_grouping.c      (working copy)
@@ -31,7 +31,7 @@
 #include <limits.h>
 #include <stddef.h>
 
-static const char nogrouping[] = { CHAR_MAX, '\0' };
+static const char nogrouping[] = { '\0' };
 
 /*
  * Internal helper used to convert grouping sequences from string

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-standards mailing list