diff options
author | Peter Wemm <peter@FreeBSD.org> | 2018-05-08 03:44:38 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 2018-05-08 03:44:38 +0000 |
commit | 3faf8d6bffc5d0fb2525ba37bb504c53366caf9d (patch) | |
tree | 7e47911263e75034b767fe34b2f8d3d17e91f66d /subversion/libsvn_repos/load.c | |
parent | a55fb3c0d5eca7d887798125d5b95942b1f01d4b (diff) | |
download | src-3faf8d6bffc5d0fb2525ba37bb504c53366caf9d.tar.gz src-3faf8d6bffc5d0fb2525ba37bb504c53366caf9d.zip |
Import Subversion-1.10.0vendor/subversion/subversion-1.10.0
Notes
Notes:
svn path=/vendor/subversion/dist/; revision=333347
svn path=/vendor/subversion/subversion-1.10.0/; revision=333348; tag=vendor/subversion/subversion-1.10.0
Diffstat (limited to 'subversion/libsvn_repos/load.c')
-rw-r--r-- | subversion/libsvn_repos/load.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/subversion/libsvn_repos/load.c b/subversion/libsvn_repos/load.c index 96eda85cb183..27cf4a174552 100644 --- a/subversion/libsvn_repos/load.c +++ b/subversion/libsvn_repos/load.c @@ -385,7 +385,135 @@ parse_format_version(int *version, return SVN_NO_ERROR; } +/*----------------------------------------------------------------------*/ + +/** Dummy callback implementations for functions not provided by the user **/ +static svn_error_t * +dummy_handler_magic_header_record(int version, + void *parse_baton, + apr_pool_t *pool) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_uuid_record(const char *uuid, + void *parse_baton, + apr_pool_t *pool) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_new_revision_record(void **revision_baton, + apr_hash_t *headers, + void *parse_baton, + apr_pool_t *pool) +{ + *revision_baton = NULL; + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_new_node_record(void **node_baton, + apr_hash_t *headers, + void *revision_baton, + apr_pool_t *pool) +{ + *node_baton = NULL; + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_set_revision_property(void *revision_baton, + const char *name, + const svn_string_t *value) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_set_node_property(void *node_baton, + const char *name, + const svn_string_t *value) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_delete_node_property(void *node_baton, + const char *name) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_remove_node_props(void *node_baton) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_set_fulltext(svn_stream_t **stream, + void *node_baton) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_apply_textdelta(svn_txdelta_window_handler_t *handler, + void **handler_baton, + void *node_baton) +{ + /* Only called by parse_text_block() and that tests for NULL handlers. */ + *handler = NULL; + *handler_baton = NULL; + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_close_node(void *node_baton) +{ + return SVN_NO_ERROR; +} + +static svn_error_t * +dummy_handler_close_revision(void *revision_baton) +{ + return SVN_NO_ERROR; +} + +/* Helper macro to copy the function pointer SOURCE->NAME to DEST->NAME. + * If the source pointer is NULL, pick the corresponding dummy handler + * instead. */ +#define SET_VTABLE_ENTRY(dest, source, name) \ + dest->name = provided->name ? provided->name : dummy_handler_##name + +/* Return a copy of PROVIDED with all NULL callbacks replaced by a dummy + * handler. Allocate the result in RESULT_POOL. */ +static const svn_repos_parse_fns3_t * +complete_vtable(const svn_repos_parse_fns3_t *provided, + apr_pool_t *result_pool) +{ + svn_repos_parse_fns3_t *completed = apr_pcalloc(result_pool, + sizeof(*completed)); + + SET_VTABLE_ENTRY(completed, provided, magic_header_record); + SET_VTABLE_ENTRY(completed, provided, uuid_record); + SET_VTABLE_ENTRY(completed, provided, new_revision_record); + SET_VTABLE_ENTRY(completed, provided, new_node_record); + SET_VTABLE_ENTRY(completed, provided, set_revision_property); + SET_VTABLE_ENTRY(completed, provided, set_node_property); + SET_VTABLE_ENTRY(completed, provided, delete_node_property); + SET_VTABLE_ENTRY(completed, provided, remove_node_props); + SET_VTABLE_ENTRY(completed, provided, set_fulltext); + SET_VTABLE_ENTRY(completed, provided, apply_textdelta); + SET_VTABLE_ENTRY(completed, provided, close_node); + SET_VTABLE_ENTRY(completed, provided, close_revision); + + return completed; +} /*----------------------------------------------------------------------*/ @@ -410,6 +538,10 @@ svn_repos_parse_dumpstream3(svn_stream_t *stream, apr_pool_t *nodepool = svn_pool_create(pool); int version; + /* Make sure we can blindly invoke callbacks. */ + parse_fns = complete_vtable(parse_fns, pool); + + /* Start parsing process. */ SVN_ERR(svn_stream_readline(stream, &linebuf, "\n", &eof, linepool)); if (eof) return stream_ran_dry(); |