summaryrefslogtreecommitdiff
path: root/difftool/compare_dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'difftool/compare_dir.c')
-rw-r--r--difftool/compare_dir.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/difftool/compare_dir.c b/difftool/compare_dir.c
new file mode 100644
index 0000000..8d4a186
--- /dev/null
+++ b/difftool/compare_dir.c
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * compare_dir.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "difftool.h"
+
+int compare_dir_entries(tree_node_t *a, tree_node_t *b)
+{
+ tree_node_t *ait = a->data.dir->children, *aprev = NULL;
+ tree_node_t *bit = b->data.dir->children, *bprev = NULL;
+ int ret, result = 0;
+ char *path, arrow;
+
+ while (ait != NULL && bit != NULL) {
+ ret = strcmp(ait->name, bit->name);
+
+ if (ret < 0) {
+ result = 1;
+ path = node_path(ait);
+ if (path == NULL)
+ return -1;
+ fprintf(stdout, "< %s\n", path);
+ free(path);
+
+ if (aprev == NULL) {
+ a->data.dir->children = ait->next;
+ free(ait);
+ ait = a->data.dir->children;
+ } else {
+ aprev->next = ait->next;
+ free(ait);
+ ait = aprev->next;
+ }
+ } else if (ret > 0) {
+ result = 1;
+ path = node_path(bit);
+ if (path == NULL)
+ return -1;
+ fprintf(stdout, "> %s\n", path);
+ free(path);
+
+ if (bprev == NULL) {
+ b->data.dir->children = bit->next;
+ free(bit);
+ bit = b->data.dir->children;
+ } else {
+ bprev->next = bit->next;
+ free(bit);
+ bit = bprev->next;
+ }
+ } else {
+ aprev = ait;
+ ait = ait->next;
+
+ bprev = bit;
+ bit = bit->next;
+ }
+ }
+
+ if (ait != NULL || bit != NULL) {
+ result = 1;
+
+ if (ait != NULL) {
+ if (aprev == NULL) {
+ a->data.dir->children = NULL;
+ } else {
+ aprev->next = NULL;
+ }
+ arrow = '<';
+ } else {
+ if (bprev == NULL) {
+ b->data.dir->children = NULL;
+ } else {
+ bprev->next = NULL;
+ }
+ arrow = '>';
+ ait = bit;
+ }
+
+ while (ait != NULL) {
+ path = node_path(ait);
+ if (path == NULL) {
+ result = -1;
+ } else {
+ fprintf(stdout, "%c %s\n", arrow, path);
+ free(path);
+ }
+ aprev = ait;
+ ait = ait->next;
+ free(aprev);
+ }
+ }
+
+ return result;
+}