Date: Wed, 22 Apr 2009 02:06:43 -0400 From: David Schultz <das@FreeBSD.ORG> To: Roman Divacky <rdivacky@FreeBSD.ORG> Cc: svn-src-head@FreeBSD.ORG, svn-src-all@FreeBSD.ORG, src-committers@FreeBSD.ORG, Robert Watson <rwatson@FreeBSD.ORG> Subject: Re: svn commit: r191330 - head/usr.bin/ncal Message-ID: <20090422060643.GA22109@zim.MIT.EDU> In-Reply-To: <20090421203106.GA13661@freebsd.org> References: <200904201819.n3KIJcZo054306@svn.freebsd.org> <20090421185436.GA18628@zim.MIT.EDU> <20090421190651.GA2505@freebsd.org> <20090421194622.GA19215@zim.MIT.EDU> <alpine.BSF.2.00.0904212046360.67705@fledge.watson.org> <20090421202754.GA19417@zim.MIT.EDU> <20090421203106.GA13661@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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'; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090422060643.GA22109>