summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>1999-03-09 09:38:54 +0000
committerBrian Somers <brian@FreeBSD.org>1999-03-09 09:38:54 +0000
commit269dfbee64dab12210fe203af4daf19f1f77a35f (patch)
tree2537f56f3f6d256c65090e1ba0dbf703dc8c33a6
parent00d4f4a5f44d4214432f55e613f089ffc2af9642 (diff)
Notes
-rw-r--r--bin/date/date.121
-rw-r--r--bin/date/date.c4
-rw-r--r--bin/date/vary.c43
3 files changed, 55 insertions, 13 deletions
diff --git a/bin/date/date.1 b/bin/date/date.1
index cf0c792626c9..11a59d6dcba7 100644
--- a/bin/date/date.1
+++ b/bin/date/date.1
@@ -33,7 +33,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)date.1 8.3 (Berkeley) 4/28/95
-.\" $Id: date.1,v 1.25 1998/05/13 07:56:44 phk Exp $
+.\" $Id: date.1,v 1.26 1999/01/13 07:01:07 danny Exp $
.\"
.Dd November 17, 1993
.Dt DATE 1
@@ -47,7 +47,7 @@
.Op Fl d Ar dst
.Op Fl r Ar seconds
.Op Fl t Ar minutes_west
-.Op Fl v Ns Ar [+|-]val Ns Op ymwdHM
+.Op Fl v Ns Ar [+|-]val Ns Op ymwdHMS
.Ar ...
.Op Fl f Ar fmt Ar date | [[[[yy]mm]dd]HH]MM[\&.ss]
.Op Cm + Ns Ar format
@@ -108,8 +108,8 @@ Display or set the date in
.Tn UCT
(universal) time.
.It Fl v
-Adjust the minute, hour, month day, week day, month or year according to
-.Ar val .
+Adjust the second, minute, hour, month day, week day, month or year according to
+.Ar val .
If
.Ar val
is preceded with a plus or minus sign, the date is adjusted forwards
@@ -117,10 +117,10 @@ or backwards according to the remaining string, otherwise the relevant
part of the date is set. The date can be adjusted as many times as
required using these flags. Flags are processed in the order given.
.Pp
-Minutes are in the range 0-59, hours are in the range 1-12, month days
-are in the range 1-31, week days are in the range 0-6 (Sun-Sat), months
-are in the range 1-12 (Jan-Dec) and years are in the range 80-38 or
-1980-2038.
+Seconds are in the range 0-59, minutes are in the range 0-59, hours are
+in the range 1-12, month days are in the range 1-31, week days are in the
+range 0-6 (Sun-Sat), months are in the range 1-12 (Jan-Dec) and years are
+in the range 80-38 or 1980-2038.
.Pp
If
.Ar val
@@ -129,9 +129,10 @@ is numeric, one of either
.Ar m ,
.Ar w ,
.Ar d ,
-.Ar H
-or
+.Ar H ,
.Ar M
+or
+.Ar S
must be used to specify which part of the date is to be adjusted.
.Pp
The week day or month may be specified using a name rather than a
diff --git a/bin/date/date.c b/bin/date/date.c
index 043cdccd015b..e116e3d49f50 100644
--- a/bin/date/date.c
+++ b/bin/date/date.c
@@ -42,7 +42,7 @@ static char const copyright[] =
static char sccsid[] = "@(#)date.c 8.2 (Berkeley) 4/28/95";
#endif
static const char rcsid[] =
- "$Id: date.c,v 1.25 1998/05/13 07:31:39 charnier Exp $";
+ "$Id: date.c,v 1.26 1998/10/03 16:29:59 alex Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -278,7 +278,7 @@ usage()
{
(void)fprintf(stderr, "%s\n%s\n",
"usage: date [-nu] [-d dst] [-r seconds] [-t west] "
- "[-v[+|-]val[ymwdHM]] ... ",
+ "[-v[+|-]val[ymwdHMS]] ... ",
" [-f fmt date | [[[[yy]mm]dd]HH]MM[.ss]] [+format]");
exit(1);
}
diff --git a/bin/date/vary.c b/bin/date/vary.c
index a6419d5b8635..d2345d4b2d61 100644
--- a/bin/date/vary.c
+++ b/bin/date/vary.c
@@ -26,7 +26,7 @@
#ifndef lint
static const char rcsid[] =
- "$Id$";
+ "$Id: vary.c,v 1.4 1998/05/06 06:51:20 charnier Exp $";
#endif /* not lint */
#include <time.h>
@@ -332,6 +332,43 @@ adjmin(struct tm *t, char type, int val)
return mktime(t) != -1;
}
+static int
+adjsec(struct tm *t, char type, int val)
+{
+ if (val < 0)
+ return 0;
+
+ switch (type) {
+ case '+':
+ if (!adjmin(t, '+', (t->tm_sec + val) / 60))
+ return 0;
+ val %= 60;
+ t->tm_sec += val;
+ if (t->tm_sec > 59)
+ t->tm_sec -= 60;
+ break;
+
+ case '-':
+ if (!adjmin(t, '-', val / 60))
+ return 0;
+ val %= 60;
+ if (val > t->tm_sec) {
+ if (!adjmin(t, '-', 1))
+ return 0;
+ val -= 60;
+ }
+ t->tm_sec -= val;
+ break;
+
+ default:
+ if (val > 59)
+ return 0;
+ t->tm_sec = val;
+ }
+
+ return mktime(t) != -1;
+}
+
const struct vary *
vary_apply(const struct vary *v, struct tm *t)
{
@@ -370,6 +407,10 @@ vary_apply(const struct vary *v, struct tm *t)
which = arg[len-1];
switch (which) {
+ case 'S':
+ if (!adjsec(t, type, val))
+ return v;
+ break;
case 'M':
if (!adjmin(t, type, val))
return v;