Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Sep 2019 15:39:28 +0000 (UTC)
From:      Yuri Pankov <yuripv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r352214 - in head/usr.bin/locale: . tests
Message-ID:  <201909111539.x8BFdSHo042554@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yuripv
Date: Wed Sep 11 15:39:28 2019
New Revision: 352214
URL: https://svnweb.freebsd.org/changeset/base/352214

Log:
  locale: more output fixes
  
  - make abday, day, abmon, mon, am_pm output quoting match linux
  - workaround localeconv() issue for mon_grouping and grouping (PR172215)
  - for other values not available in default locale, output -1 instead of
    127 (CHAR_MAX) as returned by localeconv()
  
  With these changes, output of `locale` and `locale -k` for all keywords
  specified by POSIX exactly matches the linux one.
  
  PR:		237752
  Reviewed by:	bapt
  Differential Revision:	https://reviews.freebsd.org/D21599

Added:
  head/usr.bin/locale/tests/no_flags_posix_messages.out   (contents, props changed)
  head/usr.bin/locale/tests/no_flags_posix_monetary.out   (contents, props changed)
  head/usr.bin/locale/tests/no_flags_posix_numeric.out   (contents, props changed)
  head/usr.bin/locale/tests/no_flags_posix_time.out   (contents, props changed)
Modified:
  head/usr.bin/locale/locale.c
  head/usr.bin/locale/tests/Makefile
  head/usr.bin/locale/tests/k_flag_posix_monetary.out
  head/usr.bin/locale/tests/k_flag_posix_numeric.out
  head/usr.bin/locale/tests/k_flag_posix_time.out
  head/usr.bin/locale/tests/locale_test.sh

Modified: head/usr.bin/locale/locale.c
==============================================================================
--- head/usr.bin/locale/locale.c	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/locale.c	Wed Sep 11 15:39:28 2019	(r352214)
@@ -54,7 +54,7 @@
 #include "setlocale.h"
 
 /* Local prototypes */
-char	*format_grouping(const char *);
+char	*format_grouping(char *);
 void	init_locales_list(void);
 void	list_charmaps(void);
 void	list_locales(void);
