svn commit: r198704 - in stable/8: include lib/libc lib/libc/gen lib/libc/locale lib/libc/stdio lib/libc/stdtime lib/libc/string usr.bin/locale

Edwin Groothuis edwin at FreeBSD.org
Sat Oct 31 06:35:41 UTC 2009


Author: edwin
Date: Sat Oct 31 06:35:40 2009
New Revision: 198704
URL: http://svn.freebsd.org/changeset/base/198704

Log:
  MFCs of r197764, r197765, r197766, r197847:
  
  Modified locale(1) to be able to show the altmon_X fields and the
  [cxX]_fmt's.  Also modify the "-k list" option to display only
  fields with a certain prefix.
  
  Add the comment "(FreeBSD only)" to the altmonth_x keywords

Modified:
  stable/8/include/   (props changed)
  stable/8/include/langinfo.h
  stable/8/lib/libc/   (props changed)
  stable/8/lib/libc/gen/   (props changed)
  stable/8/lib/libc/locale/nl_langinfo.c
  stable/8/lib/libc/stdio/asprintf.c   (props changed)
  stable/8/lib/libc/stdtime/   (props changed)
  stable/8/lib/libc/stdtime/localtime.c
  stable/8/lib/libc/string/ffsll.c   (props changed)
  stable/8/lib/libc/string/flsll.c   (props changed)
  stable/8/lib/libc/string/wcpcpy.c   (props changed)
  stable/8/lib/libc/string/wcpncpy.c   (props changed)
  stable/8/usr.bin/locale/   (props changed)
  stable/8/usr.bin/locale/locale.1
  stable/8/usr.bin/locale/locale.c

Modified: stable/8/include/langinfo.h
==============================================================================
--- stable/8/include/langinfo.h	Fri Oct 30 23:33:06 2009	(r198703)
+++ stable/8/include/langinfo.h	Sat Oct 31 06:35:40 2009	(r198704)
@@ -114,6 +114,20 @@ typedef	__nl_item	nl_item;
 #define	D_MD_ORDER	57	/* month/day order (local extension) */
 #endif
 
+/* standalone months forms for %OB */
+#define	ALTMON_1	58
+#define	ALTMON_2	59
+#define	ALTMON_3	60
+#define	ALTMON_4	61
+#define	ALTMON_5	62
+#define	ALTMON_6	63
+#define	ALTMON_7	64
+#define	ALTMON_8	65
+#define	ALTMON_9	66
+#define	ALTMON_10	67
+#define	ALTMON_11	68
+#define	ALTMON_12	69
+
 __BEGIN_DECLS
 char	*nl_langinfo(nl_item);
 __END_DECLS

Modified: stable/8/lib/libc/locale/nl_langinfo.c
==============================================================================
--- stable/8/lib/libc/locale/nl_langinfo.c	Fri Oct 30 23:33:06 2009	(r198703)
+++ stable/8/lib/libc/locale/nl_langinfo.c	Sat Oct 31 06:35:40 2009	(r198704)
@@ -93,6 +93,12 @@ nl_langinfo(nl_item item)
 	case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
 		ret = (char*) __get_current_time_locale()->mon[_REL(ABMON_1)];
 		break;
+	case ALTMON_1: case ALTMON_2: case ALTMON_3: case ALTMON_4:
+	case ALTMON_5: case ALTMON_6: case ALTMON_7: case ALTMON_8:
+	case ALTMON_9: case ALTMON_10: case ALTMON_11: case ALTMON_12:
+		ret = (char*)
+		    __get_current_time_locale()->alt_month[_REL(ALTMON_1)];
+		break;
 	case ERA:
 		/* XXX: need to be implemented  */
 		ret = "";

Modified: stable/8/lib/libc/stdtime/localtime.c
==============================================================================
--- stable/8/lib/libc/stdtime/localtime.c	Fri Oct 30 23:33:06 2009	(r198703)
+++ stable/8/lib/libc/stdtime/localtime.c	Sat Oct 31 06:35:40 2009	(r198704)
@@ -21,6 +21,7 @@ __FBSDID("$FreeBSD$");
 #include "namespace.h"
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
 #include "private.h"
@@ -1413,13 +1414,16 @@ const time_t * const	timep;
 	static pthread_mutex_t localtime_mutex = PTHREAD_MUTEX_INITIALIZER;
 	static pthread_key_t localtime_key = -1;
 	struct tm *p_tm;
