D2574: xdiff: add a binary utility that runs xdiff
ryanmce (Ryan McElroy)
phabricator at mercurial-scm.org
Sat Mar 3 00:25:54 UTC 2018
ryanmce created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
Add a simple binary that runs xdiff in a minimal way. This is useful for
tweaking xdiff related code. It's also potentially useful in .t tests.
TEST PLAN
`cd contrib/xdiff; make` and run `xdiff file1 file2`, check it has a sane
output.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2574
AFFECTED FILES
contrib/xdiff/Makefile
contrib/xdiff/xdiff.c
CHANGE DETAILS
diff --git a/contrib/xdiff/xdiff.c b/contrib/xdiff/xdiff.c
new file mode 100644
--- /dev/null
+++ b/contrib/xdiff/xdiff.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "lib/third-party/xdiff/xdiff.h"
+
+#define abort(...) \
+ { \
+ fprintf(stderr, __VA_ARGS__); \
+ exit(-1); \
+ }
+
+void readfile(const char *path, mmfile_t *file)
+{
+ memset(file, 0, sizeof(*file));
+ FILE *fp = fopen(path, "r");
+ if (!fp) {
+ abort("cannot open %s\n", path);
+ }
+ while (!feof(fp)) {
+ char buf[40960];
+ size_t size = fread(buf, 1, sizeof buf, fp);
+ if (size > 0) {
+ size_t new_size = file->size + size;
+ file->ptr = realloc(file->ptr, new_size);
+ if (!file->ptr) {
+ abort("cannot allocate\n");
+ }
+ memcpy(file->ptr + file->size, buf, size);
+ file->size = new_size;
+ }
+ }
+ fclose(fp);
+}
+
+static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
+{
+ int i;
+ for (i = 0; i < nbuf; i++) {
+ write(STDOUT_FILENO, mb[i].ptr, mb[i].size);
+ }
+ return 0;
+}
+
+int main(int argc, char const *argv[])
+{
+ if (argc < 3) {
+ abort("usage: %s FILE1 FILE2\n", argv[0]);
+ }
+
+ mmfile_t a, b;
+
+ readfile(argv[1], &a);
+ readfile(argv[2], &b);
+
+ xpparam_t xpp = {
+ 0, /* flags */
+ NULL, /* anchors */
+ 0, /* anchors_nr */
+ };
+ xdemitconf_t xecfg = {
+ 3, /* ctxlen */
+ 0, /* interhunkctxlen */
+ 0, /* flags */
+ NULL, /* find_func */
+ NULL, /* find_func_priv */
+ NULL, /* hunk_consume_func */
+ };
+ xdemitcb_t ecb = {
+ 0, /* priv */
+ &xdiff_outf, /* outf */
+ };
+
+ xdl_diff(&a, &b, &xpp, &xecfg, &ecb);
+
+ free(a->ptr);
+ free(b->ptr);
+
+ return 0;
+}
diff --git a/contrib/xdiff/Makefile b/contrib/xdiff/Makefile
new file mode 100644
--- /dev/null
+++ b/contrib/xdiff/Makefile
@@ -0,0 +1,5 @@
+xdiff: ../../lib/third-party/xdiff/*.c xdiff.c
+ gcc -g -std=c99 -I../.. -I../../lib/third-party/xdiff -o $@ $^
+
+clean:
+ -rm -f xdiff
To: ryanmce, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list