@@ -119,6 +119,12 @@ enum {
 };
 
 enum {
+	TYPE_NUM,
+	TYPE_STR,
+	TYPE_UNQ
+};
+
+enum {
 	SRC_LINFO,
 	SRC_LCONV,
 	SRC_LTIME
@@ -126,218 +132,218 @@ enum {
 
 static const struct _kwinfo {
 	const char	*name;
-	int		isstr;		/* true - string, false - number */
+	int		type;
 	int		catid;		/* LC_* */
 	int		source;
 	int		value_ref;
 	const char	*comment;
 } kwinfo [] = {
-	{ "charmap",		1, LC_CTYPE,	SRC_LINFO,
+	{ "charmap",		TYPE_STR, LC_CTYPE,	SRC_LINFO,
 	  CODESET, "" },					/* hack */
 
 	/* LC_MONETARY - POSIX */
-	{ "int_curr_symbol",	1, LC_MONETARY,	SRC_LCONV,
+	{ "int_curr_symbol",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_CURR_SYMBOL, "" },
-	{ "currency_symbol",	1, LC_MONETARY,	SRC_LCONV,
+	{ "currency_symbol",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_CURRENCY_SYMBOL, "" },
-	{ "mon_decimal_point",	1, LC_MONETARY,	SRC_LCONV,
+	{ "mon_decimal_point",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_MON_DECIMAL_POINT, "" },
-	{ "mon_thousands_sep",	1, LC_MONETARY,	SRC_LCONV,
+	{ "mon_thousands_sep",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_MON_THOUSANDS_SEP, "" },
-	{ "mon_grouping",	1, LC_MONETARY,	SRC_LCONV,
+	{ "mon_grouping",	TYPE_UNQ, LC_MONETARY,	SRC_LCONV,
 	  KW_MON_GROUPING, "" },
-	{ "positive_sign",	1, LC_MONETARY,	SRC_LCONV,
+	{ "positive_sign",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_POSITIVE_SIGN, "" },
-	{ "negative_sign",	1, LC_MONETARY,	SRC_LCONV,
+	{ "negative_sign",	TYPE_STR, LC_MONETARY,	SRC_LCONV,
 	  KW_NEGATIVE_SIGN, "" },
-	{ "int_frac_digits",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_frac_digits",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_FRAC_DIGITS, "" },
-	{ "frac_digits",	0, LC_MONETARY,	SRC_LCONV,
+	{ "frac_digits",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_FRAC_DIGITS, "" },
-	{ "p_cs_precedes",	0, LC_MONETARY,	SRC_LCONV,
+	{ "p_cs_precedes",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_P_CS_PRECEDES, "" },
-	{ "p_sep_by_space",	0, LC_MONETARY,	SRC_LCONV,
+	{ "p_sep_by_space",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_P_SEP_BY_SPACE, "" },
-	{ "n_cs_precedes",	0, LC_MONETARY,	SRC_LCONV,
+	{ "n_cs_precedes",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_N_CS_PRECEDES, "" },
-	{ "n_sep_by_space",	0, LC_MONETARY,	SRC_LCONV,
+	{ "n_sep_by_space",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_N_SEP_BY_SPACE, "" },
-	{ "p_sign_posn",	0, LC_MONETARY,	SRC_LCONV,
+	{ "p_sign_posn",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_P_SIGN_POSN, "" },
-	{ "n_sign_posn",	0, LC_MONETARY,	SRC_LCONV,
+	{ "n_sign_posn",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_N_SIGN_POSN, "" },
-	{ "int_p_cs_precedes",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_p_cs_precedes",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_P_CS_PRECEDES, "" },
-	{ "int_p_sep_by_space",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_p_sep_by_space",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_P_SEP_BY_SPACE, "" },
-	{ "int_n_cs_precedes",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_n_cs_precedes",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_N_CS_PRECEDES, "" },
-	{ "int_n_sep_by_space",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_n_sep_by_space",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_N_SEP_BY_SPACE, "" },
-	{ "int_p_sign_posn",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_p_sign_posn",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_P_SIGN_POSN, "" },
-	{ "int_n_sign_posn",	0, LC_MONETARY,	SRC_LCONV,
+	{ "int_n_sign_posn",	TYPE_NUM, LC_MONETARY,	SRC_LCONV,
 	  KW_INT_N_SIGN_POSN, "" },
 
 	/* LC_NUMERIC - POSIX */
-	{ "decimal_point",	1, LC_NUMERIC,	SRC_LINFO,
+	{ "decimal_point",	TYPE_STR, LC_NUMERIC,	SRC_LINFO,
 	  RADIXCHAR, "" },
-	{ "thousands_sep",	1, LC_NUMERIC,	SRC_LINFO,
+	{ "thousands_sep",	TYPE_STR, LC_NUMERIC,	SRC_LINFO,
 	  THOUSEP, "" },
-	{ "grouping",		1, LC_NUMERIC,	SRC_LCONV,
+	{ "grouping",		TYPE_UNQ, LC_NUMERIC,	SRC_LCONV,
 	  KW_GROUPING, "" },
 	/* LC_NUMERIC - local additions */
-	{ "radixchar",		1, LC_NUMERIC,	SRC_LINFO,
+	{ "radixchar",		TYPE_STR, LC_NUMERIC,	SRC_LINFO,
 	  RADIXCHAR, "Same as decimal_point (FreeBSD only)" },	/* compat */
-	{ "thousep",		1, LC_NUMERIC,	SRC_LINFO,
+	{ "thousep",		TYPE_STR, LC_NUMERIC,	SRC_LINFO,
 	  THOUSEP, "Same as thousands_sep (FreeBSD only)" },	/* compat */
 
 	/* LC_TIME - POSIX */
-	{ "abday",		1, LC_TIME,	SRC_LTIME,
+	{ "abday",		TYPE_STR, LC_TIME,	SRC_LTIME,
 	  KW_TIME_ABDAY, "" },
-	{ "day",		1, LC_TIME,	SRC_LTIME,
+	{ "day",		TYPE_STR, LC_TIME,	SRC_LTIME,
 	  KW_TIME_DAY, "" },
-	{ "abmon",		1, LC_TIME,	SRC_LTIME,
+	{ "abmon",		TYPE_STR, LC_TIME,	SRC_LTIME,
 	  KW_TIME_ABMON, "" },
-	{ "mon",		1, LC_TIME,	SRC_LTIME,
+	{ "mon",		TYPE_STR, LC_TIME,	SRC_LTIME,
 	  KW_TIME_MON, "" },
-	{ "d_t_fmt",		1, LC_TIME,	SRC_LINFO,
+	{ "d_t_fmt",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  D_T_FMT, "" },
-	{ "d_fmt",		1, LC_TIME,	SRC_LINFO,
+	{ "d_fmt",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  D_FMT, "" },
-	{ "t_fmt",		1, LC_TIME,	SRC_LINFO,
+	{ "t_fmt",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  T_FMT, "" },
-	{ "am_pm",		1, LC_TIME,	SRC_LTIME,
+	{ "am_pm",		TYPE_STR, LC_TIME,	SRC_LTIME,
 	  KW_TIME_AM_PM, "" },
-	{ "t_fmt_ampm",		1, LC_TIME,	SRC_LINFO,
+	{ "t_fmt_ampm",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  T_FMT_AMPM, "" },
-	{ "era",		1, LC_TIME,	SRC_LINFO,
+	{ "era",		TYPE_UNQ, LC_TIME,	SRC_LINFO,
 	  ERA, "(unavailable)" },
-	{ "era_d_fmt",		1, LC_TIME,	SRC_LINFO,
+	{ "era_d_fmt",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ERA_D_FMT, "(unavailable)" },
-	{ "era_d_t_fmt",	1, LC_TIME,	SRC_LINFO,
+	{ "era_d_t_fmt",	TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ERA_D_T_FMT, "(unavailable)" },
-	{ "era_t_fmt",		1, LC_TIME,	SRC_LINFO,
+	{ "era_t_fmt",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ERA_T_FMT, "(unavailable)" },
-	{ "alt_digits",		1, LC_TIME,	SRC_LINFO,
+	{ "alt_digits",		TYPE_UNQ, LC_TIME,	SRC_LINFO,
 	  ALT_DIGITS, "" },
 	/* LC_TIME - local additions */
-	{ "abday_1",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_1",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_1, "(FreeBSD only)" },
-	{ "abday_2",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_2",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_2, "(FreeBSD only)" },
-	{ "abday_3",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_3",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_3, "(FreeBSD only)" },
-	{ "abday_4",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_4",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_4, "(FreeBSD only)" },
-	{ "abday_5",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_5",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_5, "(FreeBSD only)" },
-	{ "abday_6",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_6",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_6, "(FreeBSD only)" },
-	{ "abday_7",		1, LC_TIME,	SRC_LINFO,
+	{ "abday_7",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABDAY_7, "(FreeBSD only)" },
-	{ "day_1",		1, LC_TIME,	SRC_LINFO,
+	{ "day_1",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_1, "(FreeBSD only)" },
-	{ "day_2",		1, LC_TIME,	SRC_LINFO,
+	{ "day_2",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_2, "(FreeBSD only)" },
-	{ "day_3",		1, LC_TIME,	SRC_LINFO,
+	{ "day_3",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_3, "(FreeBSD only)" },
-	{ "day_4",		1, LC_TIME,	SRC_LINFO,
+	{ "day_4",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_4, "(FreeBSD only)" },
-	{ "day_5",		1, LC_TIME,	SRC_LINFO,
+	{ "day_5",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_5, "(FreeBSD only)" },
-	{ "day_6",		1, LC_TIME,	SRC_LINFO,
+	{ "day_6",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_6, "(FreeBSD only)" },
-	{ "day_7",		1, LC_TIME,	SRC_LINFO,
+	{ "day_7",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  DAY_7, "(FreeBSD only)" },
-	{ "abmon_1",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_1",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_1, "(FreeBSD only)" },
-	{ "abmon_2",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_2",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_2, "(FreeBSD only)" },
-	{ "abmon_3",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_3",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_3, "(FreeBSD only)" },
-	{ "abmon_4",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_4",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_4, "(FreeBSD only)" },
-	{ "abmon_5",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_5",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_5, "(FreeBSD only)" },
-	{ "abmon_6",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_6",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_6, "(FreeBSD only)" },
-	{ "abmon_7",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_7",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_7, "(FreeBSD only)" },
-	{ "abmon_8",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_8",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_8, "(FreeBSD only)" },
-	{ "abmon_9",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_9",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_9, "(FreeBSD only)" },
-	{ "abmon_10",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_10",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_10, "(FreeBSD only)" },
-	{ "abmon_11",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_11",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_11, "(FreeBSD only)" },
-	{ "abmon_12",		1, LC_TIME,	SRC_LINFO,
+	{ "abmon_12",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ABMON_12, "(FreeBSD only)" },
-	{ "mon_1",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_1",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_1, "(FreeBSD only)" },
-	{ "mon_2",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_2",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_2, "(FreeBSD only)" },
-	{ "mon_3",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_3",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_3, "(FreeBSD only)" },
-	{ "mon_4",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_4",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_4, "(FreeBSD only)" },
-	{ "mon_5",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_5",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_5, "(FreeBSD only)" },
-	{ "mon_6",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_6",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_6, "(FreeBSD only)" },
-	{ "mon_7",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_7",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_7, "(FreeBSD only)" },
-	{ "mon_8",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_8",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_8, "(FreeBSD only)" },
-	{ "mon_9",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_9",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_9, "(FreeBSD only)" },
-	{ "mon_10",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_10",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_10, "(FreeBSD only)" },
-	{ "mon_11",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_11",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_11, "(FreeBSD only)" },
-	{ "mon_12",		1, LC_TIME,	SRC_LINFO,
+	{ "mon_12",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  MON_12, "(FreeBSD only)" },
-	{ "altmon_1",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_1",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_1, "(FreeBSD only)" },
-	{ "altmon_2",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_2",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_2, "(FreeBSD only)" },
-	{ "altmon_3",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_3",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_3, "(FreeBSD only)" },
-	{ "altmon_4",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_4",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_4, "(FreeBSD only)" },
-	{ "altmon_5",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_5",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_5, "(FreeBSD only)" },
-	{ "altmon_6",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_6",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_6, "(FreeBSD only)" },
-	{ "altmon_7",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_7",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_7, "(FreeBSD only)" },
-	{ "altmon_8",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_8",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_8, "(FreeBSD only)" },
-	{ "altmon_9",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_9",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_9, "(FreeBSD only)" },
-	{ "altmon_10",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_10",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_10, "(FreeBSD only)" },
-	{ "altmon_11",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_11",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_11, "(FreeBSD only)" },
-	{ "altmon_12",		1, LC_TIME,	SRC_LINFO,
+	{ "altmon_12",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  ALTMON_12, "(FreeBSD only)" },
-	{ "am_str",		1, LC_TIME,	SRC_LINFO,
+	{ "am_str",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  AM_STR, "(FreeBSD only)" },
-	{ "pm_str",		1, LC_TIME,	SRC_LINFO,
+	{ "pm_str",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  PM_STR, "(FreeBSD only)" },
-	{ "d_md_order",		1, LC_TIME,	SRC_LINFO,
+	{ "d_md_order",		TYPE_STR, LC_TIME,	SRC_LINFO,
 	  D_MD_ORDER, "(FreeBSD only)" },			/* local */
 
 	/* LC_MESSAGES - POSIX */
-	{ "yesexpr",		1, LC_MESSAGES, SRC_LINFO,
+	{ "yesexpr",		TYPE_STR, LC_MESSAGES, SRC_LINFO,
 	  YESEXPR, "" },
-	{ "noexpr",		1, LC_MESSAGES, SRC_LINFO,
+	{ "noexpr",		TYPE_STR, LC_MESSAGES, SRC_LINFO,
 	  NOEXPR, "" },
 	/* LC_MESSAGES - local additions */
-	{ "yesstr",		1, LC_MESSAGES, SRC_LINFO,
+	{ "yesstr",		TYPE_STR, LC_MESSAGES, SRC_LINFO,
 	  YESSTR, "(POSIX legacy)" },				/* compat */
-	{ "nostr",		1, LC_MESSAGES, SRC_LINFO,
+	{ "nostr",		TYPE_STR, LC_MESSAGES, SRC_LINFO,
 	  NOSTR, "(POSIX legacy)" }				/* compat */
 
 };
@@ -610,13 +616,20 @@ showlocale(void)
 }
 
 char *
-format_grouping(const char *binary)
+format_grouping(char *binary)
 {
 	static char rval[64];
 	const char *cp;
 	size_t roff;
 	int len;
 
+	/*
+	 * XXX This check will need to be modified if/when localeconv() is
+	 * fixed (PR172215).
+	 */
+	if (*binary == CHAR_MAX)
+		return (binary);
+
 	rval[0] = '\0';
 	roff = 0;
 	for (cp = binary; *cp != '\0'; ++cp) {
@@ -752,7 +765,7 @@ kwval_ltime(int id)
 		e_item = ABMON_12;
 		break;
 	case KW_TIME_AM_PM:
-		if (asprintf(&rval, "%s\";\"%s",
+		if (asprintf(&rval, "%s;%s",
 		    nl_langinfo(AM_STR),
 		    nl_langinfo(PM_STR)) == -1)
 			err(1, "asprintf");
@@ -763,11 +776,9 @@ kwval_ltime(int id)
 	if (kwsbuf == NULL)
 		err(1, "sbuf");
 	for (i = s_item; i <= e_item; i++) {
-		if (i != s_item)
-			(void) sbuf_cat(kwsbuf, "\"");
 		(void) sbuf_cat(kwsbuf, nl_langinfo(i));
 		if (i != e_item)
-			(void) sbuf_cat(kwsbuf, "\";");
+			(void) sbuf_cat(kwsbuf, ";");
 	}
 	(void) sbuf_finish(kwsbuf);
 	rval = strdup(sbuf_data(kwsbuf));
@@ -781,10 +792,11 @@ kwval_ltime(int id)
  * keyword value and properties lookup
  */
 int
-kwval_lookup(const char *kwname, char **kwval, int *cat, int *isstr, int *alloc)
+kwval_lookup(const char *kwname, char **kwval, int *cat, int *type, int *alloc)
 {
 	int	rval;
 	size_t	i;
+	static char nastr[3] = "-1";
 
 	rval = 0;
 	*alloc = 0;
@@ -792,13 +804,22 @@ kwval_lookup(const char *kwname, char **kwval, int *ca
 		if (strcasecmp(kwname, kwinfo[i].name) == 0) {
 			rval = 1;
 			*cat = kwinfo[i].catid;
-			*isstr = kwinfo[i].isstr;
+			*type = kwinfo[i].type;
 			switch (kwinfo[i].source) {
 			case SRC_LINFO:
 				*kwval = nl_langinfo(kwinfo[i].value_ref);
 				break;
 			case SRC_LCONV:
 				*kwval = kwval_lconv(kwinfo[i].value_ref);
+				/*
+				 * XXX This check will need to be modified
+				 * if/when localeconv() is fixed (PR172215).
+				 */
+				if (**kwval == CHAR_MAX) {
+					if (*type == TYPE_NUM)
+						*type = TYPE_UNQ;
+					*kwval = nastr;
+				}
 				break;
 			case SRC_LTIME:
 				*kwval = kwval_ltime(kwinfo[i].value_ref);
@@ -819,10 +840,10 @@ kwval_lookup(const char *kwname, char **kwval, int *ca
 void
 showdetails(const char *kw)
 {
-	int	isstr, cat, tmpval, alloc;
+	int	type, cat, tmpval, alloc;
 	char	*kwval;
 
-	if (kwval_lookup(kw, &kwval, &cat, &isstr, &alloc) == 0) {
+	if (kwval_lookup(kw, &kwval, &cat, &type, &alloc) == 0) {
 		/*
 		 * invalid keyword specified.
 		 * XXX: any actions?
@@ -839,20 +860,30 @@ showdetails(const char *kw)
 	}
 
 	if (prt_keywords) {
-		if (isstr) {
-			printf("%s=\"%s\"\n", kw, kwval);
-		} else {
-			tmpval = (char) *kwval;
+		switch (type) {
+		case TYPE_NUM:
+			tmpval = (char)*kwval;
 			printf("%s=%d\n", kw, tmpval);
+			break;
+		case TYPE_STR:
+			printf("%s=\"%s\"\n", kw, kwval);
+			break;
+		case TYPE_UNQ:
+			printf("%s=%s\n", kw, kwval);
+			break;
 		}
 	}
 
 	if (!prt_categories && !prt_keywords) {
-		if (isstr) {
-			printf("%s\n", kwval);
-		} else {
-			tmpval = (char) *kwval;
+		switch (type) {
+		case TYPE_NUM:
+			tmpval = (char)*kwval;
 			printf("%d\n", tmpval);
+			break;
+		case TYPE_STR:
+		case TYPE_UNQ:
+			printf("%s\n", kwval);
+			break;
 		}
 	}
 
@@ -901,7 +932,7 @@ showkeywordslist(char *substring)
 		printf(FMT,
 			kwinfo[i].name,
 			lookup_localecat(kwinfo[i].catid),
-			(kwinfo[i].isstr == 0) ? "number" : "string",
+			(kwinfo[i].type == TYPE_NUM) ? "number" : "string",
 			kwinfo[i].comment);
 	}
 }

Modified: head/usr.bin/locale/tests/Makefile
==============================================================================
--- head/usr.bin/locale/tests/Makefile	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/tests/Makefile	Wed Sep 11 15:39:28 2019	(r352214)
@@ -8,5 +8,9 @@ ${PACKAGE}FILES+=	k_flag_posix_monetary.out
 ${PACKAGE}FILES+=	k_flag_posix_numeric.out
 ${PACKAGE}FILES+=	k_flag_posix_time.out
 ${PACKAGE}FILES+=	k_flag_posix_messages.out
+${PACKAGE}FILES+=	no_flags_posix_monetary.out
+${PACKAGE}FILES+=	no_flags_posix_numeric.out
+${PACKAGE}FILES+=	no_flags_posix_time.out
+${PACKAGE}FILES+=	no_flags_posix_messages.out
 
 .include <bsd.test.mk>

Modified: head/usr.bin/locale/tests/k_flag_posix_monetary.out
==============================================================================
--- head/usr.bin/locale/tests/k_flag_posix_monetary.out	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/tests/k_flag_posix_monetary.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -2,20 +2,20 @@ int_curr_symbol=""
 currency_symbol=""
 mon_decimal_point=""
 mon_thousands_sep=""
-mon_grouping="127"
+mon_grouping=-1
 positive_sign=""
 negative_sign=""
-int_frac_digits=127
-frac_digits=127
-p_cs_precedes=127
-p_sep_by_space=127
-n_cs_precedes=127
-n_sep_by_space=127
-p_sign_posn=127
-n_sign_posn=127
-int_p_cs_precedes=127
-int_n_cs_precedes=127
-int_p_sep_by_space=127
-int_n_sep_by_space=127
-int_p_sign_posn=127
-int_n_sign_posn=127
+int_frac_digits=-1
+frac_digits=-1
+p_cs_precedes=-1
+p_sep_by_space=-1
+n_cs_precedes=-1
+n_sep_by_space=-1
+p_sign_posn=-1
+n_sign_posn=-1
+int_p_cs_precedes=-1
+int_n_cs_precedes=-1
+int_p_sep_by_space=-1
+int_n_sep_by_space=-1
+int_p_sign_posn=-1
+int_n_sign_posn=-1

Modified: head/usr.bin/locale/tests/k_flag_posix_numeric.out
==============================================================================
--- head/usr.bin/locale/tests/k_flag_posix_numeric.out	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/tests/k_flag_posix_numeric.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -1,3 +1,3 @@
 decimal_point="."
 thousands_sep=""
-grouping="127"
+grouping=-1

Modified: head/usr.bin/locale/tests/k_flag_posix_time.out
==============================================================================
--- head/usr.bin/locale/tests/k_flag_posix_time.out	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/tests/k_flag_posix_time.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -1,14 +1,14 @@
-abday="Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"
-day="Sunday";"Monday";"Tuesday";"Wednesday";"Thursday";"Friday";"Saturday"
-abmon="Jan";"Feb";"Mar";"Apr";"May";"Jun";"Jul";"Aug";"Sep";"Oct";"Nov";"Dec"
-mon="January";"February";"March";"April";"May";"June";"July";"August";"September";"October";"November";"December"
+abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"
+day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
+abmon="Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec"
+mon="January;February;March;April;May;June;July;August;September;October;November;December"
 d_t_fmt="%a %b %e %H:%M:%S %Y"
 d_fmt="%m/%d/%y"
 t_fmt="%H:%M:%S"
-am_pm="AM";"PM"
+am_pm="AM;PM"
 t_fmt_ampm="%I:%M:%S %p"
-era=""
+era=
 era_d_fmt=""
 era_t_fmt=""
 era_d_t_fmt=""
-alt_digits=""
+alt_digits=

Modified: head/usr.bin/locale/tests/locale_test.sh
==============================================================================
--- head/usr.bin/locale/tests/locale_test.sh	Wed Sep 11 13:35:22 2019	(r352213)
+++ head/usr.bin/locale/tests/locale_test.sh	Wed Sep 11 15:39:28 2019	(r352214)
@@ -29,7 +29,8 @@
 atf_test_case k_flag_posix
 k_flag_posix_head()
 {
-	atf_set "descr" "Verify -k handles all POSIX specified keywords"
+	atf_set "descr" \
+	    "Verify output of 'locale -k' for all POSIX specified keywords"
 }
 k_flag_posix_body()
 {
@@ -92,7 +93,75 @@ k_flag_posix_body()
 	    noexpr
 }
 
+atf_test_case no_flags_posix
+no_flags_posix_head()
+{
+	atf_set "descr" \
+	    "Verify output of 'locale' for all POSIX specified keywords"
+}
+no_flags_posix_body()
+{
+	export LC_ALL="C"
+
+	# LC_MONETARY
+	atf_check -o file:"$(atf_get_srcdir)/no_flags_posix_monetary.out" \
+	    locale \
+	    int_curr_symbol \
+	    currency_symbol \
+	    mon_decimal_point \
+	    mon_thousands_sep \
+	    mon_grouping \
+	    positive_sign \
+	    negative_sign \
+	    int_frac_digits \
+	    frac_digits \
+	    p_cs_precedes \
+	    p_sep_by_space \
+	    n_cs_precedes \
+	    n_sep_by_space \
+	    p_sign_posn \
+	    n_sign_posn \
+	    int_p_cs_precedes \
+	    int_n_cs_precedes \
+	    int_p_sep_by_space \
+	    int_n_sep_by_space \
+	    int_p_sign_posn \
+	    int_n_sign_posn
+
+	# LC_NUMERIC
+	atf_check -o file:"$(atf_get_srcdir)/no_flags_posix_numeric.out" \
+	    locale \
+	    decimal_point \
+	    thousands_sep \
+	    grouping
+
+	# LC_TIME
+	atf_check -o file:"$(atf_get_srcdir)/no_flags_posix_time.out" \
+	    locale \
+	    abday \
+	    day \
+	    abmon \
+	    mon \
+	    d_t_fmt \
+	    d_fmt \
+	    t_fmt \
+	    am_pm \
+	    t_fmt_ampm \
+	    era \
+	    era_d_fmt \
+	    era_t_fmt \
+	    era_d_t_fmt \
+	    alt_digits
+
+	# LC_MESSAGES
+	atf_check -o file:"$(atf_get_srcdir)/no_flags_posix_messages.out" \
+	    locale \
+	    yesexpr \
+	    noexpr
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case k_flag_posix
+	atf_add_test_case no_flags_posix
 }

Added: head/usr.bin/locale/tests/no_flags_posix_messages.out
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/locale/tests/no_flags_posix_messages.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -0,0 +1,2 @@
+^[yY]
+^[nN]

Added: head/usr.bin/locale/tests/no_flags_posix_monetary.out
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/locale/tests/no_flags_posix_monetary.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -0,0 +1,21 @@
+
+
+
+
+-1
+
+
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1

Added: head/usr.bin/locale/tests/no_flags_posix_numeric.out
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/locale/tests/no_flags_posix_numeric.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -0,0 +1,3 @@
+.
+
+-1

Added: head/usr.bin/locale/tests/no_flags_posix_time.out
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/locale/tests/no_flags_posix_time.out	Wed Sep 11 15:39:28 2019	(r352214)
@@ -0,0 +1,14 @@
+Sun;Mon;Tue;Wed;Thu;Fri;Sat
+Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday
+Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec
+January;February;March;April;May;June;July;August;September;October;November;December
+%a %b %e %H:%M:%S %Y
+%m/%d/%y
+%H:%M:%S
+AM;PM
+%I:%M:%S %p
+
+
+
+
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909111539.x8BFdSHo042554>