On Tue, Apr 21, 2009, Roman Divacky wrote:
> > On the other hand, I don't mean to blame Roman or insist that he
> > fix it.  When I last touched ncal, I didn't have enough time to fix
> > all of these things either.  In fact, I only converted about half
> > of it to support multibyte month names and so forth, and strictly
> > speaking it should use wide character output routines exclusively.
> 
> feel free to work on it, or anyone else. I wanted to see what day is
> today when I am filling in my job reports. I got this and I dont care
> anymore about cal...

Things in our tree get into this sort of state because over the
years, a dozen different people decide to add "one more feature"
and don't care enough to do a good job. I'm not suggesting that
you rewrite it from scratch, but when you've got 4 indices i, j,
k, and l, one of which isn't even an index even though it is
documented as such, and a bunch of inscrutable code that has been
cut and paste in at least two places, it seems like it's time to
step back and ask if there's a simpler way to do things.

For instance, it seems like the following would accomplish what
you intended in 1/3 as many lines of new code. (FWIW, I don't have
time to mess around with this either; I hacked this together in 5
minutes and haven't tested it much.)

Index: ncal.c
===================================================================
--- ncal.c      (revision 191369)
+++ ncal.c      (working copy)
@@ -207,7 +207,7 @@
        time_t t;
        struct tm *tm1;
 
-       term_e = term_r = NULL;
+       term_e = term_r = "";
        today = 0;
        if (isatty(STDOUT_FILENO) && tgetent(tbuf, NULL) == 1) {
                date    dt;             /* handy date */
@@ -272,7 +272,7 @@
                        flag_julian_cal = 1;
                        break;
                case 'h':
-                       term_r = term_e = NULL;
+                       term_r = term_e = "";
                        break;
                case 'e':
                        if (flag_backward)
@@ -621,7 +621,7 @@
        int     dw;             /* width of numbers */
        int     first;          /* first day of month */
        int     firstm;         /* first day of first week of month */
-       int     i, j, k, l;     /* just indices */
+       int     i, j, k;        /* just indices */
        int     last;           /* the first day of next month */
        int     jan1 = 0;       /* the first day of this year */
        char   *ds;             /* pointer to day strings (daystr or
@@ -666,42 +666,24 @@
        /*
         * Fill the lines with day of month or day of year (julian day)
         * line index: i, each line is one weekday. column index: j, each
-        * column is one day number. print column index: k.
+        * column is one day number.
         */
        for (i = 0; i != 7; i++) {
-               l = 0;
-               for (j = firstm + i, k = 0; j < last; j += 7, k += dw) {
-                       if (j == today && (term_r != NULL && term_e != NULL)) {
-                               l = strlen(term_r);
-                               if (jd_flag)
-                                       dt.d = j - jan1 + 1;
-                               else
-                                       sdateb(j, &dt);
-                               /* separator */
-                               mlines->lines[i][k] = ' ';
-                               /* the actual text */
-                               memcpy(mlines->lines[i] + k + l,
-                                   ds + dt.d * dw, dw);
-                               /* highlight on */
-                               memcpy(mlines->lines[i] + k + 1, term_r, l);
-                               /* highlight off */
-                               memcpy(mlines->lines[i] + k + l + dw, term_e,
-                                   strlen(term_e));
-                               l = strlen(term_e) + strlen(term_r);
-                               continue;
-                       }
+               mlines->lines[i][0] = '\0';
+               for (j = firstm + i; j < last; j += 7) {
                        if (j >= first) {
                                if (jd_flag)
                                        dt.d = j - jan1 + 1;
                                else
-                                       sdate(j, &dt);
-                               memcpy(mlines->lines[i] + k + l,
-                                      ds + dt.d * dw, dw);
+                                       sdateb(j, &dt);
+                               if (j == today)
+                                       strcat(mlines->lines[i], term_r);
+                               strncat(mlines->lines[i], ds + dt.d * dw, dw);
+                               if (j == today)
+                                       strcat(mlines->lines[i], term_e);
                        } else
-                               memcpy(mlines->lines[i] + k + l, "    ", dw);
+                               strncat(mlines->lines[i], "    ", dw);
                }
-               mlines->lines[i][k + l] = '\0';
-                               
        }
 
        /* fill the weeknumbers */
@@ -726,7 +708,7 @@
        int     dw;             /* width of numbers */
        int     first;          /* first day of month */
        int     firsts;         /* sunday of first week of month */
-       int     i, j, k, l;     /* just indices */
+       int     i, j, k;        /* just indices */
        int     jan1 = 0;       /* the first day of this year */
        int     last;           /* the first day of next month */
        char   *ds;             /* pointer to day strings (daystr or
@@ -787,42 +769,21 @@
         * column is one day number. print column index: k.
         */
        for (i = 0; i != 6; i++) {
-               l = 0;
-               for (j = firsts + 7 * i, k = 0; j < last && k != dw * 7;
-                   j++, k += dw) { 
-                       if (j == today && (term_r != NULL && term_e != NULL)) {
-                               l = strlen(term_r);
-                               if (jd_flag)
-                                       dt.d = j - jan1 + 1;
-                               else
-                                       sdateb(j, &dt);
-                               /* separator */
-                               mlines->lines[i][k] = ' ';
-                               /* the actual text */
-                               memcpy(mlines->lines[i] + k + l,
-                                   ds + dt.d * dw, dw);
-                               /* highlight on */
-                               memcpy(mlines->lines[i] + k + 1, term_r, l);
-                               /* highlight off */
-                               memcpy(mlines->lines[i] + k + l + dw, term_e,
-                                   strlen(term_e));
-                               l = strlen(term_e) + strlen(term_r);
-                               continue;
-                       }
+               mlines->lines[i][0] = '\0';
+               for (j = firsts + 7 * i, k = 0; j < last && k != 7; j++, k++) { 
                        if (j >= first) {
                                if (jd_flag)
                                        dt.d = j - jan1 + 1;
                                else
                                        sdateb(j, &dt);
-                               memcpy(mlines->lines[i] + k + l,
-                                      ds + dt.d * dw, dw);
+                               if (j == today)
+                                       strcat(mlines->lines[i], term_r);
+                               strncat(mlines->lines[i], ds + dt.d * dw, dw);
+                               if (j == today)
+                                       strcat(mlines->lines[i], term_e);
                        } else
-                               memcpy(mlines->lines[i] + k + l, "    ", dw);
+                               strncat(mlines->lines[i], "    ", dw);
                }
-               if (k == 0)
-                       mlines->lines[i][1] = '\0';
-               else
-                       mlines->lines[i][k + l] = '\0';
        }
 }
 
_______________________________________________
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"

Reply via email to