diff options
author | Kyle Evans <kevans@FreeBSD.org> | 2021-09-23 05:43:32 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2021-09-29 18:03:34 +0000 |
commit | 8d546b6832eea031f95f30eaec3232ec1256a281 (patch) | |
tree | 3d725bdddf93f4fe384ff04b9a8e1ada2ba3ab4d /usr.bin/cmp/cmp.c | |
parent | 4e380e8474609875c4cf5277b3755ac29079a8b5 (diff) | |
download | src-8d546b6832eea031f95f30eaec3232ec1256a281.tar.gz src-8d546b6832eea031f95f30eaec3232ec1256a281.zip |
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
Diffstat (limited to 'usr.bin/cmp/cmp.c')
-rw-r--r-- | usr.bin/cmp/cmp.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/usr.bin/cmp/cmp.c b/usr.bin/cmp/cmp.c index 384c273f4632..256cef8a0c31 100644 --- a/usr.bin/cmp/cmp.c +++ b/usr.bin/cmp/cmp.c @@ -66,6 +66,7 @@ bool lflag, sflag, xflag, zflag; static const struct option long_opts[] = { + {"ignore-initial", required_argument, NULL, 'i'}, {"verbose", no_argument, NULL, 'l'}, {"bytes", required_argument, NULL, 'n'}, {"silent", no_argument, NULL, 's'}, @@ -75,6 +76,25 @@ static const struct option long_opts[] = 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 main(int argc, char *argv[]) { @@ -86,11 +106,19 @@ main(int argc, char *argv[]) skip1 = skip2 = 0; 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) { case 'h': /* Don't follow symlinks */ oflag |= O_NOFOLLOW; break; + case 'i': + if (!parse_iskipspec(optarg, &skip1, &skip2)) { + fprintf(stderr, + "Invalid --ignore-initial: %s\n", + optarg); + usage(); + } + break; case 'l': /* print all differences */ lflag = true; break; |