aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFerass El Hafidi <vitali64pmemail@protonmail.com>2023-02-21 19:11:14 +0100
committerFerass El Hafidi <vitali64pmemail@protonmail.com>2023-02-21 19:11:26 +0100
commitfdc736b1f59c620a5bb9c985f426aeb9ddb981d2 (patch)
treef09faecc0e97559cca4cba1613ca26d9d92eeb28
parent71d2faf09cf18536e7d690c7e26a55c99effac85 (diff)
downloadfases-fdc736b1f59c620a5bb9c985f426aeb9ddb981d2.tar.gz
fases-fdc736b1f59c620a5bb9c985f426aeb9ddb981d2.zip
core/: cmp
Signed-off-by: Ferass El Hafidi <vitali64pmemail@protonmail.com>
-rw-r--r--config.mk1
-rw-r--r--core/cmp.c54
2 files changed, 55 insertions, 0 deletions
diff --git a/config.mk b/config.mk
index 1585b79..7837b3b 100644
--- a/config.mk
+++ b/config.mk
@@ -14,6 +14,7 @@ CORE=\
cat\
chmod\
chown\
+ cmp\
date\
dirname\
echo\
diff --git a/core/cmp.c b/core/cmp.c
new file mode 100644
index 0000000..424b595
--- /dev/null
+++ b/core/cmp.c
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+/* Requirements in common.h */
+#define REQ_PRINT_USAGE
+#define REQ_ERRPRINT
+#include "../common/common.h"
+
+#define DESCRIPTION "Compare two files."
+#define OPERANDS "[-l|-s] file1 file2"
+
+int main(int argc, char *argv[]) {
+ FILE *file1, *file2;
+ int argument, char_pos = 1, line_pos = 1, param_l, param_s, differ;
+ char *argv0 = strdup(argv[0]), ch1, ch2;
+
+ while ((argument = getopt(argc, argv, "ls")) != -1) {
+ if (argument == '?')
+ return print_usage(argv0, DESCRIPTION, OPERANDS, VERSION);
+ else if (argument == 'l') param_l = 1;
+ else if (argument == 's') param_s = 1;
+ } argc -= optind; argv += optind;
+ if (argc != 2) return print_usage(argv0, DESCRIPTION, OPERANDS, VERSION);
+
+ /* Open the files. */
+ file1 = fopen(argv[0], "r");
+ file2 = fopen(argv[1], "r");
+ if (file1 == NULL)
+ return errprint(argv0, argv[0], errno);
+ else if (file2 == NULL)
+ return errprint(argv0, argv[1], errno);
+
+ /* Compare! */
+ while ((ch1 = fgetc(file1)) && (ch2 = fgetc(file2))) {
+ if (ch1 == -1 || ch2 == -1) {
+ return errprint(argv0, "fgetc()", errno);
+ } else if (ch1 != ch2) {
+ differ = 1;
+ if (param_l)
+ printf("%d %o %o\n", char_pos, ch1, ch2);
+ else if (!param_s)
+ printf("%s %s differ: char %d, line %d\n", argv[0], argv[1],
+ char_pos, line_pos);
+ if (!param_l) break;
+ }
+ if (ch1 == '\n' && ch2 == '\n')
+ line_pos++;
+ char_pos++;
+ }
+ return differ;
+}