aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/cmp/cmp.c
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2021-09-23 05:43:32 +0000
committerKyle Evans <kevans@FreeBSD.org>2021-09-29 18:03:34 +0000
commit8d546b6832eea031f95f30eaec3232ec1256a281 (patch)
tree3d725bdddf93f4fe384ff04b9a8e1ada2ba3ab4d /usr.bin/cmp/cmp.c
parent4e380e8474609875c4cf5277b3755ac29079a8b5 (diff)
downloadsrc-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.c30
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;