* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap [not found] <45868535.5030402@users.sourceforge.net> @ 2007-02-15 13:03 ` Karel Zak 2007-02-15 13:31 ` Pádraig Brady 0 siblings, 1 reply; 6+ messages in thread From: Karel Zak @ 2007-02-15 13:03 UTC (permalink / raw) To: Christian Schlotter; +Cc: util-linux-ng Hi Christian, some ideas from your patch are really good, but the rest is not so perfect after all. On Mon, Dec 18, 2006 at 01:10:29PM +0100, Christian Schlotter wrote: > +monthly3(int day, int month, int year, const int show_year) { > - do_monthly(day, prev_month, prev_year, &out_prev); > - do_monthly(day, month, year, &out_curm); > - do_monthly(day, next_month, next_year, &out_next); This is basic idea of the old monthly3() implementation and I think it's definitely good idea. There must be only one place (= do_monthly()) where we generate output for months. > - width = (julian ? J_WEEK_LEN : WEEK_LEN) -1; > - for (i = 0; i < 2; i++) > - printf("%s %s %s\n", out_prev.s[i], out_curm.s[i], out_next.s[i]); > - for (i = 2; i < FMT_ST_LINES; i++) { > - snprintf(lineout, SIZE(lineout), "%-*s %-*s %-*s\n", > - width, out_prev.s[i], > - width, out_curm.s[i], > - width, out_next.s[i]); > + memset(lineout, ' ', sizeof(lineout) - 1); > + lineout[sizeof(lineout) - 1] = '\0'; > + > + for (i = 0; i < 3; i++) { > + day_array(day, months[i], years[i], days[i]); > + if (show_year) { > + snprintf(head, sizeof(head), _("%s %d"), > + full_month[months[i] - 1], years[i]); > + } else { > + snprintf(head, sizeof(head), _("%s"), > + full_month[months[i] - 1]); > + } > + center(head, week_len, (i == 2) ? 0 : head_sep); > + } Here you *duplicate* functionality from do_monthly(). I think a better way will be add support for the "show_year" option to the do_monthly() function. Should be something like: monthly3(int day, int month, int year, const int show_year) { for (i = 0; i < 3; i++) do_monthly(day, month[i], year[i], out[i], show_year); } > + my_putstring(lineout);putchar('\n'); Ah.., please, two lines: my_putstring(lineout); putchar('\n'); :-) > yearly(int day, int year) { > + for (month = 0; month < 12; month += 3) > + monthly3(day, month + 2, year, show_year); > } Good idea. yearly = 4 * monthly3 monthly3 = 3 * do_monthly Karel -- Karel Zak <kzak@redhat.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap 2007-02-15 13:03 ` [PATCH] cal: Output unaligned with "-3" option and libtermcap Karel Zak @ 2007-02-15 13:31 ` Pádraig Brady 2007-02-15 14:18 ` Karel Zak 2007-02-15 14:49 ` Karel Zak 0 siblings, 2 replies; 6+ messages in thread From: Pádraig Brady @ 2007-02-15 13:31 UTC (permalink / raw) To: Karel Zak; +Cc: Christian Schlotter, util-linux-ng Karel Zak wrote: > Hi Christian, > > some ideas from your patch are really good, but the rest is not so > perfect after all. Sorry I missed the original mail/patch. Can you send again? For reference I did the "highlight today" functionality in cal a couple of years back which has alignment issues, and have been trying to get the fix in since then: http://www.pixelbeat.org/patches/cal-2.12q-highlight.diff Incidentally I also fixed the weekday alignment for multibyte locales in the changes I did a couple of years ago. Pádraig. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap 2007-02-15 13:31 ` Pádraig Brady @ 2007-02-15 14:18 ` Karel Zak 2007-02-15 15:04 ` Pádraig Brady 2007-02-15 14:49 ` Karel Zak 1 sibling, 1 reply; 6+ messages in thread From: Karel Zak @ 2007-02-15 14:18 UTC (permalink / raw) To: Pádraig Brady; +Cc: Christian Schlotter, util-linux-ng On Thu, Feb 15, 2007 at 01:31:20PM +0000, Pádraig Brady wrote: > Sorry I missed the original mail/patch. > Can you send again? There is a small display error when using cal from util-linux-2.13-pre7 with the command line "cal -3m". On Sep 27th 2006 it produced the following output (Sep 27th is highlighted): August 2006 September 2006 October 2006 Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 1 2 3 1 7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8 14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15 21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22 28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29 30 31 As one can see, the second but last row of October is misaligned because the characters used for highlighting are not taken into account when aligning the last line of September. This patch fixes the erroneous display by adopting the style of the yearly(...) function. The patch also removes one unused variable "len" and unifies the amount of whitespace used for separating two month displays. Signed-off-by: Christian Schlotter <schlotter@users.sourceforge.net> --- misc-utils/cal.c | 124 +++++++++++++++++++++++++----------------------------- 1 files changed, 57 insertions(+), 67 deletions(-) diff --git a/misc-utils/cal.c b/misc-utils/cal.c index 339a610..9719c12 100644 --- a/misc-utils/cal.c +++ b/misc-utils/cal.c @@ -232,7 +232,7 @@ void yearly(int, int); void j_yearly(int, int); void do_monthly(int, int, int, struct fmt_st*); void monthly(int, int, int); -void monthly3(int, int, int); +void monthly3(int, int, int, const int); void trim_trailing_spaces(char *); void usage(void); void headers_init(void); @@ -245,6 +245,7 @@ main(int argc, char **argv) { int ch, day, month, year, yflag; char *progname, *p; int num_months = NUM_MONTHS; + const int show_year = 1; progname = argv[0]; if ((p = strrchr(progname, '/')) != NULL) @@ -347,7 +348,7 @@ main(int argc, char **argv) { if (month && num_months == 1) monthly(day, month, year); else if (month && num_months == 3) - monthly3(day, month, year); + monthly3(day, month, year, show_year); else if (julian) j_yearly(day, year); else @@ -424,7 +425,7 @@ void headers_init(void) void do_monthly(int day, int month, int year, struct fmt_st *out) { - int col, row, len, days[MAXDAYS]; + int col, row, days[MAXDAYS]; char *p, lineout[FMT_ST_CHARS]; int width = (julian ? J_WEEK_LEN : WEEK_LEN) - 1; @@ -436,7 +437,7 @@ do_monthly(int day, int month, int year, struct fmt_st *out) { * Basque the translation should be: "%2$dko %1$s", and * the Vietnamese should be "%s na(m %d", etc. */ - len = sprintf(lineout, _("%s %d"), full_month[month - 1], year); + sprintf(lineout, _("%s %d"), full_month[month - 1], year); center_str(lineout, out->s[0], SIZE(out->s[0]), width); sprintf(out->s[1],"%s", @@ -466,46 +467,62 @@ monthly(int day, int month, int year) { } void -monthly3(int day, int month, int year) { - char lineout[FMT_ST_CHARS]; - int i; - int width; - struct fmt_st out_prev; - struct fmt_st out_curm; - struct fmt_st out_next; - int prev_month, prev_year; - int next_month, next_year; - +monthly3(int day, int month, int year, const int show_year) { + char *p, lineout[FMT_ST_CHARS], head[FMT_ST_CHARS / 3]; + int *dp, days[3][MAXDAYS], months[3], years[3], row, col, i; + const int week_len = (julian) ? J_WEEK_LEN : WEEK_LEN; + const int head_sep = (julian) ? J_HEAD_SEP : HEAD_SEP; + const char * const headings = (julian) ? j_day_headings : day_headings; + + /* previous, current and next month/year */ if (month == 1) { - prev_month = 12; - prev_year = year - 1; + months[0] = 12; + years[0] = year - 1; } else { - prev_month = month - 1; - prev_year = year; + months[0] = month - 1; + years[0] = year; } + months[1] = month; + years[1] = year; if (month == 12) { - next_month = 1; - next_year = year + 1; + months[2] = 1; + years[2] = year + 1; } else { - next_month = month + 1; - next_year = year; + months[2] = month + 1; + years[2] = year; } - do_monthly(day, prev_month, prev_year, &out_prev); - do_monthly(day, month, year, &out_curm); - do_monthly(day, next_month, next_year, &out_next); - width = (julian ? J_WEEK_LEN : WEEK_LEN) -1; - for (i = 0; i < 2; i++) - printf("%s %s %s\n", out_prev.s[i], out_curm.s[i], out_next.s[i]); - for (i = 2; i < FMT_ST_LINES; i++) { - snprintf(lineout, SIZE(lineout), "%-*s %-*s %-*s\n", - width, out_prev.s[i], - width, out_curm.s[i], - width, out_next.s[i]); + memset(lineout, ' ', sizeof(lineout) - 1); + lineout[sizeof(lineout) - 1] = '\0'; + + for (i = 0; i < 3; i++) { + day_array(day, months[i], years[i], days[i]); + if (show_year) { + snprintf(head, sizeof(head), _("%s %d"), + full_month[months[i] - 1], years[i]); + } else { + snprintf(head, sizeof(head), _("%s"), + full_month[months[i] - 1]); + } + center(head, week_len, (i == 2) ? 0 : head_sep); + } + printf("\n%s%*s %s%*s %s\n", headings, head_sep, "", headings, + head_sep, "", headings); + for (row = 0; row < 6; row++) { + p = lineout; + for (i = 0; i < 3; i++) { + dp = &days[i][row * 7]; + for (col = 0; col < 7; col++) { + p = ascii_day(p, *dp++); + } + p += sprintf(p, " "); + } + *p = '\0'; + trim_trailing_spaces(lineout); #if defined(HAVE_NCURSES) || defined(HAVE_LIBTERMCAP) - my_putstring(lineout); + my_putstring(lineout);putchar('\n'); #else - fputs(lineout,stdout); + puts(lineout); #endif } } @@ -546,47 +563,20 @@ j_yearly(int day, int year) { #endif } } - printf("\n"); } void yearly(int day, int year) { - int col, *dp, i, month, row, which_cal; - int days[12][MAXDAYS]; - char *p, lineout[100]; + int month; + char lineout[100]; + const int show_year = 0; sprintf(lineout, "%d", year); center(lineout, WEEK_LEN * 3 + HEAD_SEP * 2, 0); printf("\n\n"); - for (i = 0; i < 12; i++) - day_array(day, i + 1, year, days[i]); - memset(lineout, ' ', sizeof(lineout) - 1); - lineout[sizeof(lineout) - 1] = '\0'; - for (month = 0; month < 12; month += 3) { - center(full_month[month], WEEK_LEN, HEAD_SEP); - center(full_month[month + 1], WEEK_LEN, HEAD_SEP); - center(full_month[month + 2], WEEK_LEN, 0); - printf("\n%s%*s %s%*s %s\n", day_headings, HEAD_SEP, - "", day_headings, HEAD_SEP, "", day_headings); - for (row = 0; row < 6; row++) { - p = lineout; - for (which_cal = 0; which_cal < 3; which_cal++) { - dp = &days[month + which_cal][row * 7]; - for (col = 0; col < 7; col++) - p = ascii_day(p, *dp++); - p += sprintf(p, " "); - } - *p = '\0'; - trim_trailing_spaces(lineout); -#if defined(HAVE_NCURSES) || defined(HAVE_LIBTERMCAP) - my_putstring(lineout);putchar('\n'); -#else - puts(lineout); -#endif - } - } - printf("\n"); + for (month = 0; month < 12; month += 3) + monthly3(day, month + 2, year, show_year); } /* -- 1.4.4.2 -- Karel Zak <kzak@redhat.com> ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap 2007-02-15 14:18 ` Karel Zak @ 2007-02-15 15:04 ` Pádraig Brady 0 siblings, 0 replies; 6+ messages in thread From: Pádraig Brady @ 2007-02-15 15:04 UTC (permalink / raw) To: Karel Zak; +Cc: Christian Schlotter, util-linux-ng Karel Zak wrote: > On Thu, Feb 15, 2007 at 01:31:20PM +0000, Pádraig Brady wrote: > >> Sorry I missed the original mail/patch. >> Can you send again? > > There is a small display error when using cal from util-linux-2.13-pre7 > with the command line "cal -3m". On Sep 27th 2006 it produced the > following output (Sep 27th is highlighted): > > August 2006 September 2006 October 2006 > Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su > 1 2 3 4 5 6 1 2 3 1 > 7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8 > 14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15 > 21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22 > 28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29 > 30 31 > > As one can see, the second but last row of October is misaligned because > the characters used for highlighting are not taken into account when > aligning the last line of September. Yes, that is exactly the issue my patch fixes. Pádraig. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap 2007-02-15 13:31 ` Pádraig Brady 2007-02-15 14:18 ` Karel Zak @ 2007-02-15 14:49 ` Karel Zak 2007-02-15 15:03 ` Pádraig Brady 1 sibling, 1 reply; 6+ messages in thread From: Karel Zak @ 2007-02-15 14:49 UTC (permalink / raw) To: Pádraig Brady; +Cc: Christian Schlotter, util-linux-ng On Thu, Feb 15, 2007 at 01:31:20PM +0000, Pádraig Brady wrote: > Karel Zak wrote: > > Hi Christian, > > > > some ideas from your patch are really good, but the rest is not so > > perfect after all. > > Sorry I missed the original mail/patch. > Can you send again? Done. > For reference I did the "highlight today" functionality > in cal a couple of years back which has alignment issues, > and have been trying to get the fix in since then: > http://www.pixelbeat.org/patches/cal-2.12q-highlight.diff This patch is already in my mail box ;-) Well, Christian's patch is more about code refactoring rather than about simple bug fix only. (It might good idea to cleanup the code.) > Incidentally I also fixed the weekday alignment for > multibyte locales in the changes I did a couple of years ago There is also other multibyte fix (by RH): http://people.redhat.com/kzak/util-linux/util-linux-2.12p-cal-wide.patch My plan is write some regression tests for the "cal" before playing with these patches. Karel -- Karel Zak <kzak@redhat.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] cal: Output unaligned with "-3" option and libtermcap 2007-02-15 14:49 ` Karel Zak @ 2007-02-15 15:03 ` Pádraig Brady 0 siblings, 0 replies; 6+ messages in thread From: Pádraig Brady @ 2007-02-15 15:03 UTC (permalink / raw) To: Karel Zak; +Cc: Christian Schlotter, util-linux-ng Karel Zak wrote: > On Thu, Feb 15, 2007 at 01:31:20PM +0000, Pádraig Brady wrote: >> Karel Zak wrote: >>> Hi Christian, >>> >>> some ideas from your patch are really good, but the rest is not so >>> perfect after all. >> Sorry I missed the original mail/patch. >> Can you send again? > > Done. > >> For reference I did the "highlight today" functionality >> in cal a couple of years back which has alignment issues, >> and have been trying to get the fix in since then: >> http://www.pixelbeat.org/patches/cal-2.12q-highlight.diff > > This patch is already in my mail box ;-) > > Well, Christian's patch is more about code refactoring rather than > about simple bug fix only. (It might good idea to cleanup the code.) Yes the code can definitely be refactored. I was wary of changing format though when I looked at it, in case I broke scripts depending on whitespace etc. > >> Incidentally I also fixed the weekday alignment for >> multibyte locales in the changes I did a couple of years ago > > There is also other multibyte fix (by RH): > > http://people.redhat.com/kzak/util-linux/util-linux-2.12p-cal-wide.patch > > My plan is write some regression tests for the "cal" before playing > with these patches. I used the following 2 scripts to test my changes: [ ! -e "./cal" ] && CAL=cal || CAL=./cal LANG=ga_IE.utf8 $CAL -3 11 2004 #truncation (first month) LANG=zh_HK.utf8 $CAL -3 #multibyte centering $CAL | cat #no highlight TERM= $CAL #no highlight TERM=vt100 $CAL #highlight, with characters to be stripped by putp $CAL -y | head | tr ' ' . #3 spaces between cols? $CAL -3 | tr ' ' . #2 spaces between cols and trailing spaces? locale -a | grep utf8 | uniq -w2 | while read LANG; do cal -3 | head -2 | tail -1; done Pádraig ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-02-15 15:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <45868535.5030402@users.sourceforge.net>
2007-02-15 13:03 ` [PATCH] cal: Output unaligned with "-3" option and libtermcap Karel Zak
2007-02-15 13:31 ` Pádraig Brady
2007-02-15 14:18 ` Karel Zak
2007-02-15 15:04 ` Pádraig Brady
2007-02-15 14:49 ` Karel Zak
2007-02-15 15:03 ` Pádraig Brady
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox