--- cal.c	2005-08-01 20:41:02.000000000 +0000
+++ cal-pb.c	2005-08-09 11:21:15.000000000 +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_LIBTERMCAP)
@@ -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,18 @@
 	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,width2,width3;
+		width1=width2=width3=width;
+#if defined(HAVE_NCURSES) || defined(HAVE_LIBTERMCAP)
+		/* 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_LIBTERMCAP)
 		my_putstring(lineout);
 #else
@@ -773,6 +790,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()
 {
