Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!bunyip.cc.uq.oz.au!harbinger.cc.monash.edu.au!yeshua.marcam.com!news.kei.com!sol.ctr.columbia.edu!emory!swrinde!news.dell.com!natinst.com!hrd769.brooks.af.mil!cynjut.ogisd.ess.harris.com!cynjut.ogisd.ess.harris.com!not-for-mail
From: burgess@cynjut.ogisd.ess.harris.com (Dave Burgess)
Newsgroups: comp.os.386bsd.misc
Subject: Re: Date Comparison function for test(1).
Date: 16 Jan 1994 17:13:56 -0600
Organization: Creative Imagineering
Lines: 376
Message-ID: <2hchnk$9qh@cynjut.ogisd.ess.harris.com>
References: <2hc9qf$aq@cynjut.ogisd.ess.harris.com>
NNTP-Posting-Host: cynjut.ogisd.ess.harris.com
In article <2hc9qf$aq@cynjut.ogisd.ess.harris.com>,
Dave Burgess <burgess@cynjut.ogisd.ess.harris.com> wrote:
>I have made a few changes to the program test to allow date checking for
>two files in a test(1) in the shell. I have modified lots of the source
>code in the /usr/src/bin/test directory. In addition to the normal
>changes to the test.c files, I have also modified the man page to
>include the three new options. These options are:
>
> file1 -nt file2 # File1 is newer than file2
> file1 -ot file2 # File1 is older than file2
> file1 -sa file2 # File1 is EXACTLY the same age as file2
>
>The way that I added this functionality is not intended to be pretty. I
>was most interested in keeping the impact of the changes small. There
>are probably a dozen ways to implment these changes and make them work
>"better". All I know for sure is that these seem to work just fine for
>me.
>
I guess that it is customary to send out the patch with the
announcement.
- - - - - - - - - - - - - - - - Cut Here - - - - - - - - - - - - - - - -
*** ../test/Makefile Thu Dec 16 23:49:10 1993
--- Makefile Sun Jan 9 19:47:52 1994
***************
*** 8,14 ****
MLINKS= test.1 '[.1'
# use this rule to if you update binary_ops, or unary_ops
! make_op:
! sh ${.CURDIR}/mkops
!
.include <bsd.prog.mk>
--- 8,20 ----
MLINKS= test.1 '[.1'
# use this rule to if you update binary_ops, or unary_ops
! #make_op:
! # sh ${.CURDIR}/mkops
! #
! # IF YOU UPDATE binary_ops or unary_ops and have an obj directory link,
! # you MUST run mkops yourself. If you don't, the resulting output
! # files will end up in obj. While that isn't a problem (sine they get
! # correctly compiled after that), this program will not run, since you
! # don't have copies of *_ops in obj.
! #
.include <bsd.prog.mk>
*** ../test/TEST.csh Thu Dec 16 23:49:11 1993
--- TEST.csh Sat Jan 15 16:24:49 1994
***************
*** 1,6 ****
# @(#)TEST.csh 5.1 (Berkeley) 6/8/92
! alias t './test \!*; echo $status'
#alias t 'test \!*; echo $status'
echo 't -b /dev/ttyp2'
--- 1,6 ----
# @(#)TEST.csh 5.1 (Berkeley) 6/8/92
! alias t './obj/test \!*; echo $status'
#alias t 'test \!*; echo $status'
echo 't -b /dev/ttyp2'
***************
*** 135,137 ****
--- 135,167 ----
t 700 -le 1000 -a -n "1" -a "20" = "20"
echo 't ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \)'
t ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \)
+
+ echo 't /etc/passwd -nt ./obj/test'
+ t /etc/passwd -nt ./obj/test
+ echo 't ! /etc/passwd -nt ./obj/test'
+ t ! /etc/passwd -nt ./obj/test
+
+ echo 't /etc/passwd -ot ./obj/test'
+ t /etc/passwd -ot ./obj/test
+ echo 't ! /etc/passwd -ot ./obj/test'
+ t ! /etc/passwd -ot ./obj/test
+
+ echo 't /etc/passwd -sa ./obj/test'
+ t /etc/passwd -sa ./obj/test
+ echo 't ! /etc/passwd -sa ./obj/test'
+ t ! /etc/passwd -sa ./obj/test
+
+ echo 't /etc/passwd -sa /etc/passwd'
+ t /etc/passwd -sa /etc/passwd
+ echo 't ! /etc/passwd -sa /etc/passwd'
+ t ! /etc/passwd -sa /etc/passwd
+
+ echo 't /etc -nt /etc/passwd # Check Dir age vs. file'
+ t /etc -nt /etc/passwd
+ echo 't ! /etc -nt /etc/passwd'
+ t ! /etc -nt /etc/passwd
+
+ echo 't obj -nt /etc/passwd # Check SymLink age vs. file'
+ t obj -nt /etc/passwd
+ echo 't ! obj -nt /etc/passwd'
+ t ! obj -nt /etc/passwd
*** ../test/binary_op Thu Dec 16 23:49:11 1993
--- binary_op Sun Jan 9 19:47:52 1994
***************
*** 53,56 ****
LT -lt 4 OP_INT
LE -le 4 OP_INT
GE -ge 4 OP_INT
!
--- 53,58 ----
LT -lt 4 OP_INT
LE -le 4 OP_INT
GE -ge 4 OP_INT
! NT -nt 4 OP_FILE
! OT -ot 4 OP_FILE
! SA -sa 4 OP_FILE
*** ../test/mkops Thu Dec 16 23:49:12 1993
--- mkops Sun Jan 9 19:47:52 1994
***************
*** 48,53 ****
--- 48,54 ----
extern char *const unary_op[];
extern char *const binary_op[];
+ extern char *const andor_op[];
extern const char op_priority[];
extern const char op_argflag[];'
***************
*** 69,74 ****
--- 70,80 ----
echo ' NULL
};
+ char *const andor_op[] = {'
+ awk '/^OR/ {printf " \"%s\",\n", $2}' binary_op
+ awk '/^AND/ {printf " \"%s\",\n", $2}' binary_op
+ echo ' NULL
+ };
const char op_priority[] = {'
awk '/^[^#]/ {printf " %s,\n", $3}' unary_op binary_op
echo '};
*** ../test/operators.c Thu Dec 16 23:49:12 1993
--- operators.c Sun Jan 9 19:47:53 1994
***************
*** 2,11 ****
* Operators used in the test command.
*/
- #ifndef lint
- static char rcsid[] = "$Id: operators.c,v 1.3 1993/09/23 22:51:17 mycroft Exp $";
- #endif /* not lint */
-
#include <stdio.h>
#include "operators.h"
--- 2,7 ----
***************
*** 43,59 ****
"-lt",
"-le",
"-ge",
NULL
};
char *const andor_op[] = {
! "-o",
! "|",
! "-a",
! "&",
! NULL
};
-
const char op_priority[] = {
3,
12,
--- 39,57 ----
"-lt",
"-le",
"-ge",
+ "-nt",
+ "-ot",
+ "-sa",
NULL
};
char *const andor_op[] = {
! "-o",
! "|",
! "-a",
! "&",
! NULL
};
const char op_priority[] = {
3,
12,
***************
*** 84,89 ****
--- 82,90 ----
4,
4,
4,
+ 4,
+ 4,
+ 4,
};
const char op_argflag[] = {
***************
*** 116,119 ****
--- 117,123 ----
OP_INT,
OP_INT,
OP_INT,
+ OP_FILE,
+ OP_FILE,
+ OP_FILE,
};
*** ../test/operators.h Thu Dec 16 23:49:13 1993
--- operators.h Sun Jan 9 19:47:53 1994
***************
*** 1,5 ****
- /* $Id: operators.h,v 1.3 1993/09/23 22:51:18 mycroft Exp $ */
-
#define NOT 0
#define ISBLOCK 1
#define ISCHAR 2
--- 1,3 ----
***************
*** 29,34 ****
--- 27,35 ----
#define LT 26
#define LE 27
#define GE 28
+ #define NT 29
+ #define OT 30
+ #define SA 31
#define FIRST_BINARY_OP 17
*** ../test/test.1 Thu Dec 16 23:49:13 1993
--- test.1 Sat Jan 15 16:16:42 1994
***************
*** 192,197 ****
--- 192,213 ----
is algebraically less
than or equal to the integer
.Ar \&n\&2 .
+ .\" New stuff
+ .It Ar \&file\&1 Fl \&nt Ar \&file\&2
+ True if file
+ .Ar \&file\&1
+ is newer than
+ .Ar \&file\&2 .
+ .It Ar \&file\&1 Fl \&ot Ar \&file\&2
+ True if the integer
+ .Ar \&file\&1
+ is older than
+ .Ar \&file\&2 .
+ .It Ar \&file\&1 Fl \&sa Ar \&file\&2
+ True if the integer
+ .Ar \&file\&1
+ is the \&same \&age as
+ .Ar \&file\&2 .
.El
.Pp
These primaries can be combined with the following operators:
*** ../test/test.c Thu Dec 16 23:49:14 1993
--- test.c Sat Jan 15 16:02:21 1994
***************
*** 419,424 ****
--- 419,425 ----
sp->type = BOOLEAN;
break;
case EQ:
+ case SA:
if (sp->u.num == (sp + 1)->u.num)
goto true;
goto false;
***************
*** 427,436 ****
--- 428,439 ----
goto true;
goto false;
case GT:
+ case NT:
if (sp->u.num > (sp + 1)->u.num)
goto true;
goto false;
case LT:
+ case OT:
if (sp->u.num < (sp + 1)->u.num)
goto true;
goto false;
***************
*** 442,448 ****
if (sp->u.num >= (sp + 1)->u.num)
goto true;
goto false;
-
}
}
--- 445,450 ----
***************
*** 491,496 ****
--- 493,499 ----
posix_binary_op(argv)
char **argv;
{
+ struct filestat fs;
struct value v[2];
int op, c;
char *opname;
***************
*** 501,510 ****
op += FIRST_BINARY_OP;
c = op_argflag[op];
! if (c == OP_INT) {
v[0].u.num = chk_atol(argv[0]);
v[1].u.num = chk_atol(argv[2]);
! } else {
v[0].u.string = argv[0];
v[1].u.string = argv[2];
}
--- 504,546 ----
op += FIRST_BINARY_OP;
c = op_argflag[op];
! opname = argv[0];
! v[0].u.string = opname;
! if (c == OP_FILE) {
! fs.name = opname;
! fs.rcode = stat(opname, &fs.stat);
! if (fs.rcode < 0) {
! err("file not found: %s\n",opname);
! v[0].u.num = 0L;
! } else {
! v[0].u.num = fs.stat.st_ctime;
! #ifdef CHECKING_DATES
! fprintf(stderr,"ctime = %s\n",ctime(&fs.stat.st_ctime));
! #endif
! }
! }
! opname = argv[2];
! v[1].u.string = opname;
! if (c == OP_FILE) {
! fs.name = opname;
! fs.rcode = stat(opname, &fs.stat);
! if (fs.rcode < 0) {
! err("file not found: %s\n",opname);
! v[1].u.num = 0L;
! } else {
! v[1].u.num = fs.stat.st_ctime;
! #ifdef CHECKING_DATES
! fprintf(stderr,"ctime = %s\n",ctime(&fs.stat.st_ctime));
! #endif
! }
! }
!
! if (c == OP_FILE) { /* Checking file dates */
! c = OP_INT;
! } else if (c == OP_INT) {
v[0].u.num = chk_atol(argv[0]);
v[1].u.num = chk_atol(argv[2]);
! } else {
v[0].u.string = argv[0];
v[1].u.string = argv[2];
}
--
------
TSgt Dave Burgess | Dave Burgess
NCOIC, USSTRATCOM/J6444 | *BSD FAQ Maintainer
Offutt AFB, NE | Burgess@hrd769.brooks.af.mil