locale: fix display of "grouping" and "mon_grouping" values

The "grouping" and "mon_grouping" values are arrays of one-byte
integers, not arrays of ASCII characters.  Display them in a format
similar to GNU and MacOS.

MFC after:	3 days
Sponsored by:	Dell EMC
This commit is contained in:
Eric van Gyzen 2016-11-19 02:09:58 +00:00
parent fe75b45213
commit 54068d184c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=308824

View file

@ -50,6 +50,7 @@
#include "setlocale.h"
/* Local prototypes */
char *format_grouping(const char *);
void init_locales_list(void);
void list_charmaps(void);
void list_locales(void);
@ -488,6 +489,34 @@ showlocale(void)
printf("LC_ALL=%s\n", vval);
}
char *
format_grouping(const char *binary)
{
static char rval[64];
const char *cp;
size_t len;
rval[0] = '\0';
for (cp = binary; *cp != '\0'; ++cp) {
char group[sizeof("127;")];
snprintf(group, sizeof(group), "%hhd;", *cp);
len = strlcat(rval, group, sizeof(rval));
if (len >= sizeof(rval)) {
len = sizeof(rval) - 1;
break;
}
if (*cp == CHAR_MAX) {
break;
}
}
/* Remove the trailing ';'. */
rval[len - 1] = '\0';
return (rval);
}
/*
* keyword value lookup helper (via localeconv())
*/
@ -501,7 +530,7 @@ kwval_lconv(int id)
lc = localeconv();
switch (id) {
case KW_GROUPING:
rval = lc->grouping;
rval = format_grouping(lc->grouping);
break;
case KW_INT_CURR_SYMBOL:
rval = lc->int_curr_symbol;
@ -516,7 +545,7 @@ kwval_lconv(int id)
rval = lc->mon_thousands_sep;
break;
case KW_MON_GROUPING:
rval = lc->mon_grouping;
rval = format_grouping(lc->mon_grouping);
break;
case KW_POSITIVE_SIGN:
rval = lc->positive_sign;