commit - 24e87ea36353362f676afa722d0b7361a7223cbc
commit + cca5682ee944c46413628161f13e2779718f0536
blob - 0d4400c94065902d33850e15657291c27011c982
blob + 6d0ab279e0da6c13e651b072c3cc470271db4145
--- lib/blame.c
+++ lib/blame.c
struct got_blame {
FILE *f;
off_t size;
- const struct diff_config *cfg;
+ struct diff_config *cfg;
size_t filesize;
int nlines;
int nannotated;
err = got_error_from_errno("fclose");
free(blame->lines);
free(blame->linemap2);
+ free(blame->cfg);
free(blame);
return err;
}
if (err || blame->nlines == 0)
goto done;
- blame->cfg = got_diff_get_config(GOT_DIFF_ALGORITHM_PATIENCE);
+ err = got_diff_get_config(&blame->cfg, GOT_DIFF_ALGORITHM_PATIENCE,
+ NULL, NULL);
+ if (err)
+ goto done;
/* Don't include \n at EOF in the blame line count. */
if (blame->line_offsets[blame->nlines - 1] == blame->filesize)
blob - 8dbab6f2166e74d05f55fa057f00e1e8602740fc
blob + e22e81b5097ae6ae7772a348e7f8f31f7b2c6421
--- lib/diffreg.c
+++ lib/diffreg.c
return err;
}
-const struct diff_config *
-got_diff_get_config(enum got_diff_algorithm algorithm)
+const struct got_error *
+got_diff_get_config(struct diff_config **cfg,
+ enum got_diff_algorithm algorithm,
+ diff_atomize_func_t atomize_func, void *atomize_func_data)
{
+ *cfg = calloc(1, sizeof(**cfg));
+ if (*cfg == NULL)
+ return got_error_from_errno("calloc");
+
switch (algorithm) {
case GOT_DIFF_ALGORITHM_PATIENCE:
- return &diff_config_patience;
+ (*cfg)->algo = &patience;
+ break;
case GOT_DIFF_ALGORITHM_MYERS:
- return &diff_config_myers_then_myers_divide;
+ (*cfg)->algo = &myers_then_myers_divide;
+ break;
+ default:
+ return got_error_msg(GOT_ERR_NOT_IMPL, "bad diff algorithm");
}
- return NULL; /* should not happen */
+
+ if (atomize_func) {
+ (*cfg)->atomize_func = atomize_func;
+ (*cfg)->atomize_func_data = atomize_func_data;
+ } else
+ (*cfg)->atomize_func = diff_atomize_text_by_line;
+
+ (*cfg)->max_recursion_depth = 0; /* use default recursion depth */
+
+ return NULL;
}
const struct got_error *
enum got_diff_algorithm algorithm, int ignore_whitespace)
{
const struct got_error *err = NULL;
- const struct diff_config *cfg;
+ struct diff_config *cfg = NULL;
char *p1 = NULL, *p2 = NULL;
int f1_created = 0, f2_created = 0;
size_t size1, size2;
right = &d_right;
}
- cfg = got_diff_get_config(algorithm);
- if (cfg == NULL) {
- err = got_error(GOT_ERR_NOT_IMPL);
+ err = got_diff_get_config(&cfg, algorithm, NULL, NULL);
+ if (err)
goto done;
- }
if (f1 == NULL) {
f1_created = 1;
(*diffreg_result)->size2 = size2;
}
done:
+ free(cfg);
if (diffreg_result == NULL) {
diff_data_free(left);
diff_data_free(right);
blob - 569cb201c391ea456cd142edbaf9f85ae5d91ba7
blob + 3a995c48e676b6b3ef159bad68c8c69a070427d5
--- lib/got_lib_diff.h
+++ lib/got_lib_diff.h
#define GOT_DIFF_CONFLICT_MARKER_SEP "======="
#define GOT_DIFF_CONFLICT_MARKER_END ">>>>>>>"
-const struct diff_config *got_diff_get_config(enum got_diff_algorithm);
+const struct got_error *got_diff_get_config(struct diff_config **,
+ enum got_diff_algorithm, diff_atomize_func_t, void *);
const struct got_error *got_diff_prepare_file(FILE *, char **, size_t *,
struct diff_data *, const struct diff_config *, int);
const struct got_error *got_diffreg(struct got_diffreg_result **, FILE *, FILE *,