Author: rhuijben
Date: Wed May 28 11:22:09 2014
New Revision: 1597976
URL: http://svn.apache.org/r1597976
Log:
Make the number of context lines in the diff output handing dynamic
instead of static. This prepares the code for making it configurable
as part of revving the calling functions (which is necessary anyway
for adding cancellation support).
* subversion/libsvn_diff/diff_file.c
(includes): Add assert.h.
(svn_diff__file_output_baton_t): Add context_size.
(output_unified_flush_hunk,
output_unified_diff_modified): Update user.
(svn_diff_file_output_unified4): Initialize baton.
(context_saver_t): Make context size dynamic.
(context_saver_stream_write): Update user.
(svn_diff3__file_output_baton_t): Add context_size.
(flush_context_saver): Update caller.
(make_context_saver): Update initialization.
(trailing_context_printer): Update comment.
(make_trailing_context_printer): Update initialization.
(output_conflict_with_context): Update user.
(svn_diff_file_output_merge2): Update initialization.
* subversion/libsvn_diff/diff_memory.c
(unified_output_baton_t): Add context_size.
(output_unified_flush_hunk,
output_unified_diff_modified): Update user.
(svn_diff_mem_string_output_unified2): Update initialization
(context_saver_t): Update variables.
(context_saver_stream_write): Update user.
(merge_output_baton_t): Add context_size.
(flush_context_saver): Update user.
(make_context_saver): Properly initialize baton.
(trailing_context_printer): Update comment.
(make_trailing_context_printer,
output_conflict_with_context): Update user.
(svn_diff_mem_string_output_merge2): Update initialization.
Modified:
subversion/trunk/subversion/libsvn_diff/diff_file.c
subversion/trunk/subversion/libsvn_diff/diff_memory.c
Modified: subversion/trunk/subversion/libsvn_diff/diff_file.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_file.c?rev=1597976&r1=1597975&r2=1597976&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/diff_file.c (original)
+++ subversion/trunk/subversion/libsvn_diff/diff_file.c Wed May 28 11:22:09 2014
@@ -31,6 +31,8 @@
#include <apr_mmap.h>
#include <apr_getopt.h>
+#include <assert.h>
+
#include "svn_error.h"
#include "svn_diff.h"
#include "svn_types.h"
@@ -1410,6 +1412,8 @@ typedef struct svn_diff__file_output_bat
/* Extra context for the current hunk. */
char hunk_extra_context[SVN_DIFF__EXTRA_CONTEXT_LENGTH + 1];
+ int context_size;
+
apr_pool_t *pool;
} svn_diff__file_output_baton_t;
@@ -1615,7 +1619,7 @@ output_unified_flush_hunk(svn_diff__file
}
target_line = baton->hunk_start[0] + baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + baton->context_size;
/* Add trailing context to the hunk */
SVN_ERR(output_unified_diff_range(baton, 0 /* original */,
@@ -1666,8 +1670,8 @@ output_unified_diff_modified(void *baton
apr_off_t prev_context_end;
svn_boolean_t init_hunk = FALSE;
- if (original_start > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
- context_prefix_length = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ if (original_start > output_baton->context_size)
+ context_prefix_length = output_baton->context_size;
else
context_prefix_length = original_start;
@@ -1677,7 +1681,7 @@ output_unified_diff_modified(void *baton
{
prev_context_end = output_baton->hunk_start[0]
+ output_baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + output_baton->context_size;
}
else
{
@@ -1842,6 +1846,7 @@ svn_diff_file_output_unified4(svn_stream
baton.hunk = svn_stringbuf_create_empty(pool);
baton.show_c_function = show_c_function;
baton.extra_context = svn_stringbuf_create_empty(pool);
+ baton.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (show_c_function)
{
@@ -1942,8 +1947,9 @@ svn_diff_file_output_unified4(svn_stream
*pointers! */
typedef struct context_saver_t {
svn_stream_t *stream;
- const char *data[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
- apr_size_t len[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
+ int context_size;
+ const char **data; /* const char *data[context_size] */
+ apr_size_t *len; /* apr_size_t len[context_size] */
apr_size_t next_slot;
apr_size_t total_written;
} context_saver_t;
@@ -1957,7 +1963,7 @@ context_saver_stream_write(void *baton,
context_saver_t *cs = baton;
cs->data[cs->next_slot] = data;
cs->len[cs->next_slot] = *len;
- cs->next_slot = (cs->next_slot + 1) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ cs->next_slot = (cs->next_slot + 1) % cs->context_size;
cs->total_written++;
return SVN_NO_ERROR;
}
@@ -1983,6 +1989,7 @@ typedef struct svn_diff3__file_output_ba
const char *marker_eol;
svn_diff_conflict_display_style_t conflict_style;
+ int context_size;
/* The rest of the fields are for
svn_diff_conflict_display_only_conflicts only. Note that for
@@ -2002,9 +2009,9 @@ flush_context_saver(context_saver_t *cs,
svn_stream_t *output_stream)
{
int i;
- for (i = 0; i < SVN_DIFF__UNIFIED_CONTEXT_SIZE; i++)
+ for (i = 0; i < cs->context_size; i++)
{
- apr_size_t slot = (i + cs->next_slot) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ apr_size_t slot = (i + cs->next_slot) % cs->context_size;
if (cs->data[slot])
{
apr_size_t len = cs->len[slot];
@@ -2019,6 +2026,8 @@ make_context_saver(svn_diff3__file_outpu
{
context_saver_t *cs;
+ assert(fob->context_size > 0); /* Or nothing to save */
+
svn_pool_clear(fob->pool);
cs = apr_pcalloc(fob->pool, sizeof(*cs));
cs->stream = svn_stream_empty(fob->pool);
@@ -2026,10 +2035,13 @@ make_context_saver(svn_diff3__file_outpu
svn_stream_set_write(cs->stream, context_saver_stream_write);
fob->context_saver = cs;
fob->output_stream = cs->stream;
+ cs->context_size = fob->context_size;
+ cs->data = apr_pcalloc(fob->pool, sizeof(*cs->data) * cs->context_size);
+ cs->len = apr_pcalloc(fob->pool, sizeof(*cs->len) * cs->context_size);
}
-/* A stream which prints SVN_DIFF__UNIFIED_CONTEXT_SIZE lines to
+/* A stream which prints LINES_TO_PRINT (based on context size) lines to
BATON->REAL_OUTPUT_STREAM, and then changes BATON->OUTPUT_STREAM to
a context_saver; used for *trailing* context. */
@@ -2064,7 +2076,7 @@ make_trailing_context_printer(svn_diff3_
svn_pool_clear(btn->pool);
tcp = apr_pcalloc(btn->pool, sizeof(*tcp));
- tcp->lines_to_print = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ tcp->lines_to_print = btn->context_size;
tcp->fob = btn;
s = svn_stream_empty(btn->pool);
svn_stream_set_baton(s, tcp);
@@ -2227,7 +2239,7 @@ output_conflict_with_context(svn_diff3__
trailing context)? If so, flush it. */
if (btn->output_stream == btn->context_saver->stream)
{
- if (btn->context_saver->total_written > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
+ if (btn->context_saver->total_written > btn->context_size)
SVN_ERR(svn_stream_puts(btn->real_output_stream, "@@\n"));
SVN_ERR(flush_context_saver(btn->context_saver,
btn->real_output_stream));
}
@@ -2344,6 +2356,7 @@ svn_diff_file_output_merge2(svn_stream_t
(style == svn_diff_conflict_display_only_conflicts);
memset(&baton, 0, sizeof(baton));
+ baton.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (conflicts_only)
{
baton.pool = svn_pool_create(pool);
Modified: subversion/trunk/subversion/libsvn_diff/diff_memory.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_memory.c?rev=1597976&r1=1597975&r2=1597976&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/diff_memory.c (original)
+++ subversion/trunk/subversion/libsvn_diff/diff_memory.c Wed May 28 11:22:09
2014
@@ -356,6 +356,8 @@ typedef struct unified_output_baton_t
source_tokens_t sources[2]; /* 0 == original; 1 == modified */
apr_off_t current_token[2]; /* current token per source */
+ int context_size;
+
/* Cached markers, in header_encoding,
indexed using unified_output_e */
const char *prefix_str[3];
@@ -461,7 +463,7 @@ output_unified_flush_hunk(output_baton_t
/* Write the trailing context */
target_token = baton->hunk_start[0] + baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + baton->context_size;
SVN_ERR(output_unified_token_range(baton, 0 /*original*/,
unified_output_context,
target_token));
@@ -515,8 +517,8 @@ output_unified_diff_modified(void *baton
apr_off_t prev_context_end;
svn_boolean_t init_hunk = FALSE;
- if (original_start > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
- context_prefix_length = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ if (original_start > output_baton->context_size)
+ context_prefix_length = output_baton->context_size;
else
context_prefix_length = original_start;
@@ -526,7 +528,7 @@ output_unified_diff_modified(void *baton
{
prev_context_end = output_baton->hunk_start[0]
+ output_baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + output_baton->context_size;
}
else
{
@@ -634,6 +636,7 @@ svn_diff_mem_string_output_unified2(svn_
= (hunk_delimiter == NULL || strcmp(hunk_delimiter, "##") != 0)
? APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_FILE APR_EOL_STR
: APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_PROPERTY APR_EOL_STR;
+ baton.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
SVN_ERR(svn_utf_cstring_from_utf8_ex2
(&(baton.prefix_str[unified_output_context]), " ",
@@ -698,8 +701,9 @@ svn_diff_mem_string_output_unified(svn_s
*pointers! */
typedef struct context_saver_t {
svn_stream_t *stream;
- const char *data[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
- apr_size_t len[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
+ int context_size;
+ const char **data; /* const char *data[context_size] */
+ apr_size_t *len; /* apr_size_t len[context_size] */
apr_size_t next_slot;
apr_size_t total_written;
} context_saver_t;
@@ -713,7 +717,7 @@ context_saver_stream_write(void *baton,
context_saver_t *cs = baton;
cs->data[cs->next_slot] = data;
cs->len[cs->next_slot] = *len;
- cs->next_slot = (cs->next_slot + 1) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ cs->next_slot = (cs->next_slot + 1) % cs->context_size;
cs->total_written++;
return SVN_NO_ERROR;
}
@@ -733,6 +737,7 @@ typedef struct merge_output_baton_t
const char *marker_eol;
svn_diff_conflict_display_style_t conflict_style;
+ int context_size;
/* The rest of the fields are for
svn_diff_conflict_display_only_conflicts only. Note that for
@@ -753,9 +758,9 @@ flush_context_saver(context_saver_t *cs,
svn_stream_t *output_stream)
{
int i;
- for (i = 0; i < SVN_DIFF__UNIFIED_CONTEXT_SIZE; i++)
+ for (i = 0; i < cs->context_size; i++)
{
- apr_size_t slot = (i + cs->next_slot) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ apr_size_t slot = (i + cs->next_slot) % cs->context_size;
if (cs->data[slot])
{
apr_size_t len = cs->len[slot];
@@ -771,6 +776,8 @@ make_context_saver(merge_output_baton_t
{
context_saver_t *cs;
+ assert(mob->context_size > 0); /* Or nothing to save */
+
svn_pool_clear(mob->pool);
cs = apr_pcalloc(mob->pool, sizeof(*cs));
cs->stream = svn_stream_empty(mob->pool);
@@ -778,10 +785,13 @@ make_context_saver(merge_output_baton_t
svn_stream_set_write(cs->stream, context_saver_stream_write);
mob->context_saver = cs;
mob->output_stream = cs->stream;
+ cs->context_size = mob->context_size;
+ cs->data = apr_pcalloc(mob->pool, sizeof(*cs->data) * cs->context_size);
+ cs->len = apr_pcalloc(mob->pool, sizeof(*cs->len) * cs->context_size);
}
-/* A stream which prints SVN_DIFF__UNIFIED_CONTEXT_SIZE lines to
+/* A stream which prints LINES_TO_PRINT (based on context_size) lines to
BATON->REAL_OUTPUT_STREAM, and then changes BATON->OUTPUT_STREAM to
a context_saver; used for *trailing* context. */
@@ -815,7 +825,7 @@ make_trailing_context_printer(merge_outp
svn_pool_clear(btn->pool);
tcp = apr_pcalloc(btn->pool, sizeof(*tcp));
- tcp->lines_to_print = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ tcp->lines_to_print = btn->context_size;
tcp->mob = btn;
s = svn_stream_empty(btn->pool);
svn_stream_set_baton(s, tcp);
@@ -985,7 +995,7 @@ output_conflict_with_context(void *baton
trailing context)? If so, flush it. */
if (btn->output_stream == btn->context_saver->stream)
{
- if (btn->context_saver->total_written > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
+ if (btn->context_saver->total_written > btn->context_size)
SVN_ERR(svn_stream_puts(btn->real_output_stream, "@@\n"));
SVN_ERR(flush_context_saver(btn->context_saver,
btn->real_output_stream));
}
@@ -1076,6 +1086,7 @@ svn_diff_mem_string_output_merge2(svn_st
? &merge_only_conflicts_output_vtable : &merge_output_vtable;
memset(&btn, 0, sizeof(btn));
+ btn.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (conflicts_only)
{