+	int r;
 
 	if (__isthreaded != 0) {
 		if (localtime_key < 0) {
 			_pthread_mutex_lock(&localtime_mutex);
 			if (localtime_key < 0) {
-				if (_pthread_key_create(&localtime_key, free) < 0) {
+				if ((r = _pthread_key_create(&localtime_key,
+				    free)) != 0) {
 					_pthread_mutex_unlock(&localtime_mutex);
+					errno = r;
 					return(NULL);
 				}
 			}
@@ -1512,13 +1516,16 @@ const time_t * const	timep;
 	static pthread_mutex_t gmtime_mutex = PTHREAD_MUTEX_INITIALIZER;
 	static pthread_key_t gmtime_key = -1;
 	struct tm *p_tm;
+	int r;
 
 	if (__isthreaded != 0) {
 		if (gmtime_key < 0) {
 			_pthread_mutex_lock(&gmtime_mutex);
 			if (gmtime_key < 0) {
-				if (_pthread_key_create(&gmtime_key, free) < 0) {
+				if ((r = _pthread_key_create(&gmtime_key,
+				    free)) != 0) {
 					_pthread_mutex_unlock(&gmtime_mutex);
+					errno = r;
 					return(NULL);
 				}
 			}

Modified: stable/8/usr.bin/locale/locale.1
==============================================================================
--- stable/8/usr.bin/locale/locale.1	Fri Oct 30 23:33:06 2009	(r198703)
+++ stable/8/usr.bin/locale/locale.1	Sat Oct 31 06:35:40 2009	(r198704)
@@ -35,8 +35,12 @@
 .Nm
 .Op Fl a | m
 .Nm
-.Op Fl ck
-.Op Ar keyword ...
+.Fl k 
+.Ic list
+.Op Ar prefix
+.Nm
+.Op Fl ck 
+.Ar keyword ...
 .Sh DESCRIPTION
 The
 .Nm
@@ -79,6 +83,8 @@ The special
 specific) keyword
 .Cm list
 can be used to retrieve the human readable list of all available keywords.
+If so,
+a prefix string can be defined to limit the amount of keywords returned.
 .Sh EXIT STATUS
 .Ex -std
 .Sh SEE ALSO

Modified: stable/8/usr.bin/locale/locale.c
==============================================================================
--- stable/8/usr.bin/locale/locale.c	Fri Oct 30 23:33:06 2009	(r198703)
+++ stable/8/usr.bin/locale/locale.c	Sat Oct 31 06:35:40 2009	(r198704)
@@ -55,7 +55,7 @@ const char *lookup_localecat(int);
 char	*kwval_lconv(int);
 int	kwval_lookup(char *, char **, int *, int *);
 void	showdetails(char *);
-void	showkeywordslist(void);
+void	showkeywordslist(char *substring);
 void	showlocale(void);
 void	usage(void);
 
@@ -190,6 +190,18 @@ struct _kwinfo {
 	{ "abmon_10",		1, LC_TIME,	ABMON_10, "" },
 	{ "abmon_11",		1, LC_TIME,	ABMON_11, "" },
 	{ "abmon_12",		1, LC_TIME,	ABMON_12, "" },
+	{ "altmon_1",		1, LC_TIME,	ALTMON_1, "(FreeBSD only)" },
+	{ "altmon_2",		1, LC_TIME,	ALTMON_2, "(FreeBSD only)" },
+	{ "altmon_3",		1, LC_TIME,	ALTMON_3, "(FreeBSD only)" },
+	{ "altmon_4",		1, LC_TIME,	ALTMON_4, "(FreeBSD only)" },
+	{ "altmon_5",		1, LC_TIME,	ALTMON_5, "(FreeBSD only)" },
+	{ "altmon_6",		1, LC_TIME,	ALTMON_6, "(FreeBSD only)" },
+	{ "altmon_7",		1, LC_TIME,	ALTMON_7, "(FreeBSD only)" },
+	{ "altmon_8",		1, LC_TIME,	ALTMON_8, "(FreeBSD only)" },
+	{ "altmon_9",		1, LC_TIME,	ALTMON_9, "(FreeBSD only)" },
+	{ "altmon_10",		1, LC_TIME,	ALTMON_10, "(FreeBSD only)" },
+	{ "altmon_11",		1, LC_TIME,	ALTMON_11, "(FreeBSD only)" },
+	{ "altmon_12",		1, LC_TIME,	ALTMON_12, "(FreeBSD only)" },
 	{ "era",		1, LC_TIME,	ERA, "(unavailable)" },
 	{ "era_d_fmt",		1, LC_TIME,	ERA_D_FMT, "(unavailable)" },
 	{ "era_d_t_fmt",	1, LC_TIME,	ERA_D_T_FMT, "(unavailable)" },
@@ -217,7 +229,7 @@ main(int argc, char *argv[])
 	int	ch;
 	int	tmp;
 
-	while ((ch = getopt(argc, argv, "ackm")) != -1) {
+	while ((ch = getopt(argc, argv, "ackms:")) != -1) {
 		switch (ch) {
 		case 'a':
 			all_locales = 1;
@@ -265,7 +277,7 @@ main(int argc, char *argv[])
 	if (prt_keywords && argc > 0)
 		while (tmp < argc)
 			if (strcasecmp(argv[tmp++], "list") == 0) {
-				showkeywordslist();
+				showkeywordslist(argv[tmp]);
 				exit(0);
 			}
 
@@ -290,7 +302,8 @@ void
 usage(void)
 {
 	printf("Usage: locale [ -a | -m ]\n"
-               "       locale [ -ck ] name ...\n");
+               "       locale -k list [prefix]\n"
+               "       locale [ -ck ] keyword ...\n");
 	exit(1);
 }
 
@@ -594,6 +607,7 @@ showdetails(char *kw)
 		 * invalid keyword specified.
 		 * XXX: any actions?
 		 */
+		fprintf(stderr, "Unknown keyword: `%s'\n", kw);
 		return;
 	}
 
@@ -639,16 +653,25 @@ lookup_localecat(int cat)
  * Show list of keywords
  */
 void
-showkeywordslist(void)
+showkeywordslist(char *substring)
 {
 	size_t	i;
 
 #define FMT "%-20s %-12s %-7s %-20s\n"
 
-	printf("List of available keywords\n\n");
+	if (substring == NULL)
+		printf("List of available keywords\n\n");
+	else
+		printf("List of available keywords starting with '%s'\n\n",
+		    substring);
 	printf(FMT, "Keyword", "Category", "Type", "Comment");
 	printf("-------------------- ------------ ------- --------------------\n");
 	for (i = 0; i < NKWINFO; i++) {
+		if (substring != NULL) {
+			if (strncmp(kwinfo[i].name, substring,
+			    strlen(substring)) != 0)
+				continue;
+		}
 		printf(FMT,
 			kwinfo[i].name,
 			lookup_localecat(kwinfo[i].catid),


More information about the svn-src-stable mailing list