#define SVN_DEPRECATED
#include "svn_diff.h"
#include "svn_utf.h"
#include "svn_private_config.h"
struct fns_wrapper_baton
{
void *old_baton;
const svn_diff_fns_t *vtable;
};
static svn_error_t *
datasources_open(void *baton,
apr_off_t *prefix_lines,
apr_off_t *suffix_lines,
const svn_diff_datasource_e *datasources,
apr_size_t datasource_len)
{
struct fns_wrapper_baton *fwb = baton;
apr_size_t i;
for (i = 0; i < datasource_len; i++)
{
SVN_ERR(fwb->vtable->datasource_open(fwb->old_baton, datasources[i]));
}
*prefix_lines = 0;
*suffix_lines = 0;
return SVN_NO_ERROR;
}
static svn_error_t *
datasource_close(void *baton,
svn_diff_datasource_e datasource)
{
struct fns_wrapper_baton *fwb = baton;
return fwb->vtable->datasource_close(fwb->old_baton, datasource);
}
static svn_error_t *
datasource_get_next_token(apr_uint32_t *hash,
void **token,
void *baton,
svn_diff_datasource_e datasource)
{
struct fns_wrapper_baton *fwb = baton;
return fwb->vtable->datasource_get_next_token(hash, token, fwb->old_baton,
datasource);
}
static svn_error_t *
token_compare(void *baton,
void *ltoken,
void *rtoken,
int *compare)
{
struct fns_wrapper_baton *fwb = baton;
return fwb->vtable->token_compare(fwb->old_baton, ltoken, rtoken, compare);
}
static void
token_discard(void *baton,
void *token)
{
struct fns_wrapper_baton *fwb = baton;
fwb->vtable->token_discard(fwb->old_baton, token);
}
static void
token_discard_all(void *baton)
{
struct fns_wrapper_baton *fwb = baton;
fwb->vtable->token_discard_all(fwb->old_baton);
}
static void
wrap_diff_fns(svn_diff_fns2_t **diff_fns2,
struct fns_wrapper_baton **baton2,
const svn_diff_fns_t *diff_fns,
void *baton,
apr_pool_t *result_pool)
{
*diff_fns2 = apr_palloc(result_pool, sizeof(**diff_fns2));
(*diff_fns2)->datasources_open = datasources_open;
(*diff_fns2)->datasource_close = datasource_close;
(*diff_fns2)->datasource_get_next_token = datasource_get_next_token;
(*diff_fns2)->token_compare = token_compare;
(*diff_fns2)->token_discard = token_discard;
(*diff_fns2)->token_discard_all = token_discard_all;
*baton2 = apr_palloc(result_pool, sizeof (**baton2));
(*baton2)->old_baton = baton;
(*baton2)->vtable = diff_fns;
}
svn_error_t *
svn_diff_file_output_unified2(svn_stream_t *output_stream,
svn_diff_t *diff,
const char *original_path,
const char *modified_path,
const char *original_header,
const char *modified_header,
const char *header_encoding,
apr_pool_t *pool)
{
return svn_diff_file_output_unified3(output_stream, diff,
original_path, modified_path,
original_header, modified_header,
header_encoding, NULL, FALSE, pool);
}
svn_error_t *
svn_diff_file_output_unified(svn_stream_t *output_stream,
svn_diff_t *diff,
const char *original_path,
const char *modified_path,
const char *original_header,
const char *modified_header,
apr_pool_t *pool)
{
return svn_diff_file_output_unified2(output_stream, diff,
original_path, modified_path,
original_header, modified_header,
SVN_APR_LOCALE_CHARSET, pool);
}
svn_error_t *
svn_diff_file_diff(svn_diff_t **diff,
const char *original,
const char *modified,
apr_pool_t *pool)
{
return svn_diff_file_diff_2(diff, original, modified,
svn_diff_file_options_create(pool), pool);
}
svn_error_t *
svn_diff_file_diff3(svn_diff_t **diff,
const char *original,
const char *modified,
const char *latest,
apr_pool_t *pool)
{
return svn_diff_file_diff3_2(diff, original, modified, latest,
svn_diff_file_options_create(pool), pool);
}
svn_error_t *
svn_diff_file_diff4(svn_diff_t **diff,
const char *original,
const char *modified,
const char *latest,
const char *ancestor,
apr_pool_t *pool)
{
return svn_diff_file_diff4_2(diff, original, modified, latest, ancestor,
svn_diff_file_options_create(pool), pool);
}
svn_error_t *
svn_diff_file_output_merge(svn_stream_t *output_stream,
svn_diff_t *diff,
const char *original_path,
const char *modified_path,
const char *latest_path,
const char *conflict_original,
const char *conflict_modified,
const char *conflict_latest,
const char *conflict_separator,
svn_boolean_t display_original_in_conflict,
svn_boolean_t display_resolved_conflicts,
apr_pool_t *pool)
{
svn_diff_conflict_display_style_t style =
svn_diff_conflict_display_modified_latest;
if (display_resolved_conflicts)
style = svn_diff_conflict_display_resolved_modified_latest;
if (display_original_in_conflict)
style = svn_diff_conflict_display_modified_original_latest;
return svn_diff_file_output_merge2(output_stream,
diff,
original_path,
modified_path,
latest_path,
conflict_original,
conflict_modified,
conflict_latest,
conflict_separator,
style,
pool);
}
svn_error_t *
svn_diff_diff(svn_diff_t **diff,
void *diff_baton,
const svn_diff_fns_t *vtable,
apr_pool_t *pool)
{
svn_diff_fns2_t *diff_fns2;
struct fns_wrapper_baton *fwb;
wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool);
return svn_diff_diff_2(diff, fwb, diff_fns2, pool);
}
svn_error_t *
svn_diff_diff3(svn_diff_t **diff,
void *diff_baton,
const svn_diff_fns_t *vtable,
apr_pool_t *pool)
{
svn_diff_fns2_t *diff_fns2;
struct fns_wrapper_baton *fwb;
wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool);
return svn_diff_diff3_2(diff, fwb, diff_fns2, pool);
}
svn_error_t *
svn_diff_diff4(svn_diff_t **diff,
void *diff_baton,
const svn_diff_fns_t *vtable,
apr_pool_t *pool)
{
svn_diff_fns2_t *diff_fns2;
struct fns_wrapper_baton *fwb;
wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool);
return svn_diff_diff4_2(diff, fwb, diff_fns2, pool);
}