1/* 2 * deprecated.c: holding file for all deprecated APIs. 3 * "we can't lose 'em, but we can shun 'em!" 4 * 5 * ==================================================================== 6 * Licensed to the Apache Software Foundation (ASF) under one 7 * or more contributor license agreements. See the NOTICE file 8 * distributed with this work for additional information 9 * regarding copyright ownership. The ASF licenses this file 10 * to you under the Apache License, Version 2.0 (the 11 * "License"); you may not use this file except in compliance 12 * with the License. You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, 17 * software distributed under the License is distributed on an 18 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 19 * KIND, either express or implied. See the License for the 20 * specific language governing permissions and limitations 21 * under the License. 22 * ==================================================================== 23 */ 24 25/* ==================================================================== */ 26 27 28 29/*** Includes. ***/ 30 31/* We define this here to remove any further warnings about the usage of 32 deprecated functions in this file. */ 33#define SVN_DEPRECATED 34 35#include "svn_diff.h" 36#include "svn_utf.h" 37 38#include "svn_private_config.h" 39 40 41 42 43/*** Code. ***/ 44struct fns_wrapper_baton 45{ 46 /* We put the old baton in front of this one, so that we can still use 47 this baton in place of the old. This prevents us from having to 48 implement simple wrappers around each member of diff_fns_t. */ 49 void *old_baton; 50 const svn_diff_fns_t *vtable; 51}; 52 53static svn_error_t * 54datasources_open(void *baton, 55 apr_off_t *prefix_lines, 56 apr_off_t *suffix_lines, 57 const svn_diff_datasource_e *datasources, 58 apr_size_t datasource_len) 59{ 60 struct fns_wrapper_baton *fwb = baton; 61 apr_size_t i; 62 63 /* Just iterate over the datasources, using the old singular version. */ 64 for (i = 0; i < datasource_len; i++) 65 { 66 SVN_ERR(fwb->vtable->datasource_open(fwb->old_baton, datasources[i])); 67 } 68 69 /* Don't claim any prefix or suffix matches. */ 70 *prefix_lines = 0; 71 *suffix_lines = 0; 72 73 return SVN_NO_ERROR; 74} 75 76static svn_error_t * 77datasource_close(void *baton, 78 svn_diff_datasource_e datasource) 79{ 80 struct fns_wrapper_baton *fwb = baton; 81 return fwb->vtable->datasource_close(fwb->old_baton, datasource); 82} 83 84static svn_error_t * 85datasource_get_next_token(apr_uint32_t *hash, 86 void **token, 87 void *baton, 88 svn_diff_datasource_e datasource) 89{ 90 struct fns_wrapper_baton *fwb = baton; 91 return fwb->vtable->datasource_get_next_token(hash, token, fwb->old_baton, 92 datasource); 93} 94 95static svn_error_t * 96token_compare(void *baton, 97 void *ltoken, 98 void *rtoken, 99 int *compare) 100{ 101 struct fns_wrapper_baton *fwb = baton; 102 return fwb->vtable->token_compare(fwb->old_baton, ltoken, rtoken, compare); 103} 104 105static void 106token_discard(void *baton, 107 void *token) 108{ 109 struct fns_wrapper_baton *fwb = baton; 110 fwb->vtable->token_discard(fwb->old_baton, token); 111} 112 113static void 114token_discard_all(void *baton) 115{ 116 struct fns_wrapper_baton *fwb = baton; 117 fwb->vtable->token_discard_all(fwb->old_baton); 118} 119 120 121static void 122wrap_diff_fns(svn_diff_fns2_t **diff_fns2, 123 struct fns_wrapper_baton **baton2, 124 const svn_diff_fns_t *diff_fns, 125 void *baton, 126 apr_pool_t *result_pool) 127{ 128 /* Initialize the return vtable. */ 129 *diff_fns2 = apr_palloc(result_pool, sizeof(**diff_fns2)); 130 131 (*diff_fns2)->datasources_open = datasources_open; 132 (*diff_fns2)->datasource_close = datasource_close; 133 (*diff_fns2)->datasource_get_next_token = datasource_get_next_token; 134 (*diff_fns2)->token_compare = token_compare; 135 (*diff_fns2)->token_discard = token_discard; 136 (*diff_fns2)->token_discard_all = token_discard_all; 137 138 /* Initialize the wrapper baton. */ 139 *baton2 = apr_palloc(result_pool, sizeof (**baton2)); 140 (*baton2)->old_baton = baton; 141 (*baton2)->vtable = diff_fns; 142} 143 144 145/*** From diff_file.c ***/ 146svn_error_t * 147svn_diff_file_output_unified2(svn_stream_t *output_stream, 148 svn_diff_t *diff, 149 const char *original_path, 150 const char *modified_path, 151 const char *original_header, 152 const char *modified_header, 153 const char *header_encoding, 154 apr_pool_t *pool) 155{ 156 return svn_diff_file_output_unified3(output_stream, diff, 157 original_path, modified_path, 158 original_header, modified_header, 159 header_encoding, NULL, FALSE, pool); 160} 161 162svn_error_t * 163svn_diff_file_output_unified(svn_stream_t *output_stream, 164 svn_diff_t *diff, 165 const char *original_path, 166 const char *modified_path, 167 const char *original_header, 168 const char *modified_header, 169 apr_pool_t *pool) 170{ 171 return svn_diff_file_output_unified2(output_stream, diff, 172 original_path, modified_path, 173 original_header, modified_header, 174 SVN_APR_LOCALE_CHARSET, pool); 175} 176 177svn_error_t * 178svn_diff_file_diff(svn_diff_t **diff, 179 const char *original, 180 const char *modified, 181 apr_pool_t *pool) 182{ 183 return svn_diff_file_diff_2(diff, original, modified, 184 svn_diff_file_options_create(pool), pool); 185} 186 187svn_error_t * 188svn_diff_file_diff3(svn_diff_t **diff, 189 const char *original, 190 const char *modified, 191 const char *latest, 192 apr_pool_t *pool) 193{ 194 return svn_diff_file_diff3_2(diff, original, modified, latest, 195 svn_diff_file_options_create(pool), pool); 196} 197 198svn_error_t * 199svn_diff_file_diff4(svn_diff_t **diff, 200 const char *original, 201 const char *modified, 202 const char *latest, 203 const char *ancestor, 204 apr_pool_t *pool) 205{ 206 return svn_diff_file_diff4_2(diff, original, modified, latest, ancestor, 207 svn_diff_file_options_create(pool), pool); 208} 209 210svn_error_t * 211svn_diff_file_output_merge(svn_stream_t *output_stream, 212 svn_diff_t *diff, 213 const char *original_path, 214 const char *modified_path, 215 const char *latest_path, 216 const char *conflict_original, 217 const char *conflict_modified, 218 const char *conflict_latest, 219 const char *conflict_separator, 220 svn_boolean_t display_original_in_conflict, 221 svn_boolean_t display_resolved_conflicts, 222 apr_pool_t *pool) 223{ 224 svn_diff_conflict_display_style_t style = 225 svn_diff_conflict_display_modified_latest; 226 227 if (display_resolved_conflicts) 228 style = svn_diff_conflict_display_resolved_modified_latest; 229 230 if (display_original_in_conflict) 231 style = svn_diff_conflict_display_modified_original_latest; 232 233 return svn_diff_file_output_merge2(output_stream, 234 diff, 235 original_path, 236 modified_path, 237 latest_path, 238 conflict_original, 239 conflict_modified, 240 conflict_latest, 241 conflict_separator, 242 style, 243 pool); 244} 245 246 247/*** From diff.c ***/ 248svn_error_t * 249svn_diff_diff(svn_diff_t **diff, 250 void *diff_baton, 251 const svn_diff_fns_t *vtable, 252 apr_pool_t *pool) 253{ 254 svn_diff_fns2_t *diff_fns2; 255 struct fns_wrapper_baton *fwb; 256 257 wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); 258 return svn_diff_diff_2(diff, fwb, diff_fns2, pool); 259} 260 261 262/*** From diff3.c ***/ 263svn_error_t * 264svn_diff_diff3(svn_diff_t **diff, 265 void *diff_baton, 266 const svn_diff_fns_t *vtable, 267 apr_pool_t *pool) 268{ 269 svn_diff_fns2_t *diff_fns2; 270 struct fns_wrapper_baton *fwb; 271 272 wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); 273 return svn_diff_diff3_2(diff, fwb, diff_fns2, pool); 274} 275 276 277/*** From diff4.c ***/ 278svn_error_t * 279svn_diff_diff4(svn_diff_t **diff, 280 void *diff_baton, 281 const svn_diff_fns_t *vtable, 282 apr_pool_t *pool) 283{ 284 svn_diff_fns2_t *diff_fns2; 285 struct fns_wrapper_baton *fwb; 286 287 wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); 288 return svn_diff_diff4_2(diff, fwb, diff_fns2, pool); 289} 290