The was finally applied after 2 years 7 months, by the new util-linux-ng maintainer. It fixes a crash for certain $TERM types, and also fixes alignment of cal -3 output when "today" is in the last week of the month. --- cal-2.12q.c 2004-12-05 19:20:36.000000000 +0000 +++ cal.c 2005-04-26 10:28:46.060622765 +0000 @@ -87,9 +87,13 @@ putp(s); } -static char * +static const char * my_tgetstr(char *s, char *ss) { - return tigetstr(ss); + const char* ret = tigetstr(ss); + if (!ret || ret==(char*)-1) + return ""; + else + return ret; } #elif defined(HAVE_termcap) @@ -110,9 +114,13 @@ tputs (s, 1, putchar); } -static char * +static const char * my_tgetstr(char *s, char *ss) { - return tgetstr(s, &strbuf); + const char* ret = tgetstr(s, &strbuf); + if (!ret) + return ""; + else + return ret; } #endif @@ -225,6 +233,7 @@ char * ascii_day(char *, int); void center_str(const char* src, char* dest, size_t dest_size, int width); void center(const char *, int, int); +int strlen_terminal(const char* s); void day_array(int, int, int, int *); int day_in_week(int, int, int); int day_in_year(int, int, int); @@ -498,10 +507,17 @@ 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++) { + int width1=width,width2=width,width3=width; +#if defined(HAVE_ncurses) || defined(HAVE_termcap) + /* adjust width to allow for non printable characters */ + width1+=strlen(out_prev.s[i])-strlen_terminal(out_prev.s[i]); + width2+=strlen(out_curm.s[i])-strlen_terminal(out_curm.s[i]); + width3+=strlen(out_next.s[i])-strlen_terminal(out_next.s[i]); +#endif snprintf(lineout, SIZE(lineout), "%-*s %-*s %-*s\n", - width, out_prev.s[i], - width, out_curm.s[i], - width, out_next.s[i]); + width1, out_prev.s[i], + width2, out_curm.s[i], + width3, out_next.s[i]); #if defined(HAVE_ncurses) || defined(HAVE_termcap) my_putstring(lineout); #else @@ -773,6 +789,15 @@ (void)printf("%*s", separate, ""); } +int +strlen_terminal(const char* s) +{ + if (Senter && Senter[0]) + if (strstr(s,Senter)) + return strlen(s) - strlen(Senter) - strlen(Sexit); + return strlen(s); +} + void usage() {