commit - 527f2c8a94ec96cdf79504060f948ec88c070289
commit + e4464189bc895121565a7a02eef98262343e6e24
blob - 84e300ed36abdaf7a9949b72130ac7e7272686fe (mode 644)
blob + /dev/null
--- lib/debug.h
+++ /dev/null
-/*
- * Copyright (c) 2020 Neels Hofmeyr <neels@hofmeyr.de>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#define DEBUG 0
-
-#if DEBUG
-#include <stdio.h>
-#include <unistd.h>
-#define print(args...) fprintf(stderr, ##args)
-#define debug print
-#define debug_dump dump
-#define debug_dump_atom dump_atom
-#define debug_dump_atoms dump_atoms
-
-static inline void
-print_atom_byte(unsigned char c) {
- if (c == '\r')
- print("\\r");
- else if (c == '\n')
- print("\\n");
- else if ((c < 32 || c >= 127) && (c != '\t'))
- print("\\x%02x", c);
- else
- print("%c", c);
-}
-
-static inline void
-dump_atom(const struct diff_data *left, const struct diff_data *right,
- const struct diff_atom *atom)
-{
- if (!atom) {
- print("NULL atom\n");
- return;
- }
- if (left)
- print(" %3ld", diff_atom_root_idx(left, atom));
- if (right && atom->patience.pos_in_other)
- print(" %3ld",
- diff_atom_root_idx(right, atom->patience.pos_in_other));
-
- print(" %s%s '",
- atom->patience.unique_here ? "u" : " ",
- atom->patience.unique_in_both ? "c" : " ");
- if (atom->at == NULL) {
- unsigned long long total = 0;
- off_t remain = atom->len;
- if (lseek(atom->d->root->fd, atom->pos, SEEK_SET) == -1)
- abort(); /* cannot return error */
- while (remain > 0) {
- char buf[16];
- ssize_t r;
- int i;
- r = read(atom->d->root->fd, buf,
- MIN(remain, sizeof(buf)));
- if (r == -1)
- abort(); /* cannot return error */
- if (r == 0)
- break;
- remain -= r;
- for (i = 0; i < r; i++)
- print_atom_byte(buf[i]);
- }
- } else {
- const char *s;
- for (s = atom->at; s < (const char*)(atom->at + atom->len); s++)
- print_atom_byte(*s);
- }
- print("'\n");
-}
-
-static inline void
-dump_atoms(const struct diff_data *d, struct diff_atom *atom,
- unsigned int count)
-{
- if (count > 42) {
- dump_atoms(d, atom, 20);
- print("[%u lines skipped]\n", count - 20 - 20);
- dump_atoms(d, atom + count - 20, 20);
- return;
- } else {
- struct diff_atom *i;
- foreach_diff_atom(i, atom, count) {
- dump_atom(d, NULL, i);
- }
- }
-}
-
-static inline void
-dump(struct diff_data *d)
-{
- dump_atoms(d, d->atoms.head, d->atoms.len);
-}
-
-/* kd is a quadratic space myers matrix from the original Myers algorithm.
- * kd_forward and kd_backward are linear slices of a myers matrix from the Myers
- * Divide algorithm.
- */
-static inline void
-dump_myers_graph(const struct diff_data *l, const struct diff_data *r,
- int *kd, int *kd_forward, int kd_forward_d,
- int *kd_backward, int kd_backward_d)
-{
- #define COLOR_YELLOW "\033[1;33m"
- #define COLOR_GREEN "\033[1;32m"
- #define COLOR_BLUE "\033[1;34m"
- #define COLOR_RED "\033[1;31m"
- #define COLOR_END "\033[0;m"
- int x;
- int y;
- print(" ");
- for (x = 0; x <= l->atoms.len; x++)
- print("%2d", x % 100);
- print("\n");
-
- for (y = 0; y <= r->atoms.len; y++) {
- print("%3d ", y);
- for (x = 0; x <= l->atoms.len; x++) {
-
- /* print d advancements from kd, if any. */
- char label = 'o';
- char *color = NULL;
- if (kd) {
- int max = l->atoms.len + r->atoms.len;
- size_t kd_len = max + 1 + max;
- int *kd_pos = kd;
- int di;
-#define xk_to_y(X, K) ((X) - (K))
- for (di = 0; di < max; di++) {
- int ki;
- for (ki = di; ki >= -di; ki -= 2) {
- if (x != kd_pos[ki]
- || y != xk_to_y(x, ki))
- continue;
- label = '0' + (di % 10);
- color = COLOR_YELLOW;
- break;
- }
- if (label != 'o')
- break;
- kd_pos += kd_len;
- }
- }
- if (kd_forward && kd_forward_d >= 0) {
- int max = l->atoms.len + r->atoms.len;
- size_t kd_len = max + 1 + max;
- int di;
-#define xc_to_y(X, C, DELTA) ((X) - (C) + (DELTA))
- int delta = (int)r->atoms.len
- - (int)l->atoms.len;
- int ki;
- for (ki = kd_forward_d;
- ki >= -kd_forward_d;
- ki -= 2) {
- if (x != kd_forward[ki])
- continue;
- if (y != xk_to_y(x, ki))
- continue;
- label = 'F';
- color = COLOR_GREEN;
- break;
- }
- }
- if (kd_backward && kd_backward_d >= 0) {
- int max = l->atoms.len + r->atoms.len;
- size_t kd_len = max + 1 + max;
- int di;
- int delta = (int)r->atoms.len
- - (int)l->atoms.len;
- int ki;
- for (ki = kd_backward_d;
- ki >= -kd_backward_d;
- ki -= 2) {
- if (x != kd_backward[ki])
- continue;
- if (y != xc_to_y(x, ki, delta))
- continue;
- if (label == 'o') {
- label = 'B';
- color = COLOR_BLUE;
- } else {
- label = 'X';
- color = COLOR_RED;
- }
- break;
- }
- }
- if (color)
- print("%s", color);
- print("%c", label);
- if (color)
- print("%s", COLOR_END);
- if (x < l->atoms.len)
- print("-");
- }
- print("\n");
- if (y == r->atoms.len)
- break;
-
- print(" ");
- for (x = 0; x < l->atoms.len; x++) {
- if (diff_atom_same(&l->atoms.head[x],
- &r->atoms.head[y]))
- print("|\\");
- else
- print("| ");
- }
- print("|\n");
- }
-}
-
-static inline void
-debug_dump_myers_graph(const struct diff_data *l, const struct diff_data *r,
- int *kd, int *kd_forward, int kd_forward_d,
- int *kd_backward, int kd_backward_d)
-{
- if (l->atoms.len > 99 || r->atoms.len > 99)
- return;
- dump_myers_graph(l, r, kd, kd_forward, kd_forward_d,
- kd_backward, kd_backward_d);
-}
-
-#else
-#define debug(args...)
-#define debug_dump(args...)
-#define debug_dump_atom(args...)
-#define debug_dump_atoms(args...)
-#define debug_dump_myers_graph(args...)
-#endif
blob - 55b5f9b57a9ec3733e9f55dadb03d68735b08412
blob + 139329941db7f78569ec98d16b7566f4caab8937
--- lib/diff_atomize_text.c
+++ lib/diff_atomize_text.c
#include <diff/arraylist.h>
#include <diff/diff_main.h>
-#include "debug.h"
+#include "diff_debug.h"
static int
diff_data_atomize_text_lines_fd(struct diff_data *d)
blob - /dev/null
blob + 84e300ed36abdaf7a9949b72130ac7e7272686fe (mode 644)
--- /dev/null
+++ lib/diff_debug.h
+/*
+ * Copyright (c) 2020 Neels Hofmeyr <neels@hofmeyr.de>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define DEBUG 0
+
+#if DEBUG
+#include <stdio.h>
+#include <unistd.h>
+#define print(args...) fprintf(stderr, ##args)
+#define debug print
+#define debug_dump dump
+#define debug_dump_atom dump_atom
+#define debug_dump_atoms dump_atoms
+
+static inline void
+print_atom_byte(unsigned char c) {
+ if (c == '\r')
+ print("\\r");
+ else if (c == '\n')
+ print("\\n");
+ else if ((c < 32 || c >= 127) && (c != '\t'))
+ print("\\x%02x", c);
+ else
+ print("%c", c);
+}
+
+static inline void
+dump_atom(const struct diff_data *left, const struct diff_data *right,
+ const struct diff_atom *atom)
+{
+ if (!atom) {
+ print("NULL atom\n");
+ return;
+ }
+ if (left)
+ print(" %3ld", diff_atom_root_idx(left, atom));
+ if (right && atom->patience.pos_in_other)
+ print(" %3ld",
+ diff_atom_root_idx(right, atom->patience.pos_in_other));
+
+ print(" %s%s '",
+ atom->patience.unique_here ? "u" : " ",
+ atom->patience.unique_in_both ? "c" : " ");
+ if (atom->at == NULL) {
+ unsigned long long total = 0;
+ off_t remain = atom->len;
+ if (lseek(atom->d->root->fd, atom->pos, SEEK_SET) == -1)
+ abort(); /* cannot return error */
+ while (remain > 0) {
+ char buf[16];
+ ssize_t r;
+ int i;
+ r = read(atom->d->root->fd, buf,
+ MIN(remain, sizeof(buf)));
+ if (r == -1)
+ abort(); /* cannot return error */
+ if (r == 0)
+ break;
+ remain -= r;
+ for (i = 0; i < r; i++)
+ print_atom_byte(buf[i]);
+ }
+ } else {
+ const char *s;
+ for (s = atom->at; s < (const char*)(atom->at + atom->len); s++)
+ print_atom_byte(*s);
+ }
+ print("'\n");
+}
+
+static inline void
+dump_atoms(const struct diff_data *d, struct diff_atom *atom,
+ unsigned int count)
+{
+ if (count > 42) {
+ dump_atoms(d, atom, 20);
+ print("[%u lines skipped]\n", count - 20 - 20);
+ dump_atoms(d, atom + count - 20, 20);
+ return;
+ } else {
+ struct diff_atom *i;
+ foreach_diff_atom(i, atom, count) {
+ dump_atom(d, NULL, i);
+ }
+ }
+}
+
+static inline void
+dump(struct diff_data *d)
+{
+ dump_atoms(d, d->atoms.head, d->atoms.len);
+}
+
+/* kd is a quadratic space myers matrix from the original Myers algorithm.
+ * kd_forward and kd_backward are linear slices of a myers matrix from the Myers
+ * Divide algorithm.
+ */
+static inline void
+dump_myers_graph(const struct diff_data *l, const struct diff_data *r,
+ int *kd, int *kd_forward, int kd_forward_d,
+ int *kd_backward, int kd_backward_d)
+{
+ #define COLOR_YELLOW "\033[1;33m"
+ #define COLOR_GREEN "\033[1;32m"
+ #define COLOR_BLUE "\033[1;34m"
+ #define COLOR_RED "\033[1;31m"
+ #define COLOR_END "\033[0;m"
+ int x;
+ int y;
+ print(" ");
+ for (x = 0; x <= l->atoms.len; x++)
+ print("%2d", x % 100);
+ print("\n");
+
+ for (y = 0; y <= r->atoms.len; y++) {
+ print("%3d ", y);
+ for (x = 0; x <= l->atoms.len; x++) {
+
+ /* print d advancements from kd, if any. */
+ char label = 'o';
+ char *color = NULL;
+ if (kd) {
+ int max = l->atoms.len + r->atoms.len;
+ size_t kd_len = max + 1 + max;
+ int *kd_pos = kd;
+ int di;
+#define xk_to_y(X, K) ((X) - (K))
+ for (di = 0; di < max; di++) {
+ int ki;
+ for (ki = di; ki >= -di; ki -= 2) {
+ if (x != kd_pos[ki]
+ || y != xk_to_y(x, ki))
+ continue;
+ label = '0' + (di % 10);
+ color = COLOR_YELLOW;
+ break;
+ }
+ if (label != 'o')
+ break;
+ kd_pos += kd_len;
+ }
+ }
+ if (kd_forward && kd_forward_d >= 0) {
+ int max = l->atoms.len + r->atoms.len;
+ size_t kd_len = max + 1 + max;
+ int di;
+#define xc_to_y(X, C, DELTA) ((X) - (C) + (DELTA))
+ int delta = (int)r->atoms.len
+ - (int)l->atoms.len;
+ int ki;
+ for (ki = kd_forward_d;
+ ki >= -kd_forward_d;
+ ki -= 2) {
+ if (x != kd_forward[ki])
+ continue;
+ if (y != xk_to_y(x, ki))
+ continue;
+ label = 'F';
+ color = COLOR_GREEN;
+ break;
+ }
+ }
+ if (kd_backward && kd_backward_d >= 0) {
+ int max = l->atoms.len + r->atoms.len;
+ size_t kd_len = max + 1 + max;
+ int di;
+ int delta = (int)r->atoms.len
+ - (int)l->atoms.len;
+ int ki;
+ for (ki = kd_backward_d;
+ ki >= -kd_backward_d;
+ ki -= 2) {
+ if (x != kd_backward[ki])
+ continue;
+ if (y != xc_to_y(x, ki, delta))
+ continue;
+ if (label == 'o') {
+ label = 'B';
+ color = COLOR_BLUE;
+ } else {
+ label = 'X';
+ color = COLOR_RED;
+ }
+ break;
+ }
+ }
+ if (color)
+ print("%s", color);
+ print("%c", label);
+ if (color)
+ print("%s", COLOR_END);
+ if (x < l->atoms.len)
+ print("-");
+ }
+ print("\n");
+ if (y == r->atoms.len)
+ break;
+
+ print(" ");
+ for (x = 0; x < l->atoms.len; x++) {
+ if (diff_atom_same(&l->atoms.head[x],
+ &r->atoms.head[y]))
+ print("|\\");
+ else
+ print("| ");
+ }
+ print("|\n");
+ }
+}
+
+static inline void
+debug_dump_myers_graph(const struct diff_data *l, const struct diff_data *r,
+ int *kd, int *kd_forward, int kd_forward_d,
+ int *kd_backward, int kd_backward_d)
+{
+ if (l->atoms.len > 99 || r->atoms.len > 99)
+ return;
+ dump_myers_graph(l, r, kd, kd_forward, kd_forward_d,
+ kd_backward, kd_backward_d);
+}
+
+#else
+#define debug(args...)
+#define debug_dump(args...)
+#define debug_dump_atom(args...)
+#define debug_dump_atoms(args...)
+#define debug_dump_myers_graph(args...)
+#endif
blob - 840d4e7718250a86e04d1ac09b88ca3d5f7f6927
blob + 6eeaec39ece594dcd1a8e0775d16799f466d9b84
--- lib/diff_main.c
+++ lib/diff_main.c
#include <diff/arraylist.h>
#include <diff/diff_main.h>
-#include "debug.h"
+#include "diff_debug.h"
static int
read_at(int fd, int at_pos, unsigned char *buf, size_t len)
blob - 0e5a1532ffd05811db5e9dc363a73df4406cf063
blob + 143bd26e70afdfe842d69ca968efc0ba504056e8
--- lib/diff_myers.c
+++ lib/diff_myers.c
#include <diff/arraylist.h>
#include <diff/diff_main.h>
-#include "debug.h"
+#include "diff_debug.h"
/* Myers' diff algorithm [1] is nicely explained in [2].
* [1] http://www.xmailserver.org/diff2.pdf
blob - 32d0bb8ed077cff937e57b8c5051638aeff4fd82
blob + 24f7b9467dcfdd013e03242d59c02551eddfc875
--- lib/diff_output_unidiff.c
+++ lib/diff_output_unidiff.c
#include <diff/diff_main.h>
#include <diff/diff_output.h>
-#include "debug.h"
+#include "diff_debug.h"
struct chunk_context {
struct diff_range chunk;
blob - 60517c0a36ecf3978e948dc526f31cae3892f0b2
blob + ad4072149dfdef088e99354b9c276ddd4fcd24dc
--- lib/diff_patience.c
+++ lib/diff_patience.c
#include <diff/arraylist.h>
#include <diff/diff_main.h>
-#include "debug.h"
+#include "diff_debug.h"
/* Set unique_here = true for all atoms that exist exactly once in this list. */
static int