NAME
lowdown_diff
—
compute difference between parsed
Markdown trees
LIBRARY
library “liblowdown”
SYNOPSIS
#include
<sys/queue.h>
#include <stdio.h>
#include <lowdown.h>
struct lowdown_node *
lowdown_diff
(const struct lowdown_node
*nold, const struct lowdown_node *nnew,
size_t *maxn);
DESCRIPTION
Computes the difference between two Markdown trees, the source
nold and destination nnew,
parsed by lowdown_doc_parse(3). It uses the enum
lowdown_chng type in the return tree's nodes to dictate insertions
into and deletions from nold. The
maxn argument, if not NULL
, is
set to one greater than the highest node identifier of the returned
tree.
RETURN VALUES
Returns a pointer to the difference tree or
NULL
on memory exhaution. The pointer must be freed
with lowdown_node_free(3).
EXAMPLES
The following parses and compares old of length osz and new of length nsz. It first allocates the parser, then the document, then the renderer (HTML is used in this case). Then it passes output to the renderer, prints it, and cleans up resources. On any memory errors, it exits with err(3).
struct lowdown_doc *doc; struct lowdown_node *no, *nn, *diff; struct lowdown_buf *ob; void *rndr; if ((doc = lowdown_doc_new(NULL)) == NULL) err(1, NULL); if ((no = lowdown_doc_parse(doc, NULL, old, osz, NULL)) == NULL) err(1, NULL); if ((nn = lowdown_doc_parse(doc, NULL, new, nsz, NULL)) == NULL) err(1, NULL); if ((diff = lowdown_diff(no, nn, NULL)) == NULL) err(1, NULL); if ((rndr = lowdown_html_new(NULL)) == NULL) err(1, NULL); if ((ob = lowdown_buf_new(1024)) == NULL) err(1, NULL); if (!lowdown_html_rndr(ob, rndr, diff)) err(1, NULL); fwrite(stdout, 1, ob->size, ob->data); lowdown_buf_free(ob); lowdown_html_rndr_free(rndr); lowdown_node_free(no); lowdown_node_free(nn); lowdown_node_free(diff); lowdown_doc_free(doc);
SEE ALSO
Gregory Cobena, Serge Abiteboul, and Amelie Marian, Detecting Changes in XML Documents, https://www.cs.rutgers.edu/~amelie/papers/2002/diff.pdf, 2002.
Wu Sun, Manber Udi, and Myers Gene, An O(NP) sequence comparison algorithm, Issue 6, Information Processing Letters, Volume 35, 1990.