| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include "config.h"
- #include <stdio.h>
- #include <string.h>
- /**
- * bdelta - Generate and apply binary deltas
- *
- * This library takes two strings containing binary data, and produces a
- * "patch" that can be applied to the first one to produce the second one.
- * It can be used to save bandwidth and disk space when many texts differing
- * by a small number of bytes need to be transmitted or stored.
- *
- * Patches produced by this version of the library can be applied using future
- * versions, but not past versions.
- *
- * bdelta implements the algorithm described in
- * An O(ND) Difference Algorithm and Its Variations by Eugene W. Myers.
- * Because its memory usage and expected running time are O(N + D^2),
- * it works well only when the strings differ by a small number of bytes.
- * This implementation stops trying when the strings differ by more than
- * 1000 bytes, and falls back to producing a patch that simply emits the new
- * string.
- *
- * Thus, bdelta does not save any space when given two strings that differ by
- * more than 1000 bytes. This may be improved in a future version of the
- * library.
- *
- * Example:
- * #include <ccan/bdelta/bdelta.h>
- * #include <stdio.h>
- * #include <stdlib.h>
- * #include <string.h>
- *
- * static void gulp(const char *filename, void **data_out, size_t *size_out);
- *
- * static int usage(const char *prog)
- * {
- * fprintf(
- * stderr,
- * "Usage: %s diff <old> <new> > <patch>\n"
- * " %s patch <old> <patch> > <new>\n",
- * prog, prog
- * );
- * return 1;
- * }
- *
- * int main(int argc, char *argv[])
- * {
- * void *old, *new_, *patch;
- * size_t old_size, new_size, patch_size;
- * BDELTAcode rc;
- *
- * if (argc != 4)
- * return usage(argv[0]);
- *
- * if (strcmp(argv[1], "diff") == 0) {
- * gulp(argv[2], &old, &old_size);
- * gulp(argv[3], &new_, &new_size);
- *
- * rc = bdelta_diff(old, old_size, new_, new_size, &patch, &patch_size);
- * if (rc != BDELTA_OK) {
- * bdelta_perror("bdelta_diff", rc);
- * return 1;
- * }
- *
- * if (fwrite(patch, 1, patch_size, stdout) != patch_size) {
- * perror("stdout");
- * return 1;
- * }
- * } else if (strcmp(argv[1], "patch") == 0) {
- * gulp(argv[2], &old, &old_size);
- * gulp(argv[3], &patch, &patch_size);
- *
- * rc = bdelta_patch(old, old_size, patch, patch_size, &new_, &new_size);
- * if (rc != BDELTA_OK) {
- * bdelta_perror("bdelta_patch", rc);
- * return 1;
- * }
- *
- * if (fwrite(new_, 1, new_size, stdout) != new_size) {
- * perror("stdout");
- * return 1;
- * }
- * } else {
- * return usage(argv[0]);
- * }
- *
- * free(old);
- * free(new_);
- * free(patch);
- * return 0;
- * }
- *
- * static void gulp(const char *filename, void **data_out, size_t *size_out)
- * {
- * FILE *f = fopen(filename, "rb");
- * size_t size = 0;
- * size_t alloc = 16;
- * char *data = malloc(alloc);
- *
- * if (f == NULL || data == NULL)
- * goto error;
- *
- * for (;;) {
- * size += fread(data + size, 1, alloc - size, f);
- * if (size < alloc) {
- * if (!feof(f))
- * goto error;
- * break;
- * }
- * data = realloc(data, alloc *= 2);
- * if (data == NULL)
- * goto error;
- * }
- *
- * if (fclose(f) != 0)
- * goto error;
- *
- * *data_out = data;
- * *size_out = size;
- * return;
- *
- * error:
- * perror(filename);
- * exit(EXIT_FAILURE);
- * }
- *
- * Author: Joey Adams <joeyadams3.14159@gmail.com>
- * License: MIT
- * Version: 0.1.1
- */
- int main(int argc, char *argv[])
- {
- /* Expect exactly one argument */
- if (argc != 2)
- return 1;
- if (strcmp(argv[1], "depends") == 0) {
- /* Nothing */
- return 0;
- }
- return 1;
- }
|