tags:

views:

949

answers:

5

I'm looking for a C or C++ diff library. I know I can use the Unix diff tool in combination with system or exec, but I really want a library. It would be handy if the library could perform patches as well, like the Unix patch tool.

+6  A: 

It seems like the Google Diff, Match and Patch libraries are what you need.

Paul Biggar
Eh, but the C++ version of that library is dependent on Qt. I need a diff/patch library for a non-GUI application.
Matt Fichman
Qt has non-GUI parts, and can be used in a console application.
Bill
Qt is a large library dependency I don't want to have. Why didn't the author use STL?
Matt Fichman
+1  A: 

This is an implementation of a "solution to SES/LCS with the Hirschberg linear space refinement as described in the following publication":

E. Myers, ``An O(ND) Difference Algorithm and Its Variations,'' Algorithmica 1, 2 (1986), 251-266. http://www.cs.arizona.edu/people/gene/PAPERS/diff.ps

Found it on the Wikipedia page on diff.

That's only for finding a diff though, not applying it as a patch. I think that application of a patch is actually a harder problem; due to the risk of conflicts. It would need some form of user-controlling feedback mechanism, to resolve conflicts.

unwind
This is the best I answer so far, but I really would like a patch library as well. I'll wait a little to see if anyone else has an answer.
Matt Fichman
+2  A: 

I think I've found a good solution, finally:

http://code.google.com/p/dtl-cpp/wiki/Tutorial

It supports patch. I had to type "diff.cpp" into Google to find it. Hopefully it works!

Matt Fichman
+1  A: 

Subversion includes a library libsvn_diff.

Martin v. Löwis
A: 

There is one that is part of Mercurial. It exists as some C code that's designed as a Python extension, but it could probably be extracted pretty easily. I believe it can also do binary diffs.

The relevant .c files are mercurial/bdiff.c, mercurial/mpatch.c and possibly mercurial/diffhelpers.c.

Omnifarious