Module Name: src Committed By: bouyer Date: Wed Mar 14 18:37:00 UTC 2018
Modified Files: src/lib/libc/stdio [netbsd-8]: vfwprintf.c src/tests/lib/libc/locale [netbsd-8]: t_sprintf.c Log Message: Pull up following revision(s) (requested by martin in ticket #630): lib/libc/stdio/vfwprintf.c: revision 1.35 lib/libc/stdio/vfwprintf.c: revision 1.36 tests/lib/libc/locale/t_sprintf.c: revision 1.2 Change t_sprintf to an expected failure, since we don't respect the empty thousands separator of the C/POSIX locale (PR standards/52282). Do not use thousands grouping when none is specified by the locale. Fixes PR standards/52282. A more correct fix for PR standards/52282. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.34.18.1 src/lib/libc/stdio/vfwprintf.c cvs rdiff -u -r1.1 -r1.1.2.1 src/tests/lib/libc/locale/t_sprintf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/stdio/vfwprintf.c diff -u src/lib/libc/stdio/vfwprintf.c:1.34 src/lib/libc/stdio/vfwprintf.c:1.34.18.1 --- src/lib/libc/stdio/vfwprintf.c:1.34 Mon Jan 20 14:11:03 2014 +++ src/lib/libc/stdio/vfwprintf.c Wed Mar 14 18:37:00 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: vfwprintf.c,v 1.34 2014/01/20 14:11:03 yamt Exp $ */ +/* $NetBSD: vfwprintf.c,v 1.34.18.1 2018/03/14 18:37:00 bouyer Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -38,7 +38,7 @@ static char sccsid[] = "@(#)vfprintf.c 8.1 (Berkeley) 6/4/93"; __FBSDID("$FreeBSD: src/lib/libc/stdio/vfwprintf.c,v 1.27 2007/01/09 00:28:08 imp Exp $"); #else -__RCSID("$NetBSD: vfwprintf.c,v 1.34 2014/01/20 14:11:03 yamt Exp $"); +__RCSID("$NetBSD: vfwprintf.c,v 1.34.18.1 2018/03/14 18:37:00 bouyer Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -923,15 +923,15 @@ reswitch: switch (ch) { sign = '+'; goto rflag; case '\'': - flags |= GROUPING; thousands_sep = *(localeconv_l(loc)->thousands_sep); grouping = localeconv_l(loc)->grouping; - /* If the locale doesn't define the above, use sane - * defaults - otherwise silly things happen! */ - if (thousands_sep == 0) - thousands_sep = ','; - if (!grouping || !*grouping) - grouping = "\3"; + /* Use grouping if defined by locale */ + if (thousands_sep && grouping && *grouping) + flags |= GROUPING; + else { + thousands_sep = '\0'; + grouping = NULL; + } goto rflag; case '.': if ((ch = *fmt++) == '*') { Index: src/tests/lib/libc/locale/t_sprintf.c diff -u src/tests/lib/libc/locale/t_sprintf.c:1.1 src/tests/lib/libc/locale/t_sprintf.c:1.1.2.1 --- src/tests/lib/libc/locale/t_sprintf.c:1.1 Tue May 30 23:44:02 2017 +++ src/tests/lib/libc/locale/t_sprintf.c Wed Mar 14 18:37:00 2018 @@ -1,11 +1,11 @@ -/* $NetBSD: t_sprintf.c,v 1.1 2017/05/30 23:44:02 perseant Exp $ */ +/* $NetBSD: t_sprintf.c,v 1.1.2.1 2018/03/14 18:37:00 bouyer Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Konrad Schroder + * by Konrad Schroder. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,7 +32,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2017\ The NetBSD Foundation, inc. All rights reserved."); -__RCSID("$NetBSD: t_sprintf.c,v 1.1 2017/05/30 23:44:02 perseant Exp $"); +__RCSID("$NetBSD: t_sprintf.c,v 1.1.2.1 2018/03/14 18:37:00 bouyer Exp $"); #include <locale.h> #include <stdio.h> @@ -53,14 +53,6 @@ static struct test { const char *double_input; } tests[] = { { - "C", - -12345, - "-12,345", - "-12345", - -12345.6789, - "-12,345.678900", - "-12345.678900", - }, { "en_US.UTF-8", -12345, "-12,345", @@ -77,6 +69,30 @@ static struct test { "-12\240345,678900", "-12345,678900", }, { + "it_IT.ISO8859-1", + -12345, + "-12.345", + "-12345", + -12345.6789, + "-12.345,678900", + "-12345,678900", + }, { + "POSIX", + /* + * POSIX-1.2008 specifies that the C and POSIX + * locales shall be identical (section 7.2) and + * that the POSIX locale shall have an empty + * thousands separator and "<period>" as its + * decimal point (section 7.3.4). *printf + * ought to honor these settings. + */ + -12345, + "-12345", + "-12345", + -12345.6789, + "-12345.678900", + "-12345.678900", + }, { NULL, 0, NULL, @@ -95,12 +111,18 @@ h_sprintf(const struct test *t) ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C"); printf("Trying locale %s...\n", t->locale); ATF_REQUIRE(setlocale(LC_NUMERIC, t->locale) != NULL); + printf("Using locale: %s\n", setlocale(LC_ALL, NULL)); + + if (!strcmp("POSIX", t->locale)) + atf_tc_expect_fail("%s", "PR standards/52282, printf doesn't respect empty thousands separator"); sprintf(buf, "%'f", t->double_value); ATF_REQUIRE_STREQ(buf, t->double_result); sprintf(buf, "%'d", t->int_value); ATF_REQUIRE_STREQ(buf, t->int_result); + + atf_tc_expect_pass(); } static void