cmp: add -i, --ignore-initial, an alternative to skip1/skip2 args
This is compatible with GNU cmp. Reviewed by: markj Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D32073
This commit is contained in:
parent
4e380e8474
commit
8d546b6832
@ -41,6 +41,7 @@
|
|||||||
.Nm
|
.Nm
|
||||||
.Op Fl l | s | x
|
.Op Fl l | s | x
|
||||||
.Op Fl hz
|
.Op Fl hz
|
||||||
|
.Op Fl -ignore-initial Ns Cm = Ns Ar num1 Ns Op :num2
|
||||||
.Op Fl -bytes Ns Cm = Ns Ar num
|
.Op Fl -bytes Ns Cm = Ns Ar num
|
||||||
.Ar file1 file2
|
.Ar file1 file2
|
||||||
.Op Ar skip1 Op Ar skip2
|
.Op Ar skip1 Op Ar skip2
|
||||||
@ -60,6 +61,23 @@ The following options are available:
|
|||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It Fl h
|
.It Fl h
|
||||||
Do not follow symbolic links.
|
Do not follow symbolic links.
|
||||||
|
.It Fl i Ar num1 Ns Oo :num2 Oc , Fl -ignore-initial= Ns Ar num1 Ns Op :num2
|
||||||
|
Skip
|
||||||
|
.Ar num1
|
||||||
|
bytes from
|
||||||
|
.Ar file1 ,
|
||||||
|
and optionally skip
|
||||||
|
.Ar num2
|
||||||
|
bytes from
|
||||||
|
.Ar file2 .
|
||||||
|
If
|
||||||
|
.Ar num2
|
||||||
|
is not specified, then
|
||||||
|
.Ar num1
|
||||||
|
is applied for both
|
||||||
|
.Ar file1
|
||||||
|
and
|
||||||
|
.Ar file2 .
|
||||||
.It Fl l , Fl -verbose
|
.It Fl l , Fl -verbose
|
||||||
Print the byte number (decimal) and the differing
|
Print the byte number (decimal) and the differing
|
||||||
byte values (octal) for each difference.
|
byte values (octal) for each difference.
|
||||||
@ -170,6 +188,7 @@ utility is expected to be
|
|||||||
compatible.
|
compatible.
|
||||||
The
|
The
|
||||||
.Fl h ,
|
.Fl h ,
|
||||||
|
.Fl i ,
|
||||||
.Fl n ,
|
.Fl n ,
|
||||||
.Fl x ,
|
.Fl x ,
|
||||||
and
|
and
|
||||||
|
@ -66,6 +66,7 @@ bool lflag, sflag, xflag, zflag;
|
|||||||
|
|
||||||
static const struct option long_opts[] =
|
static const struct option long_opts[] =
|
||||||
{
|
{
|
||||||
|
{"ignore-initial", required_argument, NULL, 'i'},
|
||||||
{"verbose", no_argument, NULL, 'l'},
|
{"verbose", no_argument, NULL, 'l'},
|
||||||
{"bytes", required_argument, NULL, 'n'},
|
{"bytes", required_argument, NULL, 'n'},
|
||||||
{"silent", no_argument, NULL, 's'},
|
{"silent", no_argument, NULL, 's'},
|
||||||
@ -75,6 +76,25 @@ static const struct option long_opts[] =
|
|||||||
|
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
|
|
||||||
|
static bool
|
||||||
|
parse_iskipspec(char *spec, off_t *skip1, off_t *skip2)
|
||||||
|
{
|
||||||
|
char *colon;
|
||||||
|
|
||||||
|
colon = strchr(spec, ':');
|
||||||
|
if (colon != NULL)
|
||||||
|
*colon++ = '\0';
|
||||||
|
|
||||||
|
if (expand_number(spec, skip1) < 0)
|
||||||
|
return (false);
|
||||||
|
|
||||||
|
if (colon != NULL)
|
||||||
|
return (expand_number(colon, skip2) == 0);
|
||||||
|
|
||||||
|
*skip2 = *skip1;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -86,11 +106,19 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
skip1 = skip2 = 0;
|
skip1 = skip2 = 0;
|
||||||
oflag = O_RDONLY;
|
oflag = O_RDONLY;
|
||||||
while ((ch = getopt_long(argc, argv, "+hln:sxz", long_opts, NULL)) != -1)
|
while ((ch = getopt_long(argc, argv, "+hi:ln:sxz", long_opts, NULL)) != -1)
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'h': /* Don't follow symlinks */
|
case 'h': /* Don't follow symlinks */
|
||||||
oflag |= O_NOFOLLOW;
|
oflag |= O_NOFOLLOW;
|
||||||
break;
|
break;
|
||||||
|
case 'i':
|
||||||
|
if (!parse_iskipspec(optarg, &skip1, &skip2)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Invalid --ignore-initial: %s\n",
|
||||||
|
optarg);
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'l': /* print all differences */
|
case 'l': /* print all differences */
|
||||||
lflag = true;
|
lflag = true;
|
||||||
break;
|
break;
|
||||||
|
@ -71,8 +71,13 @@ pr252542_body()
|
|||||||
{
|
{
|
||||||
echo -n '1234567890' > a
|
echo -n '1234567890' > a
|
||||||
echo -n 'abc567890' > b
|
echo -n 'abc567890' > b
|
||||||
|
echo -n 'xbc567890' > c
|
||||||
atf_check -s exit:0 cmp -s a b 4 3
|
atf_check -s exit:0 cmp -s a b 4 3
|
||||||
|
atf_check -s exit:0 cmp -i 4:3 -s a b
|
||||||
|
atf_check -s exit:0 cmp -i 1 -s b c
|
||||||
atf_check -s exit:1 -o ignore cmp -z a b 4 3
|
atf_check -s exit:1 -o ignore cmp -z a b 4 3
|
||||||
|
atf_check -s exit:1 -o ignore cmp -i 4:3 -z a b
|
||||||
|
atf_check -s exit:1 -o ignore cmp -i 1 -z a b
|
||||||
}
|
}
|
||||||
|
|
||||||
atf_test_case skipsuff
|
atf_test_case skipsuff
|
||||||
|
Loading…
Reference in New Issue
Block a user