[hackers] [sbase] Audit cal(1) || FRIGN

From: <git_AT_suckless.org>
Date: Sun, 8 Mar 2015 21:32:52 +0100 (CET)

commit 56cd2f2be702235238e5dfdadf513be3f89201ff
Author: FRIGN <dev_AT_frign.de>
Date: Sun Mar 8 21:28:32 2015 +0100

    Audit cal(1)
    
    1) Update manpage with the num-syntax.
    2) Use size_t for years and derivatives.
    3) Use putchar instead of printf wherever possible.
    4) Update usage().
    5) Style changes.

diff --git a/README b/README
index a58fdcf..9862817 100644
--- a/README
+++ b/README
_AT_@ -10,7 +10,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
     UTILITY POSIX 2008 COMPLIANT MISSING OPTIONS
     ------- -------------------- ---------------
 =*| basename yes none
-=* cal yes none
+=*| cal yes none
 =*| cat yes none
 =* chgrp yes none
 =*| chmod yes none
diff --git a/cal.1 b/cal.1
index 5b33591..ea26877 100644
--- a/cal.1
+++ b/cal.1
_AT_@ -1,4 +1,4 @@
-.Dd January 18, 2015
+.Dd March 8, 2015
 .Dt CAL 1
 .Os sbase
 .Sh NAME
_AT_@ -6,53 +6,55 @@
 .Nd show calendar
 .Sh SYNOPSIS
 .Nm
-.Op Fl 1 | Fl 3 | Fl y | Fl n Ar nmonths
-.Op Fl s | Fl m | Fl f Ar firstday
-.Op Fl c Ar columns
+.Op Fl 1 | Fl 3 | Fl y | Fl n Ar num
+.Op Fl s | Fl m | Fl f Ar num
+.Op Fl c Ar num
 .Oo Oo Ar month Oc Ar year Oc
 .Sh DESCRIPTION
-Print
-.Ar nmonths
-calendars side by side beginning with
+.Nm
+writes a calendar of
 .Ar month
 and
-.Ar year .
-Each row of calendars contains at most
-.Ar columns
-calendars. The date formatting is obtained using
-.Xr localtime 3 .
-.Pp
+.Ar year
+or the current month to stdout.
 If
 .Ar year
 is given without
 .Ar month ,
-print the whole year, unless overridden by other options.
+.Nm
+writes a 3-column calendar of the whole
+year to stdout.
+The date formatting is according to
+.Xr localtime 3 .
 .Pp
 The Julian calendar is used until Sep 2, 1752. The Gregorian calendar is used
 starting the next day on Sep 14, 1752.
 .Sh OPTIONS
 .Bl -tag -width Ds
 .It Fl 1
-Output current month. This is the default.
+Print current month. This is the default.
 .It Fl 3
-Output previous, current and next month.
-.It Fl c Ar columns
-Set number of calendars in a row. The default is 3.
-.It Fl f Ar firstday
-Output
-.Ar firstday
+Print previous, current and next month.
+.It Fl c Ar num
+Print
+.Ar num
+calendars in a row. The default is 3.
+.It Fl f Ar num
+Set
+.Ar num
 (0 is Sunday, 6 is Saturday) as first day of week.
 .It Fl m
-Output Monday as first day of week.
-.It Fl n Ar nmonths
-Output in total
-.Ar nmonths
-starting from the current month.
+Set Monday as first day of week.
+.It Fl n Ar num
+Output
+.Ar num
+months starting from and including the current month.
 .It Fl s
-Output Sunday as first day of week.
-.It Fl y Ar year
-Output an entire
-.Ar year .
+Set Sunday as first day of week.
+.It Fl y
+Print the entire
+.Ar year
+or current year.
 .El
 .Sh SEE ALSO
 .Xr localtime 3
_AT_@ -64,5 +66,5 @@ utility is compliant with the
 specification.
 .Pp
 The flags
-.Op Fl 13ynsmfc
+.Op Fl 13cfmnsy
 are an extension to that specification.
diff --git a/cal.c b/cal.c
index 2dfa8ad..4e7dbb8 100644
--- a/cal.c
+++ b/cal.c
_AT_@ -1,5 +1,6 @@
 /* See LICENSE file for copyright and license details. */
 #include <limits.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
_AT_@ -11,7 +12,7 @@ enum caltype { JULIAN, GREGORIAN };
 enum { TRANS_YEAR = 1752, TRANS_MONTH = SEP, TRANS_DAY = 2 };
 
 static int
-isleap(int year, enum caltype cal)
+isleap(size_t year, enum caltype cal)
 {
         if (cal == GREGORIAN) {
                 if (year % 400 == 0)
_AT_@ -26,23 +27,23 @@ isleap(int year, enum caltype cal)
 }
 
 static int
-monthlength(int year, int month, enum caltype cal)
+monthlength(size_t year, int month, enum caltype cal)
 {
         int mdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
- return (month == FEB && isleap(year,cal)) ? 29 : mdays[month];
+ return (month == FEB && isleap(year, cal)) ? 29 : mdays[month];
 }
 
 /* From http://www.tondering.dk/claus/cal/chrweek.php#calcdow */
 static int
-dayofweek(int year, int month, int dom, enum caltype cal)
+dayofweek(size_t year, int month, int dom, enum caltype cal)
 {
- int m, y, a;
+ size_t y;
+ int m, a;
 
- month += 1; /* in this formula, 1 <= month <= 12 */
- a = (14 - month) / 12;
+ a = (13 - month) / 12;
         y = year - a;
- m = month + 12 * a - 2;
+ m = month + 12 * a - 1;
 
         if (cal == GREGORIAN)
                 return (dom + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7;
_AT_@ -51,22 +52,19 @@ dayofweek(int year, int month, int dom, enum caltype cal)
 }
 
 static void
-printgrid(int year, int month, int fday, int line)
+printgrid(size_t year, int month, int fday, int line)
 {
         enum caltype cal;
- int trans; /* are we in the transition from Julian to Gregorian? */
- int offset, dom, d = 0;
+ int offset, dom, d = 0, trans; /* are we in the transition from Julian to Gregorian? */
 
- if (year < TRANS_YEAR || (year == TRANS_YEAR && month <= TRANS_MONTH))
- cal = JULIAN;
- else
- cal = GREGORIAN;
+ cal = (year < TRANS_YEAR || (year == TRANS_YEAR && month <= TRANS_MONTH)) ? JULIAN : GREGORIAN;
         trans = (year == TRANS_YEAR && month == TRANS_MONTH);
         offset = dayofweek(year, month, 1, cal) - fday;
+
         if (offset < 0)
                 offset += 7;
         if (line == 1) {
- for ( ; d < offset; ++d)
+ for (; d < offset; ++d)
                         printf(" ");
                 dom = 1;
         } else {
_AT_@ -74,23 +72,24 @@ printgrid(int year, int month, int fday, int line)
                 if (trans && !(line == 2 && fday == 3))
                         dom += 11;
         }
- for ( ; d < 7 && dom <= monthlength(year, month, cal); ++d, ++dom) {
+ for (; d < 7 && dom <= monthlength(year, month, cal); ++d, ++dom) {
                 printf("%2d ", dom);
- if (trans && dom==TRANS_DAY)
+ if (trans && dom == TRANS_DAY)
                         dom += 11;
         }
- for ( ; d < 7; ++d)
+ for (; d < 7; ++d)
                 printf(" ");
 }
 
 static void
-drawcal(int year, int month, int ncols, int nmons, int fday)
+drawcal(size_t year, int month, size_t ncols, size_t nmons, int fday)
 {
         char *smon[] = {" January", " February", " March", " April",
                         " May", " June", " July", " August",
                         "September", " October", " November", " December" };
         char *days[] = { "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", };
- int m, n, col, cur_year, cur_month, line, dow;
+ size_t m, n, col, cur_year, cur_month, dow;
+ int line;
 
         for (m = 0; m < nmons; ) {
                 n = m;
_AT_@ -101,16 +100,16 @@ drawcal(int year, int month, int ncols, int nmons, int fday)
                                 cur_month -= 12;
                                 cur_year += 1;
                         }
- printf(" %s %d ", smon[cur_month], cur_year);
+ printf(" %s %zu ", smon[cur_month], cur_year);
                         printf(" ");
                 }
- printf("\n");
+ putchar('\n');
                 for (col = 0, m = n; m < nmons && col < ncols; ++col, ++m) {
                         for (dow = fday; dow < (fday + 7); ++dow)
                                 printf("%s ", days[dow % 7]);
                         printf(" ");
                 }
- printf("\n");
+ putchar('\n');
                 for (line = 1; line <= 6; ++line) {
                         for (col = 0, m = n; m < nmons && col < ncols; ++col, ++m) {
                                 cur_year = year + m / 12;
_AT_@ -122,7 +121,7 @@ drawcal(int year, int month, int ncols, int nmons, int fday)
                                 printgrid(cur_year, cur_month, fday, line);
                                 printf(" ");
                         }
- printf("\n");
+ putchar('\n');
                 }
         }
 }
_AT_@ -130,16 +129,17 @@ drawcal(int year, int month, int ncols, int nmons, int fday)
 static void
 usage(void)
 {
- eprintf("usage: %s [-1 | -3 | -y | -n nmonths] "
- "[-s | -m | -f firstday] [-c columns] [[month] year]\n", argv0);
+ eprintf("usage: %s [-1 | -3 | -y | -n num] "
+ "[-s | -m | -f num] [-c num] [[month] year]\n", argv0);
 }
 
 int
 main(int argc, char *argv[])
 {
         struct tm *ltime;
- int year, ncols, nmons, month, fday;
         time_t now;
+ size_t year, ncols, nmons;
+ int fday, month;
 
         now = time(NULL);
         ltime = localtime(&now);
_AT_@ -156,14 +156,13 @@ main(int argc, char *argv[])
                 break;
         case '3':
                 nmons = 3;
- month -= 1;
- if (month == 0) {
+ if (--month == 0) {
                         month = 12;
                         year--;
                 }
                 break;
         case 'c':
- ncols = estrtonum(EARGF(usage()), 0, INT_MAX);
+ ncols = estrtonum(EARGF(usage()), 0, MIN(SIZE_MAX, LLONG_MAX));
                 break;
         case 'f':
                 fday = estrtonum(EARGF(usage()), 0, 6);
Received on Sun Mar 08 2015 - 21:32:52 CET

This archive was generated by hypermail 2.3.0 : Sun Mar 08 2015 - 21:36:09 CET