util-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* BUG: cal prints bad month headers
@ 2014-05-27  9:45 Ruediger Meier
  2014-05-27 10:50 ` Ruediger Meier
  0 siblings, 1 reply; 6+ messages in thread
From: Ruediger Meier @ 2014-05-27  9:45 UTC (permalink / raw)
  To: util-linux; +Cc: Sami Kerola

Hi,

I have a system where "cal -ym" diff looks like this: 
------------
 Gregorian - Monday-based week
-                               2006
+                               2006                                      January               February                 March               April                   
May                   June                July                  August                September            October               November               December
+

-       January               February                 March
 Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
                    1          1  2  3  4  5          1  2  3  4  5
  2  3  4  5  6  7  8    6  7  8  9 10 11 12    6  7  8  9 10 11 12
@@ -10,7 +10,7 @@
 16 17 18 19 20 21 22   20 21 22 23 24 25 26   20 21 22 23 24 25 26
 23 24 25 26 27 28 29   27 28                  27 28 29 30 31
 30 31
-        April                   May                   June
+
 Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
                 1  2    1  2  3  4  5  6  7             1  2  3  4
  3  4  5  6  7  8  9    8  9 10 11 12 13 14    5  6  7  8  9 10 11
@@ -18,7 +18,7 @@
 17 18 19 20 21 22 23   22 23 24 25 26 27 28   19 20 21 22 23 24 25
 24 25 26 27 28 29 30   29 30 31               26 27 28 29 30

-        July                  August                September
+
 Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
                 1  2       1  2  3  4  5  6                1  2  3
  3  4  5  6  7  8  9    7  8  9 10 11 12 13    4  5  6  7  8  9 10
@@ -26,7 +26,7 @@
 17 18 19 20 21 22 23   21 22 23 24 25 26 27   18 19 20 21 22 23 24
 24 25 26 27 28 29 30   28 29 30 31            25 26 27 28 29 30
 31
-       October               November               December
+
 Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
                    1          1  2  3  4  5                1  2  3
  2  3  4  5  6  7  8    6  7  8  9 10 11 12    4  5  6  7  8  9 10
--------------------

This happens only if output is redirected into a file
$ ./cal -ym > bla ;cat bla
It looks good in terminal.  

Reverting 95f4adde (plus 0c6dc4b9 and 4a7424a5) fixes the problem.

The system is a Fedora 18, ppc64. I can't reproduce it on any other
ppc64 system. Unfortunately I don't have any other Fedora 18 for
testing.

cu,
Rudi

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: BUG: cal prints bad month headers
  2014-05-27  9:45 BUG: cal prints bad month headers Ruediger Meier
@ 2014-05-27 10:50 ` Ruediger Meier
  2014-05-27 11:29   ` Pádraig Brady
  2014-05-27 13:07   ` [PATCH] cal: all output must use my_putstring Ruediger Meier
  0 siblings, 2 replies; 6+ messages in thread
From: Ruediger Meier @ 2014-05-27 10:50 UTC (permalink / raw)
  To: util-linux; +Cc: Sami Kerola

On Tuesday 27 May 2014, Ruediger Meier wrote:
> This happens only if output is redirected into a file
> $ ./cal -ym > bla ;cat bla
> It looks good in terminal.
>
> Reverting 95f4adde (plus 0c6dc4b9 and 4a7424a5) fixes the problem.

Just another hint. Adding a fflush() like you see below also "fixes" the 
problem. Maybe we are mixing several output methods (printf, puts, 
my_putstring, etc.) like we shouldn't.

diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index 81375fe..2b61a30 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -760,6 +760,7 @@ static void yearly(const struct cal_control *ctl)
                set_consecutive_months(&m1, month, ctl->req.year);
                for (i = &m1; i; i = i->next)
                        cal_fill_month(i, ctl);
+               fflush(NULL);
                cal_output_header(&m1, ctl);
                cal_output_months(&m1, ctl);
        }

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: BUG: cal prints bad month headers
  2014-05-27 10:50 ` Ruediger Meier
@ 2014-05-27 11:29   ` Pádraig Brady
  2014-05-27 13:07   ` [PATCH] cal: all output must use my_putstring Ruediger Meier
  1 sibling, 0 replies; 6+ messages in thread
From: Pádraig Brady @ 2014-05-27 11:29 UTC (permalink / raw)
  To: Ruediger Meier; +Cc: util-linux, Sami Kerola

On 05/27/2014 11:50 AM, Ruediger Meier wrote:
> On Tuesday 27 May 2014, Ruediger Meier wrote:
>> This happens only if output is redirected into a file
>> $ ./cal -ym > bla ;cat bla
>> It looks good in terminal.
>>
>> Reverting 95f4adde (plus 0c6dc4b9 and 4a7424a5) fixes the problem.
> 
> Just another hint. Adding a fflush() like you see below also "fixes" the 
> problem. Maybe we are mixing several output methods (printf, puts, 
> my_putstring, etc.) like we shouldn't.
> 
> diff --git a/misc-utils/cal.c b/misc-utils/cal.c
> index 81375fe..2b61a30 100644
> --- a/misc-utils/cal.c
> +++ b/misc-utils/cal.c
> @@ -760,6 +760,7 @@ static void yearly(const struct cal_control *ctl)
>                 set_consecutive_months(&m1, month, ctl->req.year);
>                 for (i = &m1; i; i = i->next)
>                         cal_fill_month(i, ctl);
> +               fflush(NULL);
>                 cal_output_header(&m1, ctl);
>                 cal_output_months(&m1, ctl);
>         }
> --
> To unsubscribe from this list: send the line "unsubscribe util-linux" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

This would avoid the problem.
The correct fix would to have all output go through
the same channel (buffer), i.e. all output should use
my_putstring()

cheers,
Pádraig.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] cal: all output must use my_putstring
  2014-05-27 10:50 ` Ruediger Meier
  2014-05-27 11:29   ` Pádraig Brady
@ 2014-05-27 13:07   ` Ruediger Meier
  2014-05-27 14:12     ` Karel Zak
  1 sibling, 1 reply; 6+ messages in thread
From: Ruediger Meier @ 2014-05-27 13:07 UTC (permalink / raw)
  To: util-linux; +Cc: Pádraig Brady

From: Ruediger Meier <ruediger.meier@ga-group.nl>

Replace all puts, fputs and printf calls by my_putstring() because
we don't want to mix different output channels (buffers).

Signed-off-by: Ruediger Meier <ruediger.meier@ga-group.nl>
---
 misc-utils/cal.c | 50 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 20 deletions(-)

diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index 81375fe..e763fe1 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -609,7 +609,7 @@ static void cal_output_header(struct cal_month *month, const struct cal_control
 			center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
 		}
 		if (!ctl->yflag) {
-			fputs("\n", stdout);
+			my_putstring("\n");
 			for (i = month; i; i = i->next) {
 				sprintf(out, _("%d"), i->year);
 				center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
@@ -621,23 +621,27 @@ static void cal_output_header(struct cal_month *month, const struct cal_control
 			center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
 		}
 	}
-	puts("");
+	my_putstring("\n");
 	for (i = month; i; i = i->next) {
 		if (ctl->weektype) {
 			if (ctl->julian)
-				printf("%*s%s", (int)ctl->day_width - 1, "", day_headings);
+				sprintf(out, "%*s%s", (int)ctl->day_width - 1, "", day_headings);
 			else
-				printf("%*s%s", (int)ctl->day_width, "", day_headings);
+				sprintf(out, "%*s%s", (int)ctl->day_width, "", day_headings);
+			my_putstring(out);
 		} else
-			fputs(day_headings, stdout);
-		if (i->next != NULL)
-			printf("%*s", ctl->gutter_width, "");
+			my_putstring(day_headings);
+		if (i->next != NULL) {
+			sprintf(out, "%*s", ctl->gutter_width, "");
+			my_putstring(out);
+		}
 	}
-	puts("");
+	my_putstring("\n");
 }
 
 static void cal_output_months(struct cal_month *month, const struct cal_control *ctl)
 {
+	char out[FMT_ST_CHARS];
 	int reqday, week_line, d;
 	int skip;
 	struct cal_month *i;
@@ -659,12 +663,13 @@ static void cal_output_months(struct cal_month *month, const struct cal_control
 				if (0 < i->weeks[week_line]) {
 					if ((ctl->weektype & WEEK_NUM_MASK) ==
 					    i->weeks[week_line])
-						printf("%s%2d%s", Senter, i->weeks[week_line],
+						sprintf(out, "%s%2d%s", Senter, i->weeks[week_line],
 						       Sexit);
 					else
-						printf("%2d", i->weeks[week_line]);
+						sprintf(out, "%2d", i->weeks[week_line]);
 				} else
-					printf("%2s", "");
+					sprintf(out, "%2s", "");
+				my_putstring(out);
 				skip = ctl->day_width;
 			} else
 				/* First day of the week is one char narrower than the other days,
@@ -675,21 +680,26 @@ static void cal_output_months(struct cal_month *month, const struct cal_control
 			     d < DAYS_IN_WEEK * week_line + DAYS_IN_WEEK; d++) {
 				if (0 < i->days[d]) {
 					if (reqday == i->days[d])
-						printf("%*s%s%*d%s", skip - (ctl->julian ? 3 : 2),
+						sprintf(out, "%*s%s%*d%s", skip - (ctl->julian ? 3 : 2),
 						       "", Senter, (ctl->julian ? 3 : 2),
 						       i->days[d], Sexit);
 					else
-						printf("%*d", skip, i->days[d]);
+						sprintf(out, "%*d", skip, i->days[d]);
 				} else
-					printf("%*s", skip, "");
+					sprintf(out, "%*s", skip, "");
+				my_putstring(out);
 				if (skip < (int)ctl->day_width)
 					skip++;
 			}
-			if (i->next != NULL)
-				printf("%*s", ctl->gutter_width, "");
+			if (i->next != NULL) {
+				sprintf(out, "%*s", ctl->gutter_width, "");
+				my_putstring(out);
+			}
+		}
+		if (i == NULL) {
+			sprintf(out, "%*s\n", ctl->gutter_width - (ctl->yflag ? 0 : 1), "");
+			my_putstring(out);
 		}
-		if (i == NULL)
-			printf("%*s\n", ctl->gutter_width - (ctl->yflag ? 0 : 1), "");
 	}
 }
 
@@ -754,7 +764,7 @@ static void yearly(const struct cal_control *ctl)
 		year_width--;
 	sprintf(out, "%d", ctl->req.year);
 	center(out, year_width, 0);
-	fputs("\n\n", stdout);
+	my_putstring("\n\n");
 
 	for (month = 1; month < MONTHS_IN_YEAR; month += ctl->julian ? 2 : 3) {
 		set_consecutive_months(&m1, month, ctl->req.year);
@@ -764,7 +774,7 @@ static void yearly(const struct cal_control *ctl)
 		cal_output_months(&m1, ctl);
 	}
 	/* Is empty line at the end year output really needed? */
-	puts("");
+	my_putstring("\n");
 }
 
 /*
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] cal: all output must use my_putstring
  2014-05-27 13:07   ` [PATCH] cal: all output must use my_putstring Ruediger Meier
@ 2014-05-27 14:12     ` Karel Zak
  2014-05-27 14:50       ` Ruediger Meier
  0 siblings, 1 reply; 6+ messages in thread
From: Karel Zak @ 2014-05-27 14:12 UTC (permalink / raw)
  To: Ruediger Meier; +Cc: util-linux, Pádraig Brady

On Tue, May 27, 2014 at 03:07:05PM +0200, Ruediger Meier wrote:
> From: Ruediger Meier <ruediger.meier@ga-group.nl>
> 
> Replace all puts, fputs and printf calls by my_putstring() because
> we don't want to mix different output channels (buffers).

 Oh, this is well know problem I fixed one year ago, see
 e66ba1bfaf070682e26c1a53e64af1088fea56bc. 
 
 It seems the problem was re-introduced during Sami's cal(1) refactoring.
 Thanks! I'm going to push it.

    Karel


-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] cal: all output must use my_putstring
  2014-05-27 14:12     ` Karel Zak
@ 2014-05-27 14:50       ` Ruediger Meier
  0 siblings, 0 replies; 6+ messages in thread
From: Ruediger Meier @ 2014-05-27 14:50 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Pádraig Brady

On Tuesday 27 May 2014, Karel Zak wrote:
> On Tue, May 27, 2014 at 03:07:05PM +0200, Ruediger Meier wrote:
> > From: Ruediger Meier <ruediger.meier@ga-group.nl>
> >
> > Replace all puts, fputs and printf calls by my_putstring() because
> > we don't want to mix different output channels (buffers).
>
>  Oh, this is well know problem I fixed one year ago, see
>  e66ba1bfaf070682e26c1a53e64af1088fea56bc.

Funny that this one was also a fix for Fedora 18. Probably F-18 has bad 
ncurses-libs or glibc because usually it seemed to be compatible to 
printf function family.

putp() uses tputs() which uses putc() per default. putc() should be 
mixable with any other stdio output function.

cu,
Rudi




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-05-28 11:29 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-27  9:45 BUG: cal prints bad month headers Ruediger Meier
2014-05-27 10:50 ` Ruediger Meier
2014-05-27 11:29   ` Pádraig Brady
2014-05-27 13:07   ` [PATCH] cal: all output must use my_putstring Ruediger Meier
2014-05-27 14:12     ` Karel Zak
2014-05-27 14:50       ` Ruediger Meier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).