1 /* 2 * LibXDiff by Davide Libenzi ( File Differential Library ) 3 * Copyright (C) 2003 Davide Libenzi 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, see 17 * <http://www.gnu.org/licenses/>. 18 * 19 * Davide Libenzi <davidel@xmailserver.org> 20 * 21 */ 22 23 #if !defined(XDIFF_H) 24 #define XDIFF_H 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif /* #ifdef __cplusplus */ 29 30 /* xpparm_t.flags */ 31 #define XDF_NEED_MINIMAL (1 << 0) 32 33 #define XDF_IGNORE_WHITESPACE (1 << 1) 34 #define XDF_IGNORE_WHITESPACE_CHANGE (1 << 2) 35 #define XDF_IGNORE_WHITESPACE_AT_EOL (1 << 3) 36 #define XDF_IGNORE_CR_AT_EOL (1 << 4) 37 #define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | \ 38 XDF_IGNORE_WHITESPACE_CHANGE | \ 39 XDF_IGNORE_WHITESPACE_AT_EOL | \ 40 XDF_IGNORE_CR_AT_EOL) 41 42 #define XDF_IGNORE_BLANK_LINES (1 << 7) 43 44 #define XDF_PATIENCE_DIFF (1 << 14) 45 #define XDF_HISTOGRAM_DIFF (1 << 15) 46 #define XDF_DIFF_ALGORITHM_MASK (XDF_PATIENCE_DIFF | XDF_HISTOGRAM_DIFF) 47 #define XDF_DIFF_ALG(x) ((x) & XDF_DIFF_ALGORITHM_MASK) 48 49 #define XDF_INDENT_HEURISTIC (1 << 23) 50 51 /* xdemitconf_t.flags */ 52 #define XDL_EMIT_FUNCNAMES (1 << 0) 53 #define XDL_EMIT_NO_HUNK_HDR (1 << 1) 54 #define XDL_EMIT_FUNCCONTEXT (1 << 2) 55 56 /* merge simplification levels */ 57 #define XDL_MERGE_MINIMAL 0 58 #define XDL_MERGE_EAGER 1 59 #define XDL_MERGE_ZEALOUS 2 60 #define XDL_MERGE_ZEALOUS_ALNUM 3 61 62 /* merge favor modes */ 63 #define XDL_MERGE_FAVOR_OURS 1 64 #define XDL_MERGE_FAVOR_THEIRS 2 65 #define XDL_MERGE_FAVOR_UNION 3 66 67 /* merge output styles */ 68 #define XDL_MERGE_DIFF3 1 69 70 typedef struct s_mmfile { 71 char *ptr; 72 long size; 73 } mmfile_t; 74 75 typedef struct s_mmbuffer { 76 char *ptr; 77 long size; 78 } mmbuffer_t; 79 80 typedef struct s_xpparam { 81 unsigned long flags; 82 83 /* -I<regex> */ 84 regex_t **ignore_regex; 85 size_t ignore_regex_nr; 86 87 /* See Documentation/diff-options.txt. */ 88 char **anchors; 89 size_t anchors_nr; 90 } xpparam_t; 91 92 typedef struct s_xdemitcb { 93 void *priv; 94 int (*out_hunk)(void *, 95 long old_begin, long old_nr, 96 long new_begin, long new_nr, 97 const char *func, long funclen); 98 int (*out_line)(void *, mmbuffer_t *, int); 99 } xdemitcb_t; 100 101 typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv); 102 103 typedef int (*xdl_emit_hunk_consume_func_t)(long start_a, long count_a, 104 long start_b, long count_b, 105 void *cb_data); 106 107 typedef struct s_xdemitconf { 108 long ctxlen; 109 long interhunkctxlen; 110 unsigned long flags; 111 find_func_t find_func; 112 void *find_func_priv; 113 xdl_emit_hunk_consume_func_t hunk_func; 114 } xdemitconf_t; 115 116 typedef struct s_bdiffparam { 117 long bsize; 118 } bdiffparam_t; 119 120 121 #define xdl_malloc(x) xmalloc(x) 122 #define xdl_free(ptr) free(ptr) 123 #define xdl_realloc(ptr,x) xrealloc(ptr,x) 124 125 void *xdl_mmfile_first(mmfile_t *mmf, long *size); 126 long xdl_mmfile_size(mmfile_t *mmf); 127 128 int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, 129 xdemitconf_t const *xecfg, xdemitcb_t *ecb); 130 131 typedef struct s_xmparam { 132 xpparam_t xpp; 133 int marker_size; 134 int level; 135 int favor; 136 int style; 137 const char *ancestor; /* label for orig */ 138 const char *file1; /* label for mf1 */ 139 const char *file2; /* label for mf2 */ 140 } xmparam_t; 141 142 #define DEFAULT_CONFLICT_MARKER_SIZE 7 143 144 int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2, 145 xmparam_t const *xmp, mmbuffer_t *result); 146 147 #ifdef __cplusplus 148 } 149 #endif /* #ifdef __cplusplus */ 150 151 #endif /* #if !defined(XDIFF_H) */ 152