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
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],
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"