Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Mar 2009 10:12:29 +0100
From:      Christoph Mallon <christoph.mallon@gmx.de>
To:        David Schultz <das@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r189804 - head/usr.bin/ncal
Message-ID:  <49BCC67D.70104@gmx.de>
In-Reply-To: <200903141855.n2EItpnp004551@svn.freebsd.org>
References:  <200903141855.n2EItpnp004551@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Hi David!

David Schultz schrieb:
> Author: das
> Date: Sat Mar 14 18:55:51 2009
> New Revision: 189804
> URL: http://svn.freebsd.org/changeset/base/189804
> 
> Log:
>   Multibyte character support for cal(1).
>   
>   PR:		131578
> 
> Modified:
>   head/usr.bin/ncal/ncal.1
>   head/usr.bin/ncal/ncal.c
> 
[...]
> Modified: head/usr.bin/ncal/ncal.c
> ==============================================================================
> --- head/usr.bin/ncal/ncal.c	Sat Mar 14 18:24:15 2009	(r189803)
> +++ head/usr.bin/ncal/ncal.c	Sat Mar 14 18:55:51 2009	(r189804)
[...]
> @@ -532,17 +537,17 @@ printyearb(int y, int jd_flag)
>  	printf("%s\n\n", center(t, s, mw * mpl + mpl));
>  
>  	for (j = 0; j != 12; j += mpl) {
> -		printf("%-*s  ", mw, center(s, year[j].name, mw));
> +		printf("%-*ls  ", mw, wcenter(ws, year[j].name, mw));
>  		if (mpl == 2)
> -			printf("%s\n", center(s, year[j + 1].name, mw));
> +			printf("%ls\n", wcenter(ws, year[j + 1].name, mw));
>  		else
> -			printf("%-*s  %s\n", mw,
> -			    center(s, year[j + 1].name, mw),
> -			    center(t, year[j + 2].name, mw));
> +			printf("%-*ls  %ls\n", mw,
> +			    wcenter(ws, year[j + 1].name, mw),
> +			    wcenter(wt, year[j + 2].name, mw));
>  
>  		if (mpl == 2)
> -			printf(" %s %s %s %s %s %s %s "
> -			       " %s %s %s %s %s %s %.2s\n",
> +			wprintf(L" %ls %ls %ls %ls %ls %ls %ls "
> +				" %ls %ls %ls %ls %ls %ls %.2ls\n",
>  				wds.names[6], wds.names[0], wds.names[1],
>  				wds.names[2], wds.names[3], wds.names[4],
>  				wds.names[5],
[...]

Your changes to ncal are invalid. You are mixing byte and wide output 
functions, which access the same stream (here printf() and wprintf()).
This is not allowed according to C99 ยง17.9.2:5:
"Byte input/output functions shall not be applied to a wide-oriented 
stream and wide character input/output functions shall not be applied to 
a byte-oriented stream. [...]"
(The first access of a stream with a byte/wide oriented function makes 
it byte/wide oriented)
With FreeBSD's current implementation of output functions this 
accidently works, but you should not rely on this. For example with 
glibc's implementation it fails.
Attached is a patch, which changes all wprintf()s back to printf().

	Christoph

[-- Attachment #2 --]
Index: ncal.c
===================================================================
--- ncal.c	(Revision 189845)
+++ ncal.c	(Arbeitskopie)
@@ -443,15 +443,15 @@
 	mw = jd_flag ? MONTH_WIDTH_B_J : MONTH_WIDTH_B;
 
 	swprintf(s, MAX_WIDTH, L"%ls %d", month.name, y);
-	wprintf(L"%ls\n", wcenter(t, s, mw));
+	printf("%ls\n", wcenter(t, s, mw));
 
 	if (jd_flag)
-		wprintf(L" %ls %ls %ls %ls %ls %ls %.2ls\n",
+		printf(" %ls %ls %ls %ls %ls %ls %.2ls\n",
 			wds.names[6], wds.names[0],
 			wds.names[1], wds.names[2], wds.names[3],
 			wds.names[4], wds.names[5]);
 	else
-		wprintf(L"%ls%ls%ls%ls%ls%ls%.2ls\n", wds.names[6],
+		printf("%ls%ls%ls%ls%ls%ls%.2ls\n", wds.names[6],
 			wds.names[0], wds.names[1], wds.names[2], wds.names[3],
 			wds.names[4], wds.names[5]);
 
@@ -546,7 +546,7 @@
 			    wcenter(wt, year[j + 2].name, mw));
 
 		if (mpl == 2)
-			wprintf(L" %ls %ls %ls %ls %ls %ls %ls "
+			printf(" %ls %ls %ls %ls %ls %ls %ls "
 				" %ls %ls %ls %ls %ls %ls %.2ls\n",
 				wds.names[6], wds.names[0], wds.names[1],
 				wds.names[2], wds.names[3], wds.names[4],
@@ -555,7 +555,7 @@
 				wds.names[2], wds.names[3], wds.names[4],
 				wds.names[5]);
 		else
-			wprintf(L"%ls%ls%ls%ls%ls%ls%ls "
+			printf("%ls%ls%ls%ls%ls%ls%ls "
 				"%ls%ls%ls%ls%ls%ls%ls "
 				"%ls%ls%ls%ls%ls%ls%.2ls\n",
 				wds.names[6], wds.names[0], wds.names[1],

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