annotate src/diff.c @ 33399:95db67c7b754 v9.0.1958

patch 9.0.1958: cannot complete option values Commit: https://github.com/vim/vim/commit/900894b09a95398dfc75599e9f0aa2ea25723384 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Fri Sep 29 20:42:32 2023 +0200 patch 9.0.1958: cannot complete option values Problem: cannot complete option values Solution: Add completion functions for several options Add cmdline tab-completion for setting string options Add tab-completion for setting string options on the cmdline using `:set=` (along with `:set+=` and `:set-=`). The existing tab completion for setting options currently only works when nothing is typed yet, and it only fills in with the existing value, e.g. when the user does `:set diffopt=<Tab>` it will be completed to `set diffopt=internal,filler,closeoff` and nothing else. This isn't too useful as a user usually wants auto-complete to suggest all the possible values, such as 'iblank', or 'algorithm:patience'. For set= and set+=, this adds a new optional callback function for each option that can be invoked when doing completion. This allows for each option to have control over how completion works. For example, in 'diffopt', it will suggest the default enumeration, but if `algorithm:` is selected, it will further suggest different algorithm types like 'meyers' and 'patience'. When using set=, the existing option value will be filled in as the first choice to preserve the existing behavior. When using set+= this won't happen as it doesn't make sense. For flag list options (e.g. 'mouse' and 'guioptions'), completion will take into account existing typed values (and in the case of set+=, the existing option value) to make sure it doesn't suggest duplicates. For set-=, there is a new `ExpandSettingSubtract` function which will handle flag list and comma-separated options smartly, by only suggesting values that currently exist in the option. Note that Vim has some existing code that adds special handling for 'filetype', 'syntax', and misc dir options like 'backupdir'. This change preserves them as they already work, instead of converting to the new callback API for each option. closes: #13182 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 29 Sep 2023 20:45:04 +0200
parents 9c6bc59b6d80
children 1629cc65d78d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 10013
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
1788
61d080cb268e updated for version 7.2-086
vimboss
parents: 1761
diff changeset
11 * diff.c: code for diff'ing two, three or four buffers.
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
12 *
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
13 * There are three ways to diff:
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
14 * - Shell out to an external diff program, using files.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
15 * - Use the compiled-in xdiff library.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
16 * - Let 'diffexpr' do the work, using files.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 #include "vim.h"
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
20 #include "xdiff/xdiff.h"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 #if defined(FEAT_DIFF) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
24 static int diff_busy = FALSE; // using diff structs, don't change them
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
25 static int diff_need_update = FALSE; // ex_diffupdate needs to be called
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
27 // flags obtained from the 'diffopt' option
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
28 #define DIFF_FILLER 0x001 // display filler lines
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
29 #define DIFF_IBLANK 0x002 // ignore empty lines
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
30 #define DIFF_ICASE 0x004 // ignore case
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
31 #define DIFF_IWHITE 0x008 // ignore change in white space
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
32 #define DIFF_IWHITEALL 0x010 // ignore all white space changes
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
33 #define DIFF_IWHITEEOL 0x020 // ignore change in white space at EOL
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
34 #define DIFF_HORIZONTAL 0x040 // horizontal splits
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
35 #define DIFF_VERTICAL 0x080 // vertical splits
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
36 #define DIFF_HIDDEN_OFF 0x100 // diffoff when hidden
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
37 #define DIFF_INTERNAL 0x200 // use internal xdiff algorithm
18590
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
38 #define DIFF_CLOSE_OFF 0x400 // diffoff when closing window
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
39 #define DIFF_FOLLOWWRAP 0x800 // follow the wrap option
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
40 #define ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL)
18590
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
41 static int diff_flags = DIFF_INTERNAL | DIFF_FILLER | DIFF_CLOSE_OFF;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
43 static long diff_algorithm = 0;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
44
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
45 #define LBUFLEN 50 // length of line in diff file
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
46
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
47 static int diff_a_works = MAYBE; // TRUE when "diff -a" works, FALSE when it
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
48 // doesn't work, MAYBE when not checked yet
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
49 #if defined(MSWIN)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
50 static int diff_bin_works = MAYBE; // TRUE when "diff --binary" works, FALSE
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
51 // when it doesn't work, MAYBE when not
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
52 // checked yet
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
55 // used for diff input
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
56 typedef struct {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
57 char_u *din_fname; // used for external diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
58 mmfile_t din_mmfile; // used for internal diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
59 } diffin_T;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
60
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
61 // used for diff result
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
62 typedef struct {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
63 char_u *dout_fname; // used for external diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
64 garray_T dout_ga; // used for internal diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
65 } diffout_T;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
66
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
67 // used for recording hunks from xdiff
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
68 typedef struct {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
69 linenr_T lnum_orig;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
70 long count_orig;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
71 linenr_T lnum_new;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
72 long count_new;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
73 } diffhunk_T;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
74
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
75 // two diff inputs and one result
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
76 typedef struct {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
77 diffin_T dio_orig; // original file input
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
78 diffin_T dio_new; // new file input
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
79 diffout_T dio_diff; // diff result
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
80 int dio_internal; // using internal diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
81 } diffio_T;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
82
7799
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
83 static int diff_buf_idx(buf_T *buf);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
84 static int diff_buf_idx_tp(buf_T *buf, tabpage_T *tp);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
85 static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1, linenr_T line2, long amount, long amount_after);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
86 static void diff_check_unchanged(tabpage_T *tp, diff_T *dp);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
87 static int diff_check_sanity(tabpage_T *tp, diff_T *dp);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
88 static int check_external_diff(diffio_T *diffio);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
89 static int diff_file(diffio_T *diffio);
7799
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
90 static int diff_equal_entry(diff_T *dp, int idx1, int idx2);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
91 static int diff_cmp(char_u *s1, char_u *s2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 #ifdef FEAT_FOLDING
7799
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
93 static void diff_fold_update(diff_T *dp, int skip_idx);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 #endif
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
95 static void diff_read(int idx_orig, int idx_new, diffio_T *dio);
7799
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
96 static void diff_copy_entry(diff_T *dprev, diff_T *dp, int idx_orig, int idx_new);
af3c41a3c53f commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents: 7338
diff changeset
97 static diff_T *diff_alloc_new(tabpage_T *tp, diff_T *dprev, diff_T *dp);
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
98 static int parse_diff_ed(char_u *line, diffhunk_T *hunk);
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
99 static int parse_diff_unified(char_u *line, diffhunk_T *hunk);
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
100 static int xdiff_out(long start_a, long count_a, long start_b, long count_b, void *priv);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
102 #define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
103 for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
104
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * Called when deleting or unloading a buffer: No longer make a diff with it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
109 diff_buf_delete(buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 int i;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
112 tabpage_T *tp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
114 FOR_ALL_TABPAGES(tp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
116 i = diff_buf_idx_tp(buf, tp);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
117 if (i != DB_COUNT)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
118 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
119 tp->tp_diffbuf[i] = NULL;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
120 tp->tp_diff_invalid = TRUE;
1761
0836531167ab updated for version 7.2-059
vimboss
parents: 1757
diff changeset
121 if (tp == curtab)
29293
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
122 {
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
123 // don't redraw right away, more might change or buffer state
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
124 // is invalid right now
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
125 need_diff_redraw = TRUE;
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29566
diff changeset
126 redraw_later(UPD_VALID);
29293
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
127 }
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
128 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 /*
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
133 * Check if the current buffer should be added to or removed from the list of
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
134 * diff buffers.
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
135 */
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
136 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
137 diff_buf_adjust(win_T *win)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
138 {
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
139 win_T *wp;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
140 int i;
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
141
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
142 if (!win->w_p_diff)
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
143 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
144 // When there is no window showing a diff for this buffer, remove
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
145 // it from the diffs.
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
146 FOR_ALL_WINDOWS(wp)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
147 if (wp->w_buffer == win->w_buffer && wp->w_p_diff)
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
148 break;
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
149 if (wp == NULL)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
150 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
151 i = diff_buf_idx(win->w_buffer);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
152 if (i != DB_COUNT)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
153 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
154 curtab->tp_diffbuf[i] = NULL;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
155 curtab->tp_diff_invalid = TRUE;
1761
0836531167ab updated for version 7.2-059
vimboss
parents: 1757
diff changeset
156 diff_redraw(TRUE);
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
157 }
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
158 }
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
159 }
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
160 else
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
161 diff_buf_add(win->w_buffer);
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
162 }
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
163
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
164 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 * Add a buffer to make diffs for.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
166 * Call this when a new buffer is being edited in the current window where
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
167 * 'diff' is set.
1788
61d080cb268e updated for version 7.2-086
vimboss
parents: 1761
diff changeset
168 * Marks the current buffer as being part of the diff and requiring updating.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
169 * This must be done before any autocmd, because a command may use info
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
170 * about the screen contents.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
173 diff_buf_add(buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 if (diff_buf_idx(buf) != DB_COUNT)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
178 return; // It's already there.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
181 if (curtab->tp_diffbuf[i] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
183 curtab->tp_diffbuf[i] = buf;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
184 curtab->tp_diff_invalid = TRUE;
1761
0836531167ab updated for version 7.2-059
vimboss
parents: 1757
diff changeset
185 diff_redraw(TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
189 semsg(_(e_cannot_diff_more_than_nr_buffers), DB_COUNT);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 /*
10821
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
193 * Remove all buffers to make diffs for.
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
194 */
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
195 static void
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
196 diff_buf_clear(void)
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
197 {
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
198 int i;
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
199
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
200 for (i = 0; i < DB_COUNT; ++i)
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
201 if (curtab->tp_diffbuf[i] != NULL)
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
202 {
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
203 curtab->tp_diffbuf[i] = NULL;
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
204 curtab->tp_diff_invalid = TRUE;
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
205 diff_redraw(TRUE);
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
206 }
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
207 }
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
208
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
209 /*
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
210 * Find buffer "buf" in the list of diff buffers for the current tab page.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 * Return its index or DB_COUNT if not found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 static int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
214 diff_buf_idx(buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 for (idx = 0; idx < DB_COUNT; ++idx)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
219 if (curtab->tp_diffbuf[idx] == buf)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
220 break;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
221 return idx;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
222 }
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
223
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
224 /*
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
225 * Find buffer "buf" in the list of diff buffers for tab page "tp".
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
226 * Return its index or DB_COUNT if not found.
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
227 */
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
228 static int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
229 diff_buf_idx_tp(buf_T *buf, tabpage_T *tp)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
230 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
231 int idx;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
232
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
233 for (idx = 0; idx < DB_COUNT; ++idx)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
234 if (tp->tp_diffbuf[idx] == buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 return idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 /*
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
240 * Mark the diff info involving buffer "buf" as invalid, it will be updated
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
241 * when info is requested.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
244 diff_invalidate(buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
246 tabpage_T *tp;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
247 int i;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
248
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
249 FOR_ALL_TABPAGES(tp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
251 i = diff_buf_idx_tp(buf, tp);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
252 if (i != DB_COUNT)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
253 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
254 tp->tp_diff_invalid = TRUE;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
255 if (tp == curtab)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
256 diff_redraw(TRUE);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
257 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 /*
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
262 * Called by mark_adjust(): update line numbers in "curbuf".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
265 diff_mark_adjust(
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
266 linenr_T line1,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
267 linenr_T line2,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
268 long amount,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
269 long amount_after)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
271 int idx;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
272 tabpage_T *tp;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
273
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
274 // Handle all tab pages that use the current buffer in a diff.
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
275 FOR_ALL_TABPAGES(tp)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
276 {
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
277 idx = diff_buf_idx_tp(curbuf, tp);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
278 if (idx != DB_COUNT)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
279 diff_mark_adjust_tp(tp, idx, line1, line2, amount, amount_after);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
280 }
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
281 }
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
282
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
283 /*
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
284 * Update line numbers in tab page "tp" for "curbuf" with index "idx".
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
285 * This attempts to update the changes as much as possible:
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
286 * When inserting/deleting lines outside of existing change blocks, create a
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
287 * new change block and update the line numbers in following blocks.
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
288 * When inserting/deleting lines in existing change blocks, update them.
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
289 */
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
290 static void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
291 diff_mark_adjust_tp(
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
292 tabpage_T *tp,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
293 int idx,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
294 linenr_T line1,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
295 linenr_T line2,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
296 long amount,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
297 long amount_after)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
298 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 diff_T *dprev;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 diff_T *dnext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 int inserted, deleted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 int n, off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 linenr_T last;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
306 linenr_T lnum_deleted = line1; // lnum of remaining deletion
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 int check_unchanged;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
309 if (diff_internal())
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
310 {
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
311 // Will update diffs before redrawing. Set _invalid to update the
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
312 // diffs themselves, set _update to also update folds properly just
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
313 // before redrawing.
14972
5d52b21b2e7f patch 8.1.0497: :%diffput changes order of lines
Bram Moolenaar <Bram@vim.org>
parents: 14893
diff changeset
314 // Do update marks here, it is needed for :%diffput.
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
315 tp->tp_diff_invalid = TRUE;
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
316 tp->tp_diff_update = TRUE;
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
317 }
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
318
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 if (line2 == MAXLNUM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
321 // mark_adjust(99, MAXLNUM, 9, 0): insert lines
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 inserted = amount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 deleted = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 else if (amount_after > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
327 // mark_adjust(99, 98, MAXLNUM, 9): a change that inserts lines
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 inserted = amount_after;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 deleted = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
333 // mark_adjust(98, 99, MAXLNUM, -2): delete lines
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 inserted = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 deleted = -amount_after;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 dprev = NULL;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
339 dp = tp->tp_first_diff;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
342 // If the change is after the previous diff block and before the next
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
343 // diff block, thus not touching an existing change, create a new diff
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
344 // block. Don't do this when ex_diffgetput() is busy.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 if ((dp == NULL || dp->df_lnum[idx] - 1 > line2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 || (line2 == MAXLNUM && dp->df_lnum[idx] > line1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 && (dprev == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 || dprev->df_lnum[idx] + dprev->df_count[idx] < line1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 && !diff_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
351 dnext = diff_alloc_new(tp, dprev, dp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 if (dnext == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 dnext->df_lnum[idx] = line1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 dnext->df_count[idx] = inserted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
358 if (tp->tp_diffbuf[i] != NULL && i != idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 if (dprev == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 dnext->df_lnum[i] = line1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 dnext->df_lnum[i] = line1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 + (dprev->df_lnum[i] + dprev->df_count[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 - (dprev->df_lnum[idx] + dprev->df_count[idx]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 dnext->df_count[i] = deleted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
370 // if at end of the list, quit
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 if (dp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 * Check for these situations:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 * 1 2 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 * 1 2 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 * line1 2 3 4 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 * 2 3 4 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 * 2 3 4 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 * line2 2 3 4 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 * 3 5 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 * 3 5 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 */
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
385 // compute last line of this change
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 last = dp->df_lnum[idx] + dp->df_count[idx] - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
388 // 1. change completely above line1: nothing to do
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 if (last >= line1 - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
391 // 6. change below line2: only adjust for amount_after; also when
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
392 // "deleted" became zero when deleted all lines between two diffs
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 if (dp->df_lnum[idx] - (deleted + inserted != 0) > line2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 if (amount_after == 0)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
396 break; // nothing left to change
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 dp->df_lnum[idx] += amount_after;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 check_unchanged = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
403 // 2. 3. 4. 5.: inserted/deleted lines touching this diff.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 if (deleted > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 {
29295
92dd6fef5ace patch 8.2.5164: invalid memory access after diff buffer manipulations
Bram Moolenaar <Bram@vim.org>
parents: 29293
diff changeset
406 off = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 if (dp->df_lnum[idx] >= line1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 if (last <= line2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
411 // 4. delete all lines of diff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 if (dp->df_next != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 && dp->df_next->df_lnum[idx] - 1 <= line2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
415 // delete continues in next diff, only do
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
416 // lines until that one
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 n = dp->df_next->df_lnum[idx] - lnum_deleted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 deleted -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 n -= dp->df_count[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 lnum_deleted = dp->df_next->df_lnum[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 n = deleted - dp->df_count[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 dp->df_count[idx] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
428 // 5. delete lines at or just before top of diff
29295
92dd6fef5ace patch 8.2.5164: invalid memory access after diff buffer manipulations
Bram Moolenaar <Bram@vim.org>
parents: 29293
diff changeset
429 off = dp->df_lnum[idx] - lnum_deleted;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 n = off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 dp->df_count[idx] -= line2 - dp->df_lnum[idx] + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 check_unchanged = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 dp->df_lnum[idx] = line1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 if (last < line2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
440 // 2. delete at end of diff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 dp->df_count[idx] -= last - lnum_deleted + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 if (dp->df_next != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 && dp->df_next->df_lnum[idx] - 1 <= line2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
445 // delete continues in next diff, only do
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
446 // lines until that one
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 n = dp->df_next->df_lnum[idx] - 1 - last;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 deleted -= dp->df_next->df_lnum[idx]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 - lnum_deleted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 lnum_deleted = dp->df_next->df_lnum[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 n = line2 - last;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 check_unchanged = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
458 // 3. delete lines inside the diff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 dp->df_count[idx] -= deleted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
465 if (tp->tp_diffbuf[i] != NULL && i != idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 {
29519
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
467 if (dp->df_lnum[i] > off)
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
468 dp->df_lnum[i] -= off;
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
469 else
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
470 dp->df_lnum[i] = 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 dp->df_count[i] += n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 if (dp->df_lnum[idx] <= line1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
478 // inserted lines somewhere in this diff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 dp->df_count[idx] += inserted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 check_unchanged = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
483 // inserted lines somewhere above this diff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 dp->df_lnum[idx] += inserted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 if (check_unchanged)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
488 // Check if inserted lines are equal, may reduce the
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
489 // size of the diff. TODO: also check for equal lines
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
490 // in the middle and perhaps split the block.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
491 diff_check_unchanged(tp, dp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
495 // check if this block touches the previous one, may merge them.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 if (dprev != NULL && dprev->df_lnum[idx] + dprev->df_count[idx]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 == dp->df_lnum[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
500 if (tp->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 dprev->df_count[i] += dp->df_count[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 dprev->df_next = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 vim_free(dp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 dp = dprev->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
508 // Advance to next entry.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 dprev = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 dprev = NULL;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
515 dp = tp->tp_first_diff;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 while (dp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
518 // All counts are zero, remove this entry.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
520 if (tp->tp_diffbuf[i] != NULL && dp->df_count[i] != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 if (i == DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 dnext = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 vim_free(dp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 dp = dnext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 if (dprev == NULL)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
528 tp->tp_first_diff = dnext;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 dprev->df_next = dnext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
534 // Advance to next entry.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 dprev = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 }
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
540
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
541 if (tp == curtab)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
542 {
17851
ba63a184e6b6 patch 8.1.1922: in diff mode global operations can be very slow
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
543 // Don't redraw right away, this updates the diffs, which can be slow.
ba63a184e6b6 patch 8.1.1922: in diff mode global operations can be very slow
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
544 need_diff_redraw = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
546 // Need to recompute the scroll binding, may remove or add filler
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
547 // lines (e.g., when adding lines above w_topline). But it's slow when
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
548 // making many changes, postpone until redrawing.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
549 diff_need_scrollbind = TRUE;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
550 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 * Allocate a new diff block and link it between "dprev" and "dp".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 static diff_T *
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
557 diff_alloc_new(tabpage_T *tp, diff_T *dprev, diff_T *dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 diff_T *dnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16806
diff changeset
561 dnew = ALLOC_ONE(diff_T);
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
562 if (dnew == NULL)
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
563 return NULL;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
564
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
565 dnew->df_next = dp;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
566 if (dprev == NULL)
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
567 tp->tp_first_diff = dnew;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
568 else
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31531
diff changeset
569 dprev->df_next = dnew;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 return dnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 * Check if the diff block "dp" can be made smaller for lines at the start and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 * end that are equal. Called after inserting lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 * This may result in a change where all buffers have zero lines, the caller
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 * must take care of removing it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 static void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
580 diff_check_unchanged(tabpage_T *tp, diff_T *dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 int i_org;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 int i_new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 int off_org, off_new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 char_u *line_org;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 int dir = FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
588 // Find the first buffers, use it as the original, compare the other
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
589 // buffer lines against this one.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 for (i_org = 0; i_org < DB_COUNT; ++i_org)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
591 if (tp->tp_diffbuf[i_org] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 break;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
593 if (i_org == DB_COUNT) // safety check
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
596 if (diff_check_sanity(tp, dp) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
599 // First check lines at the top, then at the bottom.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 off_org = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 off_new = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
604 // Repeat until a line is found which is different or the number of
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
605 // lines has become zero.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 while (dp->df_count[i_org] > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
608 // Copy the line, the next ml_get() will invalidate it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 if (dir == BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 off_org = dp->df_count[i_org] - 1;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
611 line_org = vim_strsave(ml_get_buf(tp->tp_diffbuf[i_org],
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 dp->df_lnum[i_org] + off_org, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 if (line_org == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 for (i_new = i_org + 1; i_new < DB_COUNT; ++i_new)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
617 if (tp->tp_diffbuf[i_new] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 if (dir == BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 off_new = dp->df_count[i_new] - 1;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
621 // if other buffer doesn't have this line, it was inserted
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 if (off_new < 0 || off_new >= dp->df_count[i_new])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 break;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
624 if (diff_cmp(line_org, ml_get_buf(tp->tp_diffbuf[i_new],
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 dp->df_lnum[i_new] + off_new, FALSE)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 vim_free(line_org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
630 // Stop when a line isn't equal in all diff buffers.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 if (i_new != DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
634 // Line matched in all buffers, remove it from the diff.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 for (i_new = i_org; i_new < DB_COUNT; ++i_new)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
636 if (tp->tp_diffbuf[i_new] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 if (dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 ++dp->df_lnum[i_new];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 --dp->df_count[i_new];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 if (dir == BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 dir = BACKWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 * Check if a diff block doesn't contain invalid line numbers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 * This can happen when the diff program returns invalid results.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 static int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
654 diff_check_sanity(tabpage_T *tp, diff_T *dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
659 if (tp->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 if (dp->df_lnum[i] + dp->df_count[i] - 1
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
661 > tp->tp_diffbuf[i]->b_ml.ml_line_count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 /*
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
667 * Mark all diff buffers in the current tab page for redraw.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 */
17851
ba63a184e6b6 patch 8.1.1922: in diff mode global operations can be very slow
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
669 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
670 diff_redraw(
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
671 int dofold) // also recompute the folds
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 win_T *wp;
25717
d3f992bc6ef8 patch 8.2.3394: filler lines are wrong when changing text in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25709
diff changeset
674 win_T *wp_other = NULL;
26044
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
675 int used_max_fill_other = FALSE;
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
676 int used_max_fill_curwin = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678
17851
ba63a184e6b6 patch 8.1.1922: in diff mode global operations can be very slow
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
679 need_diff_redraw = FALSE;
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
680 FOR_ALL_WINDOWS(wp)
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
681 {
29293
bf4d7898cf93 patch 8.2.5163: crash when deleting buffers in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 28457
diff changeset
682 // when closing windows or wiping buffers skip invalid window
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
683 if (!wp->w_p_diff || !buf_valid(wp->w_buffer))
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
684 continue;
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
685
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29566
diff changeset
686 redraw_win_later(wp, UPD_SOME_VALID);
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
687 if (wp != curwin)
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
688 wp_other = wp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 #ifdef FEAT_FOLDING
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
690 if (dofold && foldmethodIsDiff(wp))
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
691 foldUpdateAll(wp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 #endif
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
693 // A change may have made filler lines invalid, need to take care of
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
694 // that for other windows.
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
695 n = diff_check(wp, wp->w_topline);
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
696 if ((wp != curwin && wp->w_topfill > 0) || n > 0)
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
697 {
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
698 if (wp->w_topfill > n)
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
699 wp->w_topfill = (n < 0 ? 0 : n);
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
700 else if (n > 0 && n > wp->w_topfill)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 {
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
702 wp->w_topfill = n;
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
703 if (wp == curwin)
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
704 used_max_fill_curwin = TRUE;
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
705 else if (wp_other != NULL)
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
706 used_max_fill_other = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 }
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
708 check_topfill(wp, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 }
29566
99e3763cbd34 patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents: 29519
diff changeset
710 }
25717
d3f992bc6ef8 patch 8.2.3394: filler lines are wrong when changing text in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25709
diff changeset
711
26044
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
712 if (wp_other != NULL && curwin->w_p_scb)
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
713 {
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
714 if (used_max_fill_curwin)
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
715 // The current window was set to use the maximum number of filler
26044
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
716 // lines, may need to reduce them.
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
717 diff_set_topline(wp_other, curwin);
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
718 else if (used_max_fill_other)
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
719 // The other window was set to use the maximum number of filler
26044
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
720 // lines, may need to reduce them.
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
721 diff_set_topline(curwin, wp_other);
2e8226c03007 patch 8.2.3556: filler lines are incorrect for other window in diff mode
Bram Moolenaar <Bram@vim.org>
parents: 25717
diff changeset
722 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
725 static void
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
726 clear_diffin(diffin_T *din)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
727 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
728 if (din->din_fname == NULL)
32120
97255d909654 patch 9.0.1391: "clear" macros are not always used
Bram Moolenaar <Bram@vim.org>
parents: 32118
diff changeset
729 VIM_CLEAR(din->din_mmfile.ptr);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
730 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
731 mch_remove(din->din_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
732 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
733
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
734 static void
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
735 clear_diffout(diffout_T *dout)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
736 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
737 if (dout->dout_fname == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
738 ga_clear_strings(&dout->dout_ga);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
739 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
740 mch_remove(dout->dout_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
741 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
742
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 /*
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
744 * Write buffer "buf" to a memory buffer.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
745 * Return FAIL for failure.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 static int
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
748 diff_write_buffer(buf_T *buf, diffin_T *din)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
749 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
750 linenr_T lnum;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
751 char_u *s;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
752 long len = 0;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
753 char_u *ptr;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
754
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
755 // xdiff requires one big block of memory with all the text.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
756 for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
14766
7a11facdf74b patch 8.1.0395: compiler warning on 64-bit MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 14764
diff changeset
757 len += (long)STRLEN(ml_get_buf(buf, lnum, FALSE)) + 1;
16768
695d9ef00b03 patch 8.1.1386: unessesary type casts for lalloc()
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
758 ptr = alloc(len);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
759 if (ptr == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
760 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
761 // Allocating memory failed. This can happen, because we try to read
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
762 // the whole buffer text into memory. Set the failed flag, the diff
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
763 // will be retried with external diff. The flag is never reset.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
764 buf->b_diff_failed = TRUE;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
765 if (p_verbose > 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
766 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
767 verbose_enter();
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 15103
diff changeset
768 smsg(_("Not enough memory to use internal diff for buffer \"%s\""),
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
769 buf->b_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
770 verbose_leave();
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
771 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
772 return FAIL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
773 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
774 din->din_mmfile.ptr = (char *)ptr;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
775 din->din_mmfile.size = len;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
776
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
777 len = 0;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
778 for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
779 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
780 for (s = ml_get_buf(buf, lnum, FALSE); *s != NUL; )
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
781 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
782 if (diff_flags & DIFF_ICASE)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
783 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
784 int c;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
785 int orig_len;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
786 char_u cbuf[MB_MAXBYTES + 1];
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
787
26794
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
788 if (*s == NL)
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
789 c = NUL;
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
790 else
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
791 {
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
792 // xdiff doesn't support ignoring case, fold-case the text.
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
793 c = PTR2CHAR(s);
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
794 c = MB_CASEFOLD(c);
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
795 }
18251
c8a53c0daeed patch 8.1.2120: some MB_ macros are more complicated than necessary
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
796 orig_len = mb_ptr2len(s);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
797 if (mb_char2bytes(c, cbuf) != orig_len)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
798 // TODO: handle byte length difference
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
799 mch_memmove(ptr + len, s, orig_len);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
800 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
801 mch_memmove(ptr + len, cbuf, orig_len);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
802
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
803 s += orig_len;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
804 len += orig_len;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
805 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
806 else
26794
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
807 {
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
808 ptr[len++] = *s == NL ? NUL : *s;
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
809 s++;
83a99f08d1e8 patch 8.2.3925: diff mode confused by NUL bytes
Bram Moolenaar <Bram@vim.org>
parents: 26786
diff changeset
810 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
811 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
812 ptr[len++] = NL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
813 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
814 return OK;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
815 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
816
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
817 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
818 * Write buffer "buf" to file or memory buffer.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
819 * Return FAIL for failure.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
820 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
821 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
822 diff_write(buf_T *buf, diffin_T *din)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 int r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 char_u *save_ff;
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
826 int save_cmod_flags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
828 if (din->din_fname == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
829 return diff_write_buffer(buf, din);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
830
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
831 // Always use 'fileformat' set to "unix".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 save_ff = buf->b_p_ff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
834 save_cmod_flags = cmdmod.cmod_flags;
18619
788d76db02ac patch 8.1.2302: :lockmarks does not work for '[ and ']
Bram Moolenaar <Bram@vim.org>
parents: 18590
diff changeset
835 // Writing the buffer is an implementation detail of performing the diff,
788d76db02ac patch 8.1.2302: :lockmarks does not work for '[ and ']
Bram Moolenaar <Bram@vim.org>
parents: 18590
diff changeset
836 // so it shouldn't update the '[ and '] marks.
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
837 cmdmod.cmod_flags |= CMOD_LOCKMARKS;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
838 r = buf_write(buf, din->din_fname, NULL,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
839 (linenr_T)1, buf->b_ml.ml_line_count,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
840 NULL, FALSE, FALSE, FALSE, TRUE);
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
841 cmdmod.cmod_flags = save_cmod_flags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 free_string_option(buf->b_p_ff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 buf->b_p_ff = save_ff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 return r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 /*
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
848 * Update the diffs for all buffers involved.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
849 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
850 static void
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
851 diff_try_update(
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
852 diffio_T *dio,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
853 int idx_orig,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
854 exarg_T *eap) // "eap" can be NULL
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
855 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
856 buf_T *buf;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
857 int idx_new;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
858
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
859 if (dio->dio_internal)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
860 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
861 ga_init2(&dio->dio_diff.dout_ga, sizeof(char *), 1000);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
862 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
863 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
864 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
865 // We need three temp file names.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
866 dio->dio_orig.din_fname = vim_tempname('o', TRUE);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
867 dio->dio_new.din_fname = vim_tempname('n', TRUE);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
868 dio->dio_diff.dout_fname = vim_tempname('d', TRUE);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
869 if (dio->dio_orig.din_fname == NULL
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
870 || dio->dio_new.din_fname == NULL
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
871 || dio->dio_diff.dout_fname == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
872 goto theend;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
873 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
874
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
875 // Check external diff is actually working.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
876 if (!dio->dio_internal && check_external_diff(dio) == FAIL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
877 goto theend;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
878
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
879 // :diffupdate!
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
880 if (eap != NULL && eap->forceit)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
881 for (idx_new = idx_orig; idx_new < DB_COUNT; ++idx_new)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
882 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
883 buf = curtab->tp_diffbuf[idx_new];
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
884 if (buf_valid(buf))
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
885 buf_check_timestamp(buf, FALSE);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
886 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
887
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
888 // Write the first buffer to a tempfile or mmfile_t.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
889 buf = curtab->tp_diffbuf[idx_orig];
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
890 if (diff_write(buf, &dio->dio_orig) == FAIL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
891 goto theend;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
892
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
893 // Make a difference between the first buffer and every other.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
894 for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
895 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
896 buf = curtab->tp_diffbuf[idx_new];
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
897 if (buf == NULL || buf->b_ml.ml_mfp == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
898 continue; // skip buffer that isn't loaded
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
899
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
900 // Write the other buffer and diff with the first one.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
901 if (diff_write(buf, &dio->dio_new) == FAIL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
902 continue;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
903 if (diff_file(dio) == FAIL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
904 continue;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
905
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
906 // Read the diff output and add each entry to the diff list.
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
907 diff_read(idx_orig, idx_new, dio);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
908
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
909 clear_diffin(&dio->dio_new);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
910 clear_diffout(&dio->dio_diff);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
911 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
912 clear_diffin(&dio->dio_orig);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
913
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
914 theend:
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
915 vim_free(dio->dio_orig.din_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
916 vim_free(dio->dio_new.din_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
917 vim_free(dio->dio_diff.dout_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
918 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
919
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
920 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
921 * Return TRUE if the options are set to use the internal diff library.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
922 * Note that if the internal diff failed for one of the buffers, the external
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
923 * diff will be used anyway.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
924 */
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
925 int
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
926 diff_internal(void)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
927 {
15971
ced614446eaa patch 8.1.0991: cannot build with a mix of features
Bram Moolenaar <Bram@vim.org>
parents: 15900
diff changeset
928 return (diff_flags & DIFF_INTERNAL) != 0
ced614446eaa patch 8.1.0991: cannot build with a mix of features
Bram Moolenaar <Bram@vim.org>
parents: 15900
diff changeset
929 #ifdef FEAT_EVAL
ced614446eaa patch 8.1.0991: cannot build with a mix of features
Bram Moolenaar <Bram@vim.org>
parents: 15900
diff changeset
930 && *p_dex == NUL
ced614446eaa patch 8.1.0991: cannot build with a mix of features
Bram Moolenaar <Bram@vim.org>
parents: 15900
diff changeset
931 #endif
ced614446eaa patch 8.1.0991: cannot build with a mix of features
Bram Moolenaar <Bram@vim.org>
parents: 15900
diff changeset
932 ;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
933 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
934
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
935 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
936 * Return TRUE if the internal diff failed for one of the diff buffers.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
937 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
938 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
939 diff_internal_failed(void)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
940 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
941 int idx;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
942
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
943 // Only need to do something when there is another buffer.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
944 for (idx = 0; idx < DB_COUNT; ++idx)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
945 if (curtab->tp_diffbuf[idx] != NULL
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
946 && curtab->tp_diffbuf[idx]->b_diff_failed)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
947 return TRUE;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
948 return FALSE;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
949 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
950
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
951 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 * Completely update the diffs for the buffers involved.
14764
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
953 * When using the external "diff" command the buffers are written to a file,
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
954 * also for unmodified buffers (the file could have been produced by
f562b9fbd0d3 patch 8.1.0394: diffs are not always updated correctly
Christian Brabandt <cb@256bit.org>
parents: 14762
diff changeset
955 * autocommands, e.g. the netrw plugin).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 void
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
958 ex_diffupdate(exarg_T *eap) // "eap" can be NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 int idx_orig;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 int idx_new;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
962 diffio_T diffio;
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
963 int had_diffs = curtab->tp_first_diff != NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
965 if (diff_busy)
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
966 {
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
967 diff_need_update = TRUE;
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
968 return;
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
969 }
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
970
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
971 // Delete all diffblocks.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
972 diff_clear(curtab);
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
973 curtab->tp_diff_invalid = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
975 // Use the first buffer as the original text.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 for (idx_orig = 0; idx_orig < DB_COUNT; ++idx_orig)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
977 if (curtab->tp_diffbuf[idx_orig] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 if (idx_orig == DB_COUNT)
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
980 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
982 // Only need to do something when there is another buffer.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
984 if (curtab->tp_diffbuf[idx_new] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 if (idx_new == DB_COUNT)
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
987 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
989 // Only use the internal method if it did not fail for one of the buffers.
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
990 CLEAR_FIELD(diffio);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
991 diffio.dio_internal = diff_internal() && !diff_internal_failed();
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
992
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
993 diff_try_update(&diffio, idx_orig, eap);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
994 if (diffio.dio_internal && diff_internal_failed())
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
995 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
996 // Internal diff failed, use external diff instead.
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
997 CLEAR_FIELD(diffio);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
998 diff_try_update(&diffio, idx_orig, eap);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
999 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1000
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1001 // force updating cursor position on screen
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1002 curwin->w_valid_cursor.lnum = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1004 theend:
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1005 // A redraw is needed if there were diffs and they were cleared, or there
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1006 // are diffs now, which means they got updated.
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1007 if (had_diffs || curtab->tp_first_diff != NULL)
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1008 {
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1009 diff_redraw(TRUE);
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1010 apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
1011 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1012 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1013
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1014 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1015 * Do a quick test if "diff" really works. Otherwise it looks like there
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1016 * are no differences. Can't use the return value, it's non-zero when
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1017 * there are differences.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1018 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1019 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1020 check_external_diff(diffio_T *diffio)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1021 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1022 FILE *fd;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1023 int ok;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1024 int io_error = FALSE;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1025
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1026 // May try twice, first with "-a" and then without.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 ok = FALSE;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1030 fd = mch_fopen((char *)diffio->dio_orig.din_fname, "w");
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1031 if (fd == NULL)
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1032 io_error = TRUE;
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1033 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1035 if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1)
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1036 io_error = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 fclose(fd);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1038 fd = mch_fopen((char *)diffio->dio_new.din_fname, "w");
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1039 if (fd == NULL)
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1040 io_error = TRUE;
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1041 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1043 if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1)
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1044 io_error = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 fclose(fd);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1046 fd = NULL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1047 if (diff_file(diffio) == OK)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1048 fd = mch_fopen((char *)diffio->dio_diff.dout_fname, "r");
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1049 if (fd == NULL)
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1050 io_error = TRUE;
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1051 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 char_u linebuf[LBUFLEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 {
24683
05c199ea8295 patch 8.2.2880: unified diff fails if actually used
Bram Moolenaar <Bram@vim.org>
parents: 23895
diff changeset
1057 // For normal diff there must be a line that contains
05c199ea8295 patch 8.2.2880: unified diff fails if actually used
Bram Moolenaar <Bram@vim.org>
parents: 23895
diff changeset
1058 // "1c1". For unified diff "@@ -1 +1 @@".
15840
734b1928a5aa patch 8.1.0927: USE_CR is never defined
Bram Moolenaar <Bram@vim.org>
parents: 15595
diff changeset
1059 if (vim_fgets(linebuf, LBUFLEN, fd))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 break;
24683
05c199ea8295 patch 8.2.2880: unified diff fails if actually used
Bram Moolenaar <Bram@vim.org>
parents: 23895
diff changeset
1061 if (STRNCMP(linebuf, "1c1", 3) == 0
05c199ea8295 patch 8.2.2880: unified diff fails if actually used
Bram Moolenaar <Bram@vim.org>
parents: 23895
diff changeset
1062 || STRNCMP(linebuf, "@@ -1 +1 @@", 11) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 ok = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1067 mch_remove(diffio->dio_diff.dout_fname);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1068 mch_remove(diffio->dio_new.din_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1070 mch_remove(diffio->dio_orig.din_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 #ifdef FEAT_EVAL
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1074 // When using 'diffexpr' break here.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 if (*p_dex != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
1079 #if defined(MSWIN)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1080 // If the "-a" argument works, also check if "--binary" works.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 if (ok && diff_a_works == MAYBE && diff_bin_works == MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 diff_a_works = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 diff_bin_works = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 if (!ok && diff_a_works == TRUE && diff_bin_works == TRUE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1089 // Tried --binary, but it failed. "-a" works though.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 diff_bin_works = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 ok = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1095 // If we checked if "-a" works already, break here.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 if (diff_a_works != MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 diff_a_works = ok;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1100 // If "-a" works break here, otherwise retry without "-a".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 if (ok)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 if (!ok)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1519
diff changeset
1106 if (io_error)
26962
85866e069c24 patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
1107 emsg(_(e_cannot_read_or_write_temp_files));
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
1108 emsg(_(e_cannot_create_diffs));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 diff_a_works = MAYBE;
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
1110 #if defined(MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 diff_bin_works = MAYBE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 #endif
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1113 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1115 return OK;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1116 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1117
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1118 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1119 * Invoke the xdiff function.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1120 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1121 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1122 diff_file_internal(diffio_T *diffio)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1123 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1124 xpparam_t param;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1125 xdemitconf_t emit_cfg;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1126 xdemitcb_t emit_cb;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
1128 CLEAR_FIELD(param);
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
1129 CLEAR_FIELD(emit_cfg);
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
1130 CLEAR_FIELD(emit_cb);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1131
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1132 param.flags = diff_algorithm;
3524
d8ce4a2eb44e updated for version 7.3.523
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1133
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1134 if (diff_flags & DIFF_IWHITE)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1135 param.flags |= XDF_IGNORE_WHITESPACE_CHANGE;
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1136 if (diff_flags & DIFF_IWHITEALL)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1137 param.flags |= XDF_IGNORE_WHITESPACE;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1138 if (diff_flags & DIFF_IWHITEEOL)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1139 param.flags |= XDF_IGNORE_WHITESPACE_AT_EOL;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1140 if (diff_flags & DIFF_IBLANK)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
1141 param.flags |= XDF_IGNORE_BLANK_LINES;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1143 emit_cfg.ctxlen = 0; // don't need any diff_context here
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1144 emit_cb.priv = &diffio->dio_diff;
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1145 emit_cfg.hunk_func = xdiff_out;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1146 if (xdl_diff(&diffio->dio_orig.din_mmfile,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1147 &diffio->dio_new.din_mmfile,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1148 &param, &emit_cfg, &emit_cb) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26962
diff changeset
1150 emsg(_(e_problem_creating_internal_diff));
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1151 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1153 return OK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 * Make a diff between files "tmp_orig" and "tmp_new", results in "tmp_diff".
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1158 * return OK or FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 */
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1160 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1161 diff_file(diffio_T *dio)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 char_u *cmd;
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1835
diff changeset
1164 size_t len;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1165 char_u *tmp_orig = dio->dio_orig.din_fname;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1166 char_u *tmp_new = dio->dio_new.din_fname;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1167 char_u *tmp_diff = dio->dio_diff.dout_fname;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 if (*p_dex != NUL)
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1171 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1172 // Use 'diffexpr' to generate the diff file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 eval_diff(tmp_orig, tmp_new, tmp_diff);
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1174 return OK;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1175 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 #endif
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1178 // Use xdiff for generating the diff.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1179 if (dio->dio_internal)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1180 return diff_file_internal(dio);
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1181
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1182 len = STRLEN(tmp_orig) + STRLEN(tmp_new)
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1183 + STRLEN(tmp_diff) + STRLEN(p_srr) + 27;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1184 cmd = alloc(len);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1185 if (cmd == NULL)
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1186 return FAIL;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1187
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1188 // We don't want $DIFF_OPTIONS to get in the way.
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1189 if (getenv("DIFF_OPTIONS"))
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1190 vim_setenv((char_u *)"DIFF_OPTIONS", (char_u *)"");
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1191
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1192 // Build the diff command and execute it. Always use -a, binary
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1193 // differences are of no use. Ignore errors, diff returns
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1194 // non-zero when differences have been found.
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1195 vim_snprintf((char *)cmd, len, "diff %s%s%s%s%s%s%s%s %s",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1196 diff_a_works == FALSE ? "" : "-a ",
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
1197 #if defined(MSWIN)
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1198 diff_bin_works == TRUE ? "--binary " : "",
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 #else
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1200 "",
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201 #endif
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1202 (diff_flags & DIFF_IWHITE) ? "-b " : "",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1203 (diff_flags & DIFF_IWHITEALL) ? "-w " : "",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1204 (diff_flags & DIFF_IWHITEEOL) ? "-Z " : "",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1205 (diff_flags & DIFF_IBLANK) ? "-B " : "",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1206 (diff_flags & DIFF_ICASE) ? "-i " : "",
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1207 tmp_orig, tmp_new);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1208 append_redir(cmd, (int)len, p_srr, tmp_diff);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1209 block_autocmds(); // avoid ShellCmdPost stuff
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1210 (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1211 unblock_autocmds();
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1212 vim_free(cmd);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1213 return OK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 * Create a new version of a file from the current buffer and a diff file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 * The buffer is written to a file, also for unmodified buffers (the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 * could have been produced by autocommands, e.g. the netrw plugin).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1222 ex_diffpatch(exarg_T *eap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1224 char_u *tmp_orig; // name of original temp file
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1225 char_u *tmp_new; // name of patched temp file
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 char_u *buf = NULL;
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1835
diff changeset
1227 size_t buflen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 win_T *old_curwin = curwin;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1229 char_u *newname = NULL; // name of patched file buffer
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 char_u dirbuf[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 char_u *fullname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 #ifdef FEAT_BROWSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 char_u *browseFile = NULL;
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1236 int save_cmod_flags = cmdmod.cmod_flags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 #endif
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 8368
diff changeset
1238 stat_T st;
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1239 char_u *esc_name = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 #ifdef FEAT_BROWSE
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1242 if (cmdmod.cmod_flags & CMOD_BROWSE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 {
28
726bdc53fa49 updated for version 7.0018
vimboss
parents: 16
diff changeset
1244 browseFile = do_browse(0, (char_u *)_("Patch file"),
13802
378f9f8e6d8f patch 8.0.1773: dialog messages are not translated
Christian Brabandt <cb@256bit.org>
parents: 13384
diff changeset
1245 eap->arg, NULL, NULL,
378f9f8e6d8f patch 8.0.1773: dialog messages are not translated
Christian Brabandt <cb@256bit.org>
parents: 13384
diff changeset
1246 (char_u *)_(BROWSE_FILTER_ALL_FILES), NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 if (browseFile == NULL)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1248 return; // operation cancelled
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 eap->arg = browseFile;
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1250 cmdmod.cmod_flags &= ~CMOD_BROWSE; // don't let do_ecmd() browse again
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1254 // We need two temp file names.
6721
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6314
diff changeset
1255 tmp_orig = vim_tempname('o', FALSE);
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6314
diff changeset
1256 tmp_new = vim_tempname('n', FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 if (tmp_orig == NULL || tmp_new == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1260 // Write the current buffer to "tmp_orig".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 if (buf_write(curbuf, tmp_orig, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 (linenr_T)1, curbuf->b_ml.ml_line_count,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 NULL, FALSE, FALSE, FALSE, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 #ifdef UNIX
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1267 // Get the absolute path of the patchfile, changing directory below.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 fullname = FullName_save(eap->arg, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 #endif
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1270 esc_name = vim_strsave_shellescape(
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 # ifdef UNIX
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1272 fullname != NULL ? fullname :
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 # endif
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1274 eap->arg, TRUE, TRUE);
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1275 if (esc_name == NULL)
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1276 goto theend;
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1277 buflen = STRLEN(tmp_orig) + STRLEN(esc_name) + STRLEN(tmp_new) + 16;
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 15971
diff changeset
1278 buf = alloc(buflen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 #ifdef UNIX
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1283 // Temporarily chdir to /tmp, to avoid patching files in the current
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1284 // directory when the patch file contains more than one patch. When we
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1285 // have our own temp dir use that instead, it will be cleaned up when we
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1286 // exit (any .rej files created). Don't change directory if we can't
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1287 // return to the current.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 if (mch_dirname(dirbuf, MAXPATHL) != OK || mch_chdir((char *)dirbuf) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 dirbuf[0] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 # ifdef TEMPDIRNAMES
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 if (vim_tempdir != NULL)
14730
193471015e1a patch 8.1.0377: xdiff doesn't use the Vim memory allocation functions
Christian Brabandt <cb@256bit.org>
parents: 14726
diff changeset
1294 vim_ignored = mch_chdir((char *)vim_tempdir);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 # endif
14730
193471015e1a patch 8.1.0377: xdiff doesn't use the Vim memory allocation functions
Christian Brabandt <cb@256bit.org>
parents: 14726
diff changeset
1297 vim_ignored = mch_chdir("/tmp");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 shorten_fnames(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 if (*p_pex != NUL)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1304 // Use 'patchexpr' to generate the new file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 eval_patch(tmp_orig,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 fullname != NULL ? fullname :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 eap->arg, tmp_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 {
32218
9c6bc59b6d80 patch 9.0.1440: "rvim" can execute a shell through :diffpatch
Bram Moolenaar <Bram@vim.org>
parents: 32120
diff changeset
1313 if (check_restricted())
9c6bc59b6d80 patch 9.0.1440: "rvim" can execute a shell through :diffpatch
Bram Moolenaar <Bram@vim.org>
parents: 32120
diff changeset
1314 goto theend;
9c6bc59b6d80 patch 9.0.1440: "rvim" can execute a shell through :diffpatch
Bram Moolenaar <Bram@vim.org>
parents: 32120
diff changeset
1315
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1316 // Build the patch command and execute it. Ignore errors. Switch to
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1317 // cooked mode to allow the user to respond to prompts.
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1318 vim_snprintf((char *)buf, buflen, "patch -o %s %s < %s",
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1319 tmp_new, tmp_orig, esc_name);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1320 block_autocmds(); // Avoid ShellCmdPost stuff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 (void)call_shell(buf, SHELL_FILTER | SHELL_COOKED);
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1075
diff changeset
1322 unblock_autocmds();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 if (dirbuf[0] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 if (mch_chdir((char *)dirbuf) != 0)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26829
diff changeset
1329 emsg(_(e_cannot_go_back_to_previous_directory));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 shorten_fnames(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1334 // patch probably has written over the screen
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29566
diff changeset
1335 redraw_later(UPD_CLEAR);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1337 // Delete any .orig or .rej file created.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 STRCPY(buf, tmp_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 STRCAT(buf, ".orig");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 mch_remove(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 STRCPY(buf, tmp_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 STRCAT(buf, ".rej");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 mch_remove(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1345 // Only continue if the output file was created.
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1346 if (mch_stat((char *)tmp_new, &st) < 0 || st.st_size == 0)
26962
85866e069c24 patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
1347 emsg(_(e_cannot_read_patch_output));
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1348 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 {
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1350 if (curbuf->b_fname != NULL)
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1351 {
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1352 newname = vim_strnsave(curbuf->b_fname,
20751
d9a2e5dcfd9f patch 8.2.0928: many type casts are used for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
1353 STRLEN(curbuf->b_fname) + 4);
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1354 if (newname != NULL)
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1355 STRCAT(newname, ".new");
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1356 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 #ifdef FEAT_GUI
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1359 need_mouse_correct = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 #endif
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1361 // don't use a new tab page, each tab page has its own diffs
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1362 cmdmod.cmod_tab = 0;
682
f1b013312711 updated for version 7.0205
vimboss
parents: 681
diff changeset
1363
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1364 if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1365 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1366 // Pretend it was a ":split fname" command
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1367 eap->cmdidx = CMD_split;
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1368 eap->arg = tmp_new;
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1369 do_exedit(eap, old_curwin);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1371 // check that split worked and editing tmp_new
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1372 if (curwin != old_curwin && win_valid(old_curwin))
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1373 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1374 // Set 'diff', 'scrollbind' on and 'wrap' off.
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1375 diff_win_options(curwin, TRUE);
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1376 diff_win_options(old_curwin, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1378 if (newname != NULL)
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1379 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1380 // do a ":file filename.new" on the patched buffer
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1381 eap->arg = newname;
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1382 ex_file(eap);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1384 // Do filetype detection with the new name.
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1385 if (au_has_group((char_u *)"filetypedetect"))
32218
9c6bc59b6d80 patch 9.0.1440: "rvim" can execute a shell through :diffpatch
Bram Moolenaar <Bram@vim.org>
parents: 32120
diff changeset
1386 do_cmdline_cmd(
9c6bc59b6d80 patch 9.0.1440: "rvim" can execute a shell through :diffpatch
Bram Moolenaar <Bram@vim.org>
parents: 32120
diff changeset
1387 (char_u *)":doau filetypedetect BufRead");
1942
fe26299d6f70 updated for version 7.2-239
vimboss
parents: 1876
diff changeset
1388 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 theend:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 if (tmp_orig != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 mch_remove(tmp_orig);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 vim_free(tmp_orig);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 if (tmp_new != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 mch_remove(tmp_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 vim_free(tmp_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 vim_free(newname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 vim_free(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 vim_free(fullname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 #endif
11113
081ed9efb5c0 patch 8.0.0444: diffpatch fails when the file name has a quote
Christian Brabandt <cb@256bit.org>
parents: 11109
diff changeset
1405 vim_free(esc_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 #ifdef FEAT_BROWSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 vim_free(browseFile);
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1408 cmdmod.cmod_flags = save_cmod_flags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 * Split the window and edit another file, setting options to show the diffs.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1416 ex_diffsplit(exarg_T *eap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 win_T *old_curwin = curwin;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
1419 bufref_T old_curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
1421 set_bufref(&old_curbuf, curbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 need_mouse_correct = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 #endif
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1425 // Need to compute w_fraction when no redraw happened yet.
10013
942d40a92be6 commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents: 10005
diff changeset
1426 validate_cursor();
942d40a92be6 commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents: 10005
diff changeset
1427 set_fraction(curwin);
942d40a92be6 commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents: 10005
diff changeset
1428
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1429 // don't use a new tab page, each tab page has its own diffs
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20772
diff changeset
1430 cmdmod.cmod_tab = 0;
682
f1b013312711 updated for version 7.0205
vimboss
parents: 681
diff changeset
1431
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1432 if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) == FAIL)
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1433 return;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1434
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1435 // Pretend it was a ":split fname" command
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1436 eap->cmdidx = CMD_split;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1437 curwin->w_p_diff = TRUE;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1438 do_exedit(eap, old_curwin);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1439
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1440 if (curwin == old_curwin) // split didn't work
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1441 return;
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1442
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1443 // Set 'diff', 'scrollbind' on and 'wrap' off.
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1444 diff_win_options(curwin, TRUE);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1445 if (win_valid(old_curwin))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 {
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1447 diff_win_options(old_curwin, TRUE);
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1448
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1449 if (bufref_valid(&old_curbuf))
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1450 // Move the cursor position to that of the old window.
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1451 curwin->w_cursor.lnum = diff_get_corresponding_line(
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1452 old_curbuf.br_buf, old_curwin->w_cursor.lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 }
31531
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1454 // Now that lines are folded scroll to show the cursor at the same
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1455 // relative position.
6e24001000ed patch 9.0.1098: code uses too much indent
Bram Moolenaar <Bram@vim.org>
parents: 31263
diff changeset
1456 scroll_to_fraction(curwin, curwin->w_height);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 /*
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4236
diff changeset
1460 * Set options to show diffs for the current window.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1463 ex_diffthis(exarg_T *eap UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1465 // Set 'diff', 'scrollbind' on and 'wrap' off.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 diff_win_options(curwin, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468
11707
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1469 static void
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1470 set_diff_option(win_T *wp, int value)
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1471 {
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1472 win_T *old_curwin = curwin;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1473
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1474 curwin = wp;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1475 curbuf = curwin->w_buffer;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1476 ++curbuf_lock;
28457
4dcccb2673fe patch 8.2.4753: error from setting an option is silently ignored
Bram Moolenaar <Bram@vim.org>
parents: 28197
diff changeset
1477 set_option_value_give_err((char_u *)"diff", (long)value, NULL, OPT_LOCAL);
11707
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1478 --curbuf_lock;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1479 curwin = old_curwin;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1480 curbuf = curwin->w_buffer;
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1481 }
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1482
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 * Set options in window "wp" for diff mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1487 diff_win_options(
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1488 win_T *wp,
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1489 int addbuf) // Add buffer to diff.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 {
2086
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1491 # ifdef FEAT_FOLDING
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1492 win_T *old_curwin = curwin;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1493
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1494 // close the manually opened folds
2086
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1495 curwin = wp;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1496 newFoldLevel();
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1497 curwin = old_curwin;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1498 # endif
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1499
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1500 // Use 'scrollbind' and 'cursorbind' when available
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1501 if (!wp->w_p_diff)
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1502 wp->w_p_scb_save = wp->w_p_scb;
2583
7c2e6ba1d702 updated for version 7.3.008
Bram Moolenaar <bram@vim.org>
parents: 2445
diff changeset
1503 wp->w_p_scb = TRUE;
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1504 if (!wp->w_p_diff)
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1505 wp->w_p_crb_save = wp->w_p_crb;
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
1506 wp->w_p_crb = TRUE;
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1507 if (!(diff_flags & DIFF_FOLLOWWRAP))
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1508 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1509 if (!wp->w_p_diff)
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1510 wp->w_p_wrap_save = wp->w_p_wrap;
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1511 wp->w_p_wrap = FALSE;
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1512 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 # ifdef FEAT_FOLDING
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1514 if (!wp->w_p_diff)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1515 {
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1516 if (wp->w_p_diff_saved)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1517 free_string_option(wp->w_p_fdm_save);
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1518 wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1519 }
16806
306766ed0f70 patch 8.1.1405: "highlight" option of popup windows not supported
Bram Moolenaar <Bram@vim.org>
parents: 16768
diff changeset
1520 set_string_option_direct_in_win(wp, (char_u *)"fdm", -1, (char_u *)"diff",
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 682
diff changeset
1521 OPT_LOCAL|OPT_FREE, 0);
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1522 if (!wp->w_p_diff)
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1523 {
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1524 wp->w_p_fdc_save = wp->w_p_fdc;
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1525 wp->w_p_fen_save = wp->w_p_fen;
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1526 wp->w_p_fdl_save = wp->w_p_fdl;
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1527 }
2086
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1528 wp->w_p_fdc = diff_foldcolumn;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1529 wp->w_p_fen = TRUE;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1530 wp->w_p_fdl = 0;
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1531 foldUpdateAll(wp);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1532 // make sure topline is not halfway a fold
2086
c11845a465ae updated for version 7.2.370
Bram Moolenaar <bram@zimbu.org>
parents: 1942
diff changeset
1533 changed_window_setting_win(wp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 if (vim_strchr(p_sbo, 'h') == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 do_cmdline_cmd((char_u *)"set sbo+=hor");
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1537 // Save the current values, to be restored in ex_diffoff().
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1538 wp->w_p_diff_saved = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539
11707
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1540 set_diff_option(wp, TRUE);
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1541
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 if (addbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 diff_buf_add(wp->w_buffer);
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29566
diff changeset
1544 redraw_win_later(wp, UPD_NOT_VALID);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 /*
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1548 * Set options not to show diffs. For the current window or all windows.
671
83a006f81bac updated for version 7.0199
vimboss
parents: 648
diff changeset
1549 * Only in the current tab page.
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1550 */
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1551 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1552 ex_diffoff(exarg_T *eap)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1553 {
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1554 win_T *wp;
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1555 int diffwin = FALSE;
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1556
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1557 FOR_ALL_WINDOWS(wp)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1558 {
5358
b21b5dcdca21 updated for version 7.4.031
Bram Moolenaar <bram@vim.org>
parents: 5200
diff changeset
1559 if (eap->forceit ? wp->w_p_diff : wp == curwin)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1560 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1561 // Set 'diff' off. If option values were saved in
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1562 // diff_win_options(), restore the ones whose settings seem to have
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1563 // been left over from diff mode.
11707
1395a3b6978d patch 8.0.0736: OptionSet not triggered when entering diff mode
Christian Brabandt <cb@256bit.org>
parents: 11430
diff changeset
1564 set_diff_option(wp, FALSE);
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1565
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1566 if (wp->w_p_diff_saved)
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1567 {
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1568
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1569 if (wp->w_p_scb)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1570 wp->w_p_scb = wp->w_p_scb_save;
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1571 if (wp->w_p_crb)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1572 wp->w_p_crb = wp->w_p_crb_save;
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1573 if (!(diff_flags & DIFF_FOLLOWWRAP))
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1574 {
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1575 if (!wp->w_p_wrap)
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1576 wp->w_p_wrap = wp->w_p_wrap_save;
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1577 }
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1578 #ifdef FEAT_FOLDING
5102
11d0c6df1d7b updated for version 7.3.1294
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1579 free_string_option(wp->w_p_fdm);
11430
eba1a8c6e21d patch 8.0.0599: diff mode is insufficiently tested
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
1580 wp->w_p_fdm = vim_strsave(
eba1a8c6e21d patch 8.0.0599: diff mode is insufficiently tested
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
1581 *wp->w_p_fdm_save ? wp->w_p_fdm_save : (char_u*)"manual");
5200
b3ff17862b4c updated for version 7.4a.026
Bram Moolenaar <bram@vim.org>
parents: 5102
diff changeset
1582
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1583 if (wp->w_p_fdc == diff_foldcolumn)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1584 wp->w_p_fdc = wp->w_p_fdc_save;
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1585 if (wp->w_p_fdl == 0)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1586 wp->w_p_fdl = wp->w_p_fdl_save;
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1587
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1588 // Only restore 'foldenable' when 'foldmethod' is not
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1589 // "manual", otherwise we continue to show the diff folds.
6897
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1590 if (wp->w_p_fen)
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1591 wp->w_p_fen = foldmethodIsManual(wp) ? FALSE
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1592 : wp->w_p_fen_save;
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1593
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1594 foldUpdateAll(wp);
d3a23af4bba1 patch 7.4.768
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
1595 #endif
5200
b3ff17862b4c updated for version 7.4a.026
Bram Moolenaar <bram@vim.org>
parents: 5102
diff changeset
1596 }
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1597 // remove filler lines
10005
4b4ba6589a98 commit https://github.com/vim/vim/commit/e67d546f3c691139e6d3d33f36724d98aec04c14
Christian Brabandt <cb@256bit.org>
parents: 9719
diff changeset
1598 wp->w_topfill = 0;
4b4ba6589a98 commit https://github.com/vim/vim/commit/e67d546f3c691139e6d3d33f36724d98aec04c14
Christian Brabandt <cb@256bit.org>
parents: 9719
diff changeset
1599
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1600 // make sure topline is not halfway a fold and cursor is
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1601 // invalidated
10005
4b4ba6589a98 commit https://github.com/vim/vim/commit/e67d546f3c691139e6d3d33f36724d98aec04c14
Christian Brabandt <cb@256bit.org>
parents: 9719
diff changeset
1602 changed_window_setting_win(wp);
5200
b3ff17862b4c updated for version 7.4a.026
Bram Moolenaar <bram@vim.org>
parents: 5102
diff changeset
1603
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1604 // Note: 'sbo' is not restored, it's a global option.
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1605 diff_buf_adjust(wp);
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1606 }
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1607 diffwin |= wp->w_p_diff;
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1608 }
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1609
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1610 // Also remove hidden buffers from the list.
10821
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
1611 if (eap->forceit)
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
1612 diff_buf_clear();
d9e48fb5142f patch 8.0.0300: cannot stop diffing hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 10295
diff changeset
1613
18590
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1614 if (!diffwin)
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1615 {
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1616 diff_need_update = FALSE;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1617 curtab->tp_diff_invalid = FALSE;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1618 curtab->tp_diff_update = FALSE;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1619 diff_clear(curtab);
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1620 }
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
1621
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
1622 // Remove "hor" from 'scrollopt' if there are no diff windows left.
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1623 if (!diffwin && vim_strchr(p_sbo, 'h') != NULL)
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1624 do_cmdline_cmd((char_u *)"set sbo-=hor");
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1625 }
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1626
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
1627 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 * Read the diff output and add each entry to the diff list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 static void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1631 diff_read(
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1632 int idx_orig, // idx of original file
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1633 int idx_new, // idx of new file
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1634 diffio_T *dio) // diff output
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1636 FILE *fd = NULL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1637 int line_idx = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 diff_T *dprev = NULL;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1639 diff_T *dp = curtab->tp_first_diff;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 diff_T *dn, *dpl;
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1641 diffout_T *dout = &dio->dio_diff;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1642 char_u linebuf[LBUFLEN]; // only need to hold the diff line
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1643 char_u *line;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 long off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 int i;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1646 int notset = TRUE; // block "*dp" not set yet
26829
88a33cf5aeb6 patch 8.2.3943: compiler warning from gcc for uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 26805
diff changeset
1647 diffhunk_T *hunk = NULL; // init to avoid gcc warning
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1648
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1649 enum {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1650 DIFF_ED,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1651 DIFF_UNIFIED,
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1652 DIFF_NONE
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1653 } diffstyle = DIFF_NONE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1655 if (dout->dout_fname == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1656 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1657 diffstyle = DIFF_UNIFIED;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1658 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1659 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1661 fd = mch_fopen((char *)dout->dout_fname, "r");
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1662 if (fd == NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1663 {
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
1664 emsg(_(e_cannot_read_diff_output));
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1665 return;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1666 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1669 if (!dio->dio_internal)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1670 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1671 hunk = ALLOC_ONE(diffhunk_T);
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1672 if (hunk == NULL)
28197
e4d25cbc2bd7 patch 8.2.4624: old Coverity warning for resource leak
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
1673 {
e4d25cbc2bd7 patch 8.2.4624: old Coverity warning for resource leak
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
1674 if (fd != NULL)
e4d25cbc2bd7 patch 8.2.4624: old Coverity warning for resource leak
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
1675 fclose(fd);
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1676 return;
28197
e4d25cbc2bd7 patch 8.2.4624: old Coverity warning for resource leak
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
1677 }
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1678 }
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1679
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1682 if (dio->dio_internal)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 {
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31667
diff changeset
1684 if (line_idx >= dout->dout_ga.ga_len)
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1685 break; // did last line
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1686 hunk = ((diffhunk_T **)dout->dout_ga.ga_data)[line_idx++];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1690 if (fd == NULL)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1691 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1692 if (line_idx >= dout->dout_ga.ga_len)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1693 break; // did last line
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1694 line = ((char_u **)dout->dout_ga.ga_data)[line_idx++];
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1695 }
14726
655f00c29c58 patch 8.1.0375: cannot use diff mode with Cygwin diff.exe
Christian Brabandt <cb@256bit.org>
parents: 14716
diff changeset
1696 else
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1697 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1698 if (vim_fgets(linebuf, LBUFLEN, fd))
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1699 break; // end of file
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1700 line = linebuf;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1701 }
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1702
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1703 if (diffstyle == DIFF_NONE)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1704 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1705 // Determine diff style.
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1706 // ed like diff looks like this:
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1707 // {first}[,{last}]c{first}[,{last}]
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1708 // {first}a{first}[,{last}]
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1709 // {first}[,{last}]d{first}
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1710 //
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1711 // unified diff looks like this:
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1712 // --- file1 2018-03-20 13:23:35.783153140 +0100
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1713 // +++ file2 2018-03-20 13:23:41.183156066 +0100
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1714 // @@ -1,3 +1,5 @@
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1715 if (isdigit(*line))
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1716 diffstyle = DIFF_ED;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1717 else if ((STRNCMP(line, "@@ ", 3) == 0))
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1718 diffstyle = DIFF_UNIFIED;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1719 else if ((STRNCMP(line, "--- ", 4) == 0)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1720 && (vim_fgets(linebuf, LBUFLEN, fd) == 0)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1721 && (STRNCMP(line, "+++ ", 4) == 0)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1722 && (vim_fgets(linebuf, LBUFLEN, fd) == 0)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1723 && (STRNCMP(line, "@@ ", 3) == 0))
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1724 diffstyle = DIFF_UNIFIED;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1725 else
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1726 // Format not recognized yet, skip over this line. Cygwin
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1727 // diff may put a warning at the start of the file.
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1728 continue;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1729 }
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1730
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1731 if (diffstyle == DIFF_ED)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1732 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1733 if (!isdigit(*line))
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1734 continue; // not the start of a diff block
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1735 if (parse_diff_ed(line, hunk) == FAIL)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1736 continue;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1737 }
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1738 else if (diffstyle == DIFF_UNIFIED)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1739 {
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1740 if (STRNCMP(line, "@@ ", 3) != 0)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1741 continue; // not the start of a diff block
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1742 if (parse_diff_unified(line, hunk) == FAIL)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1743 continue;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1744 }
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1745 else
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1746 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26962
diff changeset
1747 emsg(_(e_invalid_diff_format));
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1748 break;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1749 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1752 // Go over blocks before the change, for which orig and new are equal.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1753 // Copy blocks from orig to new.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 while (dp != NULL
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1755 && hunk->lnum_orig > dp->df_lnum[idx_orig]
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1756 + dp->df_count[idx_orig])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 if (notset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 diff_copy_entry(dprev, dp, idx_orig, idx_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 dprev = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 notset = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 if (dp != NULL
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1766 && hunk->lnum_orig <= dp->df_lnum[idx_orig]
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1767 + dp->df_count[idx_orig]
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1768 && hunk->lnum_orig + hunk->count_orig >= dp->df_lnum[idx_orig])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1770 // New block overlaps with existing block(s).
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1771 // First find last block that overlaps.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 for (dpl = dp; dpl->df_next != NULL; dpl = dpl->df_next)
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1773 if (hunk->lnum_orig + hunk->count_orig
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1774 < dpl->df_next->df_lnum[idx_orig])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1777 // If the newly found block starts before the old one, set the
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1778 // start back a number of lines.
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1779 off = dp->df_lnum[idx_orig] - hunk->lnum_orig;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 if (off > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 for (i = idx_orig; i < idx_new; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1783 if (curtab->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 dp->df_lnum[i] -= off;
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1785 dp->df_lnum[idx_new] = hunk->lnum_new;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1786 dp->df_count[idx_new] = hunk->count_new;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 else if (notset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1790 // new block inside existing one, adjust new block
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1791 dp->df_lnum[idx_new] = hunk->lnum_new + off;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1792 dp->df_count[idx_new] = hunk->count_new - off;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 else
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1795 // second overlap of new block with existing block
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1796 dp->df_count[idx_new] += hunk->count_new - hunk->count_orig
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
1797 + dpl->df_lnum[idx_orig] + dpl->df_count[idx_orig]
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
1798 - (dp->df_lnum[idx_orig] + dp->df_count[idx_orig]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1800 // Adjust the size of the block to include all the lines to the
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1801 // end of the existing block or the new diff, whatever ends last.
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1802 off = (hunk->lnum_orig + hunk->count_orig)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 - (dpl->df_lnum[idx_orig] + dpl->df_count[idx_orig]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 if (off < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1806 // new change ends in existing block, adjust the end if not
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1807 // done already
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 if (notset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 dp->df_count[idx_new] += -off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 }
1428
912b18745def updated for version 7.1-143
vimboss
parents: 1410
diff changeset
1812 for (i = idx_orig; i < idx_new; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1813 if (curtab->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 dp->df_count[i] = dpl->df_lnum[i] + dpl->df_count[i]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 - dp->df_lnum[i] + off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1817 // Delete the diff blocks that have been merged into one.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 dn = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 dp->df_next = dpl->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 while (dn != dp->df_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 dpl = dn->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 vim_free(dn);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 dn = dpl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 {
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1829 // Allocate a new diffblock.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1830 dp = diff_alloc_new(curtab, dprev, dp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 if (dp == NULL)
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
1832 goto done;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1834 dp->df_lnum[idx_orig] = hunk->lnum_orig;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1835 dp->df_count[idx_orig] = hunk->count_orig;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1836 dp->df_lnum[idx_new] = hunk->lnum_new;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1837 dp->df_count[idx_new] = hunk->count_new;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1839 // Set values for other buffers, these must be equal to the
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1840 // original buffer, otherwise there would have been a change
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1841 // already.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 for (i = idx_orig + 1; i < idx_new; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1843 if (curtab->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 diff_copy_entry(dprev, dp, idx_orig, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1846 notset = FALSE; // "*dp" has been set
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1849 // for remaining diff blocks orig and new are equal
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 while (dp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 if (notset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 diff_copy_entry(dprev, dp, idx_orig, idx_new);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 dprev = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 notset = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
1859 done:
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1860 if (!dio->dio_internal)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1861 vim_free(hunk);
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1862
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1863 if (fd != NULL)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
1864 fclose(fd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 * Copy an entry at "dp" from "idx_orig" to "idx_new".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 static void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1871 diff_copy_entry(
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1872 diff_T *dprev,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1873 diff_T *dp,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1874 int idx_orig,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1875 int idx_new)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 long off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 if (dprev == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 off = (dprev->df_lnum[idx_orig] + dprev->df_count[idx_orig])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 - (dprev->df_lnum[idx_new] + dprev->df_count[idx_new]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 dp->df_lnum[idx_new] = dp->df_lnum[idx_orig] - off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 dp->df_count[idx_new] = dp->df_count[idx_orig];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 /*
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1889 * Clear the list of diffblocks for tab page "tp".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 */
358
e111db373ca4 updated for version 7.0093
vimboss
parents: 193
diff changeset
1891 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1892 diff_clear(tabpage_T *tp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 diff_T *p, *next_p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1896 for (p = tp->tp_first_diff; p != NULL; p = next_p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 next_p = p->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 }
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1901 tp->tp_first_diff = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 * Check diff status for line "lnum" in buffer "buf":
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 * Returns 0 for nothing special
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 * Returns -1 for a line that should be highlighted as changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 * Returns -2 for a line that should be highlighted as added/deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 * Returns > 0 for inserting that many filler lines above it (never happens
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 * when 'diffopt' doesn't contain "filler").
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 * This should only be used for windows where 'diff' is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
1914 diff_check(win_T *wp, linenr_T lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1916 int idx; // index in tp_diffbuf[] for this buffer
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 int maxcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 buf_T *buf = wp->w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 int cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1923 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1924 ex_diffupdate(NULL); // update after a big change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1925
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1926 if (curtab->tp_first_diff == NULL || !wp->w_p_diff) // no diffs at all
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1929 // safety check: "lnum" must be a buffer line
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 if (lnum < 1 || lnum > buf->b_ml.ml_line_count + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 idx = diff_buf_idx(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 if (idx == DB_COUNT)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1935 return 0; // no diffs for buffer "buf"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937 #ifdef FEAT_FOLDING
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1938 // A closed fold never has filler lines.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 if (hasFoldingWin(wp, lnum, NULL, NULL, TRUE, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1943 // search for a change that includes "lnum" in the list of diffblocks.
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
1944 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 if (dp == NULL || lnum < dp->df_lnum[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 if (lnum < dp->df_lnum[idx] + dp->df_count[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 int zero = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1954 // Changed or inserted line. If the other buffers have a count of
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1955 // zero, the lines were inserted. If the other buffers have the same
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1956 // count, check if the lines are identical.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 cmp = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1959 if (i != idx && curtab->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 if (dp->df_count[i] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 zero = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 if (dp->df_count[i] != dp->df_count[idx])
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1966 return -1; // nr of lines changed.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 cmp = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 if (cmp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1972 // Compare all lines. If they are equal the lines were inserted
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1973 // in some buffers, deleted in others, but not changed.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 for (i = 0; i < DB_COUNT; ++i)
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
1975 if (i != idx && curtab->tp_diffbuf[i] != NULL
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
1976 && dp->df_count[i] != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 if (!diff_equal_entry(dp, idx, i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 }
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1980 // If there is no buffer with zero lines then there is no difference
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1981 // any longer. Happens when making a change (or undo) that removes
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1982 // the difference. Can't remove the entry here, we might be halfway
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1983 // updating the window. Just report the text as unchanged. Other
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1984 // windows might still show the change though.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 if (zero == FALSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1990 // If 'diffopt' doesn't contain "filler", return 0.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 if (!(diff_flags & DIFF_FILLER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1994 // Insert filler lines above the line just below the change. Will return
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
1995 // 0 when this buf had the max count.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 maxcount = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
1998 if (curtab->tp_diffbuf[i] != NULL && dp->df_count[i] > maxcount)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 maxcount = dp->df_count[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 return maxcount - dp->df_count[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 * Compare two entries in diff "*dp" and return TRUE if they are equal.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 static int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2007 diff_equal_entry(diff_T *dp, int idx1, int idx2)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 int cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 if (dp->df_count[idx1] != dp->df_count[idx2])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 return FALSE;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2015 if (diff_check_sanity(curtab, dp) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 for (i = 0; i < dp->df_count[idx1]; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2019 line = vim_strsave(ml_get_buf(curtab->tp_diffbuf[idx1],
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 dp->df_lnum[idx1] + i, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 if (line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 return FALSE;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2023 cmp = diff_cmp(line, ml_get_buf(curtab->tp_diffbuf[idx2],
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 dp->df_lnum[idx2] + i, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 vim_free(line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 if (cmp != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 /*
12333
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2033 * Compare the characters at "p1" and "p2". If they are equal (possibly
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2034 * ignoring case) return TRUE and set "len" to the number of bytes.
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2035 */
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2036 static int
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2037 diff_equal_char(char_u *p1, char_u *p2, int *len)
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2038 {
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2039 int l = (*mb_ptr2len)(p1);
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2040
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2041 if (l != (*mb_ptr2len)(p2))
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2042 return FALSE;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2043 if (l > 1)
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2044 {
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2045 if (STRNCMP(p1, p2, l) != 0
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2046 && (!enc_utf8
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2047 || !(diff_flags & DIFF_ICASE)
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2048 || utf_fold(utf_ptr2char(p1))
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2049 != utf_fold(utf_ptr2char(p2))))
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2050 return FALSE;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2051 *len = l;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2052 }
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2053 else
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2054 {
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2055 if ((*p1 != *p2)
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2056 && (!(diff_flags & DIFF_ICASE)
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2057 || TOLOWER_LOC(*p1) != TOLOWER_LOC(*p2)))
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2058 return FALSE;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2059 *len = 1;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2060 }
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2061 return TRUE;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2062 }
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2063
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2064 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 * Compare strings "s1" and "s2" according to 'diffopt'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 * Return non-zero when they are different.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 static int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2069 diff_cmp(char_u *s1, char_u *s2)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 char_u *p1, *p2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2074 if ((diff_flags & DIFF_IBLANK)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2075 && (*skipwhite(s1) == NUL || *skipwhite(s2) == NUL))
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2076 return 0;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2077
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2078 if ((diff_flags & (DIFF_ICASE | ALL_WHITE_DIFF)) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 return STRCMP(s1, s2);
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2080 if ((diff_flags & DIFF_ICASE) && !(diff_flags & ALL_WHITE_DIFF))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 return MB_STRICMP(s1, s2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 p1 = s1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 p2 = s2;
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2085
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2086 // Ignore white space changes and possibly ignore case.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 while (*p1 != NUL && *p2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 {
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2089 if (((diff_flags & DIFF_IWHITE)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2090 && VIM_ISWHITE(*p1) && VIM_ISWHITE(*p2))
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2091 || ((diff_flags & DIFF_IWHITEALL)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2092 && (VIM_ISWHITE(*p1) || VIM_ISWHITE(*p2))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094 p1 = skipwhite(p1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 p2 = skipwhite(p2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 {
12333
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2099 if (!diff_equal_char(p1, p2, &l))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 break;
12333
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2101 p1 += l;
dea5dda9ef30 patch 8.0.1046: code duplication in diff mode
Christian Brabandt <cb@256bit.org>
parents: 12315
diff changeset
2102 p2 += l;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2106 // Ignore trailing white space.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 p1 = skipwhite(p1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 p2 = skipwhite(p2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 if (*p1 != NUL || *p2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 * Return the number of filler lines above "lnum".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2118 diff_check_fill(win_T *wp, linenr_T lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2122 // be quick when there are no filler lines
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 if (!(diff_flags & DIFF_FILLER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 n = diff_check(wp, lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 if (n <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 return n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 * Set the topline of "towin" to match the position in "fromwin", so that they
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 * show the same diff'ed lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2136 diff_set_topline(win_T *fromwin, win_T *towin)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 {
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2138 buf_T *frombuf = fromwin->w_buffer;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 linenr_T lnum = fromwin->w_topline;
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2140 int fromidx;
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2141 int toidx;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 diff_T *dp;
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2143 int max_count;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2146 fromidx = diff_buf_idx(frombuf);
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2147 if (fromidx == DB_COUNT)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2148 return; // safety check
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2150 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2151 ex_diffupdate(NULL); // update after a big change
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 towin->w_topfill = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2155 // search for a change that includes "lnum" in the list of diffblocks.
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
2156 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2157 if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 if (dp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2161 // After last change, compute topline relative to end of file; no
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2162 // filler lines.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 towin->w_topline = towin->w_buffer->b_ml.ml_line_count
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2164 - (frombuf->b_ml.ml_line_count - lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2168 // Find index for "towin".
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2169 toidx = diff_buf_idx(towin->w_buffer);
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2170 if (toidx == DB_COUNT)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2171 return; // safety check
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2173 towin->w_topline = lnum + (dp->df_lnum[toidx] - dp->df_lnum[fromidx]);
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2174 if (lnum >= dp->df_lnum[fromidx])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2176 // Inside a change: compute filler lines. With three or more
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2177 // buffers we need to know the largest count.
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2178 max_count = 0;
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2179 for (i = 0; i < DB_COUNT; ++i)
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2180 if (curtab->tp_diffbuf[i] != NULL
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2181 && max_count < dp->df_count[i])
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2182 max_count = dp->df_count[i];
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2183
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2184 if (dp->df_count[toidx] == dp->df_count[fromidx])
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2185 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2186 // same number of lines: use same filler count
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 towin->w_topfill = fromwin->w_topfill;
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2188 }
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2189 else if (dp->df_count[toidx] > dp->df_count[fromidx])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 {
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2191 if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2192 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2193 // more lines in towin and fromwin doesn't show diff
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2194 // lines, only filler lines
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2195 if (max_count - fromwin->w_topfill >= dp->df_count[toidx])
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2196 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2197 // towin also only shows filler lines
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2198 towin->w_topline = dp->df_lnum[toidx]
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2199 + dp->df_count[toidx];
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2200 towin->w_topfill = fromwin->w_topfill;
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2201 }
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2202 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2203 // towin still has some diff lines to show
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2204 towin->w_topline = dp->df_lnum[toidx]
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2205 + max_count - fromwin->w_topfill;
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2206 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 }
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2208 else if (towin->w_topline >= dp->df_lnum[toidx]
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2209 + dp->df_count[toidx])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2211 // less lines in towin and no diff lines to show: compute
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2212 // filler lines
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2213 towin->w_topline = dp->df_lnum[toidx] + dp->df_count[toidx];
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2214 if (diff_flags & DIFF_FILLER)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 {
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2216 if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2217 // fromwin is also out of diff lines
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2218 towin->w_topfill = fromwin->w_topfill;
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2219 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2220 // fromwin has some diff lines
1519
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2221 towin->w_topfill = dp->df_lnum[fromidx]
17c88d44ace9 updated for version 7.1-234
vimboss
parents: 1429
diff changeset
2222 + max_count - lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2228 // safety check (if diff info gets outdated strange things may happen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 towin->w_botfill = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 if (towin->w_topline > towin->w_buffer->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 towin->w_topline = towin->w_buffer->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 towin->w_botfill = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 if (towin->w_topline < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 towin->w_topline = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 towin->w_topfill = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2241 // When w_topline changes need to recompute w_botline and cursor position
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 invalidate_botline_win(towin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 changed_line_abv_curs_win(towin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 check_topfill(towin, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 (void)hasFoldingWin(towin, towin->w_topline, &towin->w_topline,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 NULL, TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 * This is called when 'diffopt' is changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2256 diffopt_changed(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 int diff_context_new = 6;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 int diff_flags_new = 0;
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2261 int diff_foldcolumn_new = 2;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2262 long diff_algorithm_new = 0;
15103
9339601e7a31 patch 8.1.0562: parsing of 'diffopt' is slightly wrong
Bram Moolenaar <Bram@vim.org>
parents: 15004
diff changeset
2263 long diff_indent_heuristic = 0;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2264 tabpage_T *tp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 p = p_dip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 while (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 {
33399
95db67c7b754 patch 9.0.1958: cannot complete option values
Christian Brabandt <cb@256bit.org>
parents: 32218
diff changeset
2269 // Note: Keep this in sync with p_dip_values
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 if (STRNCMP(p, "filler", 6) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 p += 6;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 diff_flags_new |= DIFF_FILLER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 else if (STRNCMP(p, "context:", 8) == 0 && VIM_ISDIGIT(p[8]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 p += 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 diff_context_new = getdigits(&p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 }
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2280 else if (STRNCMP(p, "iblank", 6) == 0)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2281 {
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2282 p += 6;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2283 diff_flags_new |= DIFF_IBLANK;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2284 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 else if (STRNCMP(p, "icase", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 p += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 diff_flags_new |= DIFF_ICASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 }
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2290 else if (STRNCMP(p, "iwhiteall", 9) == 0)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2291 {
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2292 p += 9;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2293 diff_flags_new |= DIFF_IWHITEALL;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2294 }
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2295 else if (STRNCMP(p, "iwhiteeol", 9) == 0)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2296 {
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2297 p += 9;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2298 diff_flags_new |= DIFF_IWHITEEOL;
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2299 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 else if (STRNCMP(p, "iwhite", 6) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 p += 6;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303 diff_flags_new |= DIFF_IWHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 }
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2305 else if (STRNCMP(p, "horizontal", 10) == 0)
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2306 {
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2307 p += 10;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2308 diff_flags_new |= DIFF_HORIZONTAL;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2309 }
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2310 else if (STRNCMP(p, "vertical", 8) == 0)
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2311 {
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2312 p += 8;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2313 diff_flags_new |= DIFF_VERTICAL;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2314 }
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2315 else if (STRNCMP(p, "foldcolumn:", 11) == 0 && VIM_ISDIGIT(p[11]))
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2316 {
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2317 p += 11;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2318 diff_foldcolumn_new = getdigits(&p);
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2319 }
12971
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2320 else if (STRNCMP(p, "hiddenoff", 9) == 0)
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2321 {
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2322 p += 9;
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2323 diff_flags_new |= DIFF_HIDDEN_OFF;
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2324 }
18590
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2325 else if (STRNCMP(p, "closeoff", 8) == 0)
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2326 {
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2327 p += 8;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2328 diff_flags_new |= DIFF_CLOSE_OFF;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2329 }
23895
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
2330 else if (STRNCMP(p, "followwrap", 10) == 0)
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
2331 {
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
2332 p += 10;
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
2333 diff_flags_new |= DIFF_FOLLOWWRAP;
e313b6ee2d9c patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
2334 }
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2335 else if (STRNCMP(p, "indent-heuristic", 16) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2336 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2337 p += 16;
15103
9339601e7a31 patch 8.1.0562: parsing of 'diffopt' is slightly wrong
Bram Moolenaar <Bram@vim.org>
parents: 15004
diff changeset
2338 diff_indent_heuristic = XDF_INDENT_HEURISTIC;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2339 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2340 else if (STRNCMP(p, "internal", 8) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2341 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2342 p += 8;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2343 diff_flags_new |= DIFF_INTERNAL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2344 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2345 else if (STRNCMP(p, "algorithm:", 10) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2346 {
33399
95db67c7b754 patch 9.0.1958: cannot complete option values
Christian Brabandt <cb@256bit.org>
parents: 32218
diff changeset
2347 // Note: Keep this in sync with p_dip_algorithm_values.
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2348 p += 10;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2349 if (STRNCMP(p, "myers", 5) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2350 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2351 p += 5;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2352 diff_algorithm_new = 0;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2353 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2354 else if (STRNCMP(p, "minimal", 7) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2355 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2356 p += 7;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2357 diff_algorithm_new = XDF_NEED_MINIMAL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2358 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2359 else if (STRNCMP(p, "patience", 8) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2360 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2361 p += 8;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2362 diff_algorithm_new = XDF_PATIENCE_DIFF;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2363 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2364 else if (STRNCMP(p, "histogram", 9) == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2365 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2366 p += 9;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2367 diff_algorithm_new = XDF_HISTOGRAM_DIFF;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2368 }
15004
9c2352253376 patch 8.1.0513: no error for set diffopt+=algorithm:
Bram Moolenaar <Bram@vim.org>
parents: 14982
diff changeset
2369 else
9c2352253376 patch 8.1.0513: no error for set diffopt+=algorithm:
Bram Moolenaar <Bram@vim.org>
parents: 14982
diff changeset
2370 return FAIL;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2371 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2372
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 if (*p != ',' && *p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 if (*p == ',')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378
15103
9339601e7a31 patch 8.1.0562: parsing of 'diffopt' is slightly wrong
Bram Moolenaar <Bram@vim.org>
parents: 15004
diff changeset
2379 diff_algorithm_new |= diff_indent_heuristic;
9339601e7a31 patch 8.1.0562: parsing of 'diffopt' is slightly wrong
Bram Moolenaar <Bram@vim.org>
parents: 15004
diff changeset
2380
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2381 // Can't have both "horizontal" and "vertical".
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2382 if ((diff_flags_new & DIFF_HORIZONTAL) && (diff_flags_new & DIFF_VERTICAL))
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2383 return FAIL;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2384
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2385 // If flags were added or removed, or the algorithm was changed, need to
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2386 // update the diff.
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2387 if (diff_flags != diff_flags_new || diff_algorithm != diff_algorithm_new)
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2388 FOR_ALL_TABPAGES(tp)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2389 tp->tp_diff_invalid = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 diff_flags = diff_flags_new;
15900
360c93a884d0 patch 8.1.0956: using context:0 in 'diffopt' does not work well
Bram Moolenaar <Bram@vim.org>
parents: 15840
diff changeset
2392 diff_context = diff_context_new == 0 ? 1 : diff_context_new;
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2393 diff_foldcolumn = diff_foldcolumn_new;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
2394 diff_algorithm = diff_algorithm_new;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 diff_redraw(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2398 // recompute the scroll binding with the new option value, may
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2399 // remove or add filler lines
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 check_scrollbind((linenr_T)0, 0L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 /*
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2406 * Return TRUE if 'diffopt' contains "horizontal".
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2407 */
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2408 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2409 diffopt_horizontal(void)
764
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2410 {
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2411 return (diff_flags & DIFF_HORIZONTAL) != 0;
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2412 }
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2413
986753bbc441 updated for version 7.0225
vimboss
parents: 738
diff changeset
2414 /*
12971
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2415 * Return TRUE if 'diffopt' contains "hiddenoff".
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2416 */
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2417 int
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2418 diffopt_hiddenoff(void)
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2419 {
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2420 return (diff_flags & DIFF_HIDDEN_OFF) != 0;
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2421 }
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2422
ca3cb1997f08 patch 8.0.1361: some users don't want to diff with hidden buffers
Christian Brabandt <cb@256bit.org>
parents: 12353
diff changeset
2423 /*
18590
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2424 * Return TRUE if 'diffopt' contains "closeoff".
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2425 */
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2426 int
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2427 diffopt_closeoff(void)
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2428 {
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2429 return (diff_flags & DIFF_CLOSE_OFF) != 0;
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2430 }
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2431
41484f342f80 patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents: 18498
diff changeset
2432 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 * Find the difference within a changed line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 * Returns TRUE if the line was added, no other buffer has it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2437 diff_find_change(
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2438 win_T *wp,
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2439 linenr_T lnum,
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2440 int *startp, // first char of the change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2441 int *endp) // last char of the change
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 char_u *line_org;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 char_u *line_new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 int i;
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2446 int si_org, si_new;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2447 int ei_org, ei_new;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 int off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 int added = TRUE;
12315
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2452 char_u *p1, *p2;
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2453 int l;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2455 // Make a copy of the line, the next ml_get() will invalidate it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 if (line_org == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 idx = diff_buf_idx(wp->w_buffer);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2461 if (idx == DB_COUNT) // cannot happen
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2462 {
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2463 vim_free(line_org);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 return FALSE;
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2465 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2467 // search for a change that includes "lnum" in the list of diffblocks.
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
2468 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 break;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2471 if (dp == NULL || diff_check_sanity(curtab, dp) == FAIL)
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2472 {
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2473 vim_free(line_org);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 return FALSE;
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 840
diff changeset
2475 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 off = lnum - dp->df_lnum[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2480 if (curtab->tp_diffbuf[i] != NULL && i != idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2482 // Skip lines that are not in the other change (filler lines).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 if (off >= dp->df_count[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 added = FALSE;
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2486 line_new = ml_get_buf(curtab->tp_diffbuf[i],
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2487 dp->df_lnum[i] + off, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2489 // Search for start of difference
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2490 si_org = si_new = 0;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2491 while (line_org[si_org] != NUL)
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2492 {
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2493 if (((diff_flags & DIFF_IWHITE)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2494 && VIM_ISWHITE(line_org[si_org])
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2495 && VIM_ISWHITE(line_new[si_new]))
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2496 || ((diff_flags & DIFF_IWHITEALL)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2497 && (VIM_ISWHITE(line_org[si_org])
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2498 || VIM_ISWHITE(line_new[si_new]))))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2499 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
2500 si_org = (int)(skipwhite(line_org + si_org) - line_org);
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
2501 si_new = (int)(skipwhite(line_new + si_new) - line_new);
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2502 }
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2503 else
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2504 {
12315
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2505 if (!diff_equal_char(line_org + si_org, line_new + si_new,
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2506 &l))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2507 break;
12315
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2508 si_org += l;
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2509 si_new += l;
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2510 }
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2511 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2514 // Move back to first byte of character in both lines (may
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2515 // have "nn^" in line_org and "n^ in line_new).
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2516 si_org -= (*mb_head_off)(line_org, line_org + si_org);
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2517 si_new -= (*mb_head_off)(line_new, line_new + si_new);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 }
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2519 if (*startp > si_org)
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2520 *startp = si_org;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2522 // Search for end of difference, if any.
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2523 if (line_org[si_org] != NUL || line_new[si_new] != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 ei_org = (int)STRLEN(line_org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 ei_new = (int)STRLEN(line_new);
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2527 while (ei_org >= *startp && ei_new >= si_new
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2528 && ei_org >= 0 && ei_new >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 {
14762
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2530 if (((diff_flags & DIFF_IWHITE)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2531 && VIM_ISWHITE(line_org[ei_org])
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2532 && VIM_ISWHITE(line_new[ei_new]))
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2533 || ((diff_flags & DIFF_IWHITEALL)
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2534 && (VIM_ISWHITE(line_org[ei_org])
b43ea03bb522 patch 8.1.0393: not all white space difference options available
Christian Brabandt <cb@256bit.org>
parents: 14730
diff changeset
2535 || VIM_ISWHITE(line_new[ei_new]))))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2536 {
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2537 while (ei_org >= *startp
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11121
diff changeset
2538 && VIM_ISWHITE(line_org[ei_org]))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2539 --ei_org;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2540 while (ei_new >= si_new
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11121
diff changeset
2541 && VIM_ISWHITE(line_new[ei_new]))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2542 --ei_new;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2543 }
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2544 else
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2545 {
12315
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2546 p1 = line_org + ei_org;
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2547 p2 = line_new + ei_new;
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2548 p1 -= (*mb_head_off)(line_org, p1);
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2549 p2 -= (*mb_head_off)(line_new, p2);
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2550 if (!diff_equal_char(p1, p2, &l))
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2551 break;
12315
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2552 ei_org -= l;
40ee9f3d265f patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Christian Brabandt <cb@256bit.org>
parents: 11707
diff changeset
2553 ei_new -= l;
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2554 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 if (*endp < ei_org)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 *endp = ei_org;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 vim_free(line_org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 return added;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 #if defined(FEAT_FOLDING) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 * Return TRUE if line "lnum" is not close to a diff block, this line should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 * be in a fold.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 * Return FALSE if there are no diff blocks at all in this window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2572 diff_infold(win_T *wp, linenr_T lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 int idx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576 int other = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2579 // Return if 'diff' isn't set.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 if (!wp->w_p_diff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 for (i = 0; i < DB_COUNT; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2585 if (curtab->tp_diffbuf[i] == wp->w_buffer)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 idx = i;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2587 else if (curtab->tp_diffbuf[i] != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 other = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2591 // return here if there are no diffs in the window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 if (idx == -1 || !other)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2595 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2596 ex_diffupdate(NULL); // update after a big change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2597
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2598 // Return if there are no diff blocks. All lines will be folded.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2599 if (curtab->tp_first_diff == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
2602 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2604 // If this change is below the line there can't be any further match.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 if (dp->df_lnum[idx] - diff_context > lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 break;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2607 // If this change ends before the line we have a match.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 if (dp->df_lnum[idx] + dp->df_count[idx] + diff_context > lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 * "dp" and "do" commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2619 nv_diffgetput(int put, long count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 exarg_T ea;
6314
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2622 char_u buf[30];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623
14019
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2624 #ifdef FEAT_JOB_CHANNEL
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2625 if (bt_prompt(curbuf))
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2626 {
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2627 vim_beep(BO_OPER);
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2628 return;
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2629 }
dc67449d648c patch 8.1.0027: difficult to make a plugin that feeds a line to a job
Christian Brabandt <cb@256bit.org>
parents: 13802
diff changeset
2630 #endif
6314
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2631 if (count == 0)
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2632 ea.arg = (char_u *)"";
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2633 else
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2634 {
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2635 vim_snprintf((char *)buf, 30, "%ld", count);
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2636 ea.arg = buf;
df92c2b2a179 updated for version 7.4.490
Bram Moolenaar <bram@vim.org>
parents: 6286
diff changeset
2637 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 if (put)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 ea.cmdidx = CMD_diffput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 ea.cmdidx = CMD_diffget;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 ea.addr_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 ea.line1 = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 ea.line2 = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 ex_diffgetput(&ea);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 /*
29367
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2649 * Return TRUE if "diff" appears in the list of diff blocks of the current tab.
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2650 */
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2651 static int
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2652 valid_diff(diff_T *diff)
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2653 {
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2654 diff_T *dp;
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2655
32118
04d9dff67d99 patch 9.0.1390: FOR_ALL_ macros are defined in an unexpected file
Bram Moolenaar <Bram@vim.org>
parents: 31804
diff changeset
2656 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
29367
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2657 if (dp == diff)
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2658 return TRUE;
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2659 return FALSE;
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2660 }
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2661
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2662 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 * ":diffget"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 * ":diffput"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
2667 ex_diffgetput(exarg_T *eap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 linenr_T off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 diff_T *dprev;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 diff_T *dfree;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 int idx_cur;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 int idx_other;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 int idx_from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 int idx_to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 int added;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 int start_skip, end_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 int new_count;
648
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2686 int buf_empty;
1075
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2687 int found_not_ma = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2689 // Find the current buffer in the list of diff buffers.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 idx_cur = diff_buf_idx(curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 if (idx_cur == DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 {
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
2693 emsg(_(e_current_buffer_is_not_in_diff_mode));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 if (*eap->arg == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2699 // No argument: Find the other buffer in the list of diff buffers.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 for (idx_other = 0; idx_other < DB_COUNT; ++idx_other)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2701 if (curtab->tp_diffbuf[idx_other] != curbuf
1075
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2702 && curtab->tp_diffbuf[idx_other] != NULL)
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2703 {
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2704 if (eap->cmdidx != CMD_diffput
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2705 || curtab->tp_diffbuf[idx_other]->b_p_ma)
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2706 break;
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2707 found_not_ma = TRUE;
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2708 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 if (idx_other == DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 {
1075
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2711 if (found_not_ma)
26958
d92e0d85923f patch 8.2.4008: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
2712 emsg(_(e_no_other_buffer_in_diff_mode_is_modifiable));
1075
21ce954cbdca updated for version 7.0-201
vimboss
parents: 1074
diff changeset
2713 else
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
2714 emsg(_(e_no_other_buffer_in_diff_mode));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2718 // Check that there isn't a third buffer in the list
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 for (i = idx_other + 1; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2720 if (curtab->tp_diffbuf[i] != curbuf
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2721 && curtab->tp_diffbuf[i] != NULL
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2722 && (eap->cmdidx != CMD_diffput || curtab->tp_diffbuf[i]->b_p_ma))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 {
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
2724 emsg(_(e_more_than_two_buffers_in_diff_mode_dont_know_which_one_to_use));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2730 // Buffer number or pattern given. Ignore trailing white space.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 p = eap->arg + STRLEN(eap->arg);
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11121
diff changeset
2732 while (p > eap->arg && VIM_ISWHITE(p[-1]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 for (i = 0; vim_isdigit(eap->arg[i]) && eap->arg + i < p; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 ;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2736 if (eap->arg + i == p) // digits only
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2737 i = atol((char *)eap->arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2739 {
4236
23ce9a61bdc2 updated for version 7.3.869
Bram Moolenaar <bram@vim.org>
parents: 3904
diff changeset
2740 i = buflist_findpat(eap->arg, p, FALSE, TRUE, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 if (i < 0)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2742 return; // error message already given
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 buf = buflist_findnr(i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 {
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
2747 semsg(_(e_cant_find_buffer_str), eap->arg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 }
1788
61d080cb268e updated for version 7.2-086
vimboss
parents: 1761
diff changeset
2750 if (buf == curbuf)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2751 return; // nothing to do
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 idx_other = diff_buf_idx(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 if (idx_other == DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 {
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26044
diff changeset
2755 semsg(_(e_buffer_str_is_not_in_diff_mode), eap->arg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 diff_busy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2762 // When no range given include the line above or below the cursor.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 if (eap->addr_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2765 // Make it possible that ":diffget" on the last line gets line below
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2766 // the cursor line when there is no difference above the cursor.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 if (eap->cmdidx == CMD_diffget
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 && eap->line1 == curbuf->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 && diff_check(curwin, eap->line1) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 && (eap->line1 == 1 || diff_check(curwin, eap->line1 - 1) == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 ++eap->line2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 else if (eap->line1 > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 --eap->line1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 if (eap->cmdidx == CMD_diffget)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 idx_from = idx_other;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 idx_to = idx_cur;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 idx_from = idx_cur;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 idx_to = idx_other;
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2785 // Need to make the other buffer the current buffer to be able to make
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2786 // changes in it.
31263
d8e7d725a666 patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2787 // Set curwin/curbuf to buf and save a few things.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2788 aucmd_prepbuf(&aco, curtab->tp_diffbuf[idx_other]);
31263
d8e7d725a666 patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2789 if (curbuf != curtab->tp_diffbuf[idx_other])
d8e7d725a666 patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2790 // Could not find a window for this buffer, the rest is likely to
d8e7d725a666 patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2791 // fail.
d8e7d725a666 patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2792 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2795 // May give the warning for a changed buffer here, which can trigger the
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2796 // FileChangedRO autocommand, which may do nasty things and mess
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2797 // everything up.
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2798 if (!curbuf->b_changed)
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2799 {
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2800 change_warning(0);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2801 if (diff_buf_idx(curbuf) != idx_to)
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2802 {
26958
d92e0d85923f patch 8.2.4008: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
2803 emsg(_(e_buffer_changed_unexpectedly));
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
2804 goto theend;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2805 }
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2806 }
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2807
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 dprev = NULL;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2809 for (dp = curtab->tp_first_diff; dp != NULL; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 if (dp->df_lnum[idx_cur] > eap->line2 + off)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2812 break; // past the range that was specified
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 dfree = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 lnum = dp->df_lnum[idx_to];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 count = dp->df_count[idx_to];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 if (dp->df_lnum[idx_cur] + dp->df_count[idx_cur] > eap->line1 + off
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 && u_save(lnum - 1, lnum + count) != FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2820 // Inside the specified range and saving for undo worked.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 start_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 end_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 if (eap->addr_count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2825 // A range was specified: check if lines need to be skipped.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826 start_skip = eap->line1 + off - dp->df_lnum[idx_cur];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 if (start_skip > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2829 // range starts below start of current diff block
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830 if (start_skip > count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832 lnum += count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 count -= start_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 lnum += start_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 start_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 end_skip = dp->df_lnum[idx_cur] + dp->df_count[idx_cur] - 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 - (eap->line2 + off);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 if (end_skip > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2848 // range ends above end of current/from diff block
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2849 if (idx_cur == idx_from) // :diffput
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 i = dp->df_count[idx_cur] - start_skip - end_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 if (count > i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 count = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 }
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2855 else // :diffget
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2856 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 count -= end_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 end_skip = dp->df_count[idx_from] - start_skip - count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 if (end_skip < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 end_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 end_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866
11121
778c10516955 patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11113
diff changeset
2867 buf_empty = BUFEMPTY();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868 added = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 for (i = 0; i < count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2871 // remember deleting the last line of the buffer
648
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2872 buf_empty = curbuf->b_ml.ml_line_count == 1;
29519
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
2873 if (ml_delete(lnum) == OK)
3afe997f4415 patch 9.0.0101: invalid memory access in diff mode with "dp" and undo
Bram Moolenaar <Bram@vim.org>
parents: 29367
diff changeset
2874 --added;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 for (i = 0; i < dp->df_count[idx_from] - start_skip - end_skip; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 linenr_T nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 nr = dp->df_lnum[idx_from] + start_skip + i;
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2881 if (nr > curtab->tp_diffbuf[idx_from]->b_ml.ml_line_count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 break;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2883 p = vim_strsave(ml_get_buf(curtab->tp_diffbuf[idx_from],
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2884 nr, FALSE));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 ml_append(lnum + i - 1, p, 0, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 ++added;
648
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2890 if (buf_empty && curbuf->b_ml.ml_line_count == 2)
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2891 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2892 // Added the first line into an empty buffer, need to
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2893 // delete the dummy empty line.
648
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2894 buf_empty = FALSE;
20599
d571231175b4 patch 8.2.0853: ml_delete() often called with FALSE argument
Bram Moolenaar <Bram@vim.org>
parents: 20007
diff changeset
2895 ml_delete((linenr_T)2);
648
9032e4668296 updated for version 7.0189
vimboss
parents: 638
diff changeset
2896 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 new_count = dp->df_count[idx_to] + added;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 dp->df_count[idx_to] = new_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 if (start_skip == 0 && end_skip == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2904 // Check if there are any other buffers and if the diff is
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2905 // equal in them.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 for (i = 0; i < DB_COUNT; ++i)
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2907 if (curtab->tp_diffbuf[i] != NULL && i != idx_from
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 764
diff changeset
2908 && i != idx_to
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 && !diff_equal_entry(dp, idx_from, i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 if (i == DB_COUNT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2913 // delete the diff entry, the buffers are now equal here
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 dfree = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 if (dprev == NULL)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
2917 curtab->tp_first_diff = dp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 dprev->df_next = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 if (added != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 {
29367
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2925 // Adjust marks. This will change the following entries!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 mark_adjust(lnum, lnum + count - 1, (long)MAXLNUM, (long)added);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 if (curwin->w_cursor.lnum >= lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2929 // Adjust the cursor position if it's in/after the changed
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2930 // lines.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 if (curwin->w_cursor.lnum >= lnum + count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 curwin->w_cursor.lnum += added;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 else if (added < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 curwin->w_cursor.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 changed_lines(lnum, 0, lnum + count, (long)added);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 if (dfree != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2941 // Diff is deleted, update folds in other windows.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 diff_fold_update(dfree, idx_to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 vim_free(dfree);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 }
29367
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2947
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2948 // mark_adjust() may have made "dp" invalid. We don't know where
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2949 // to continue then, bail out.
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2950 if (added != 0 && !valid_diff(dp))
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2951 break;
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2952
cc4b36422ecb patch 9.0.0026: accessing freed memory with diff put
Bram Moolenaar <Bram@vim.org>
parents: 29295
diff changeset
2953 if (dfree == NULL)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2954 // mark_adjust() may have changed the count in a wrong way
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 dp->df_count[idx_to] = new_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2957 // When changing the current buffer, keep track of line numbers
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958 if (idx_cur == idx_to)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 off += added;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2962 // If before the range or not deleted, go to next diff.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 if (dfree == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965 dprev = dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 dp = dp->df_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2970 // restore curwin/curbuf and a few other things
2445
04dae202d316 Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2971 if (eap->cmdidx != CMD_diffget)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2973 // Syncing undo only works for the current buffer, but we change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2974 // another buffer. Sync undo if the command was typed. This isn't
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
2975 // 100% right when ":diffput" is used in a function or mapping.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 if (KeyTyped)
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
2977 u_sync(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
2981 theend:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 diff_busy = FALSE;
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
2983 if (diff_need_update)
14893
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2984 ex_diffupdate(NULL);
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2985
14972
5d52b21b2e7f patch 8.1.0497: :%diffput changes order of lines
Bram Moolenaar <Bram@vim.org>
parents: 14893
diff changeset
2986 // Check that the cursor is on a valid character and update its
14893
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2987 // position. When there were filler lines the topline has become
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2988 // invalid.
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2989 check_cursor();
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2990 changed_line_abv_curs();
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2991
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2992 if (diff_need_update)
291656f731c9 patch 8.1.0458: ml_get error and crash when using "do"
Bram Moolenaar <Bram@vim.org>
parents: 14780
diff changeset
2993 // redraw already done by ex_diffupdate()
14776
09c1f241e2f7 patch 8.1.0400: using freed memory with :diffget
Christian Brabandt <cb@256bit.org>
parents: 14770
diff changeset
2994 diff_need_update = FALSE;
14780
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2995 else
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2996 {
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2997 // Also need to redraw the other buffers.
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2998 diff_redraw(FALSE);
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
2999 apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
552523e44923 patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Christian Brabandt <cb@256bit.org>
parents: 14776
diff changeset
3000 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005 * Update folds for all diff buffers for entry "dp".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 * Skip buffer with index "skip_idx".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 * When there are no diffs, all folds are removed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 static void
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
3010 diff_fold_update(diff_T *dp, int skip_idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 win_T *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
3015 FOR_ALL_WINDOWS(wp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016 for (i = 0; i < DB_COUNT; ++i)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3017 if (curtab->tp_diffbuf[i] == wp->w_buffer && i != skip_idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 foldUpdate(wp, dp->df_lnum[i],
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 dp->df_lnum[i] + dp->df_count[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3024 * Return TRUE if buffer "buf" is in diff-mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
3027 diff_mode_buf(buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 {
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3029 tabpage_T *tp;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3030
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
3031 FOR_ALL_TABPAGES(tp)
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3032 if (diff_buf_idx_tp(buf, tp) != DB_COUNT)
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3033 return TRUE;
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3034 return FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 * Move "count" times in direction "dir" to the next diff block.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 * Return FAIL if there isn't such a diff block.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 int
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
3042 diff_move_to(int dir, long count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 linenr_T lnum = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 idx = diff_buf_idx(curbuf);
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3049 if (idx == DB_COUNT || curtab->tp_first_diff == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3052 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3053 ex_diffupdate(NULL); // update after a big change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3054
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3055 if (curtab->tp_first_diff == NULL) // no diffs today
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 while (--count >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3060 // Check if already before first diff.
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3061 if (dir == BACKWARD && lnum <= curtab->tp_first_diff->df_lnum[idx])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3064 for (dp = curtab->tp_first_diff; ; dp = dp->df_next)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 if (dp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 if ((dir == FORWARD && lnum < dp->df_lnum[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 || (dir == BACKWARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 && (dp->df_next == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 || lnum <= dp->df_next->df_lnum[idx])))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 lnum = dp->df_lnum[idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3079 // don't end up past the end of the file
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 if (lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3083 // When the cursor didn't move at all we fail.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 if (lnum == curwin->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 curwin->w_cursor.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3094 /*
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3095 * Return the line number in the current window that is closest to "lnum1" in
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3096 * "buf1" in diff mode.
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3097 */
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3098 static linenr_T
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3099 diff_get_corresponding_line_int(
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
3100 buf_T *buf1,
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3101 linenr_T lnum1)
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3102 {
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3103 int idx1;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3104 int idx2;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3105 diff_T *dp;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3106 int baseline = 0;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3107
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3108 idx1 = diff_buf_idx(buf1);
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3109 idx2 = diff_buf_idx(curbuf);
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3110 if (idx1 == DB_COUNT || idx2 == DB_COUNT || curtab->tp_first_diff == NULL)
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3111 return lnum1;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3112
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3113 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3114 ex_diffupdate(NULL); // update after a big change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3115
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3116 if (curtab->tp_first_diff == NULL) // no diffs today
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3117 return lnum1;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3118
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
3119 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3120 {
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3121 if (dp->df_lnum[idx1] > lnum1)
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3122 return lnum1 - baseline;
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3123 if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1)
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3124 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3125 // Inside the diffblock
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3126 baseline = lnum1 - dp->df_lnum[idx1];
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3127 if (baseline > dp->df_count[idx2])
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3128 baseline = dp->df_count[idx2];
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3129
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3130 return dp->df_lnum[idx2] + baseline;
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3131 }
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3132 if ( (dp->df_lnum[idx1] == lnum1)
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3133 && (dp->df_count[idx1] == 0)
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3134 && (dp->df_lnum[idx2] <= curwin->w_cursor.lnum)
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3135 && ((dp->df_lnum[idx2] + dp->df_count[idx2])
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3136 > curwin->w_cursor.lnum))
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3137 /*
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3138 * Special case: if the cursor is just after a zero-count
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3139 * block (i.e. all filler) and the target cursor is already
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3140 * inside the corresponding block, leave the target cursor
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3141 * unmoved. This makes repeated CTRL-W W operations work
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3142 * as expected.
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3143 */
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3144 return curwin->w_cursor.lnum;
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3145 baseline = (dp->df_lnum[idx1] + dp->df_count[idx1])
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3146 - (dp->df_lnum[idx2] + dp->df_count[idx2]);
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3147 }
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3148
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3149 // If we get here then the cursor is after the last diff
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3150 return lnum1 - baseline;
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3151 }
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3152
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3153 /*
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3154 * Return the line number in the current window that is closest to "lnum1" in
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3155 * "buf1" in diff mode. Checks the line number to be valid.
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3156 */
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3157 linenr_T
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3158 diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1)
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3159 {
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3160 linenr_T lnum = diff_get_corresponding_line_int(buf1, lnum1);
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3161
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3162 // don't end up past the end of the file
10295
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3163 if (lnum > curbuf->b_ml.ml_line_count)
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3164 return curbuf->b_ml.ml_line_count;
d0b74b18e4b5 commit https://github.com/vim/vim/commit/025e3e0bafbc85cc4e365145af711edf99d0a90d
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3165 return lnum;
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3166 }
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2086
diff changeset
3167
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 * For line "lnum" in the current window find the equivalent lnum in window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 * "wp", compensating for inserted/deleted lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 linenr_T
7817
83861277e6a3 commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents: 7799
diff changeset
3173 diff_lnum_win(linenr_T lnum, win_T *wp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 diff_T *dp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 linenr_T n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 idx = diff_buf_idx(curbuf);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3181 if (idx == DB_COUNT) // safety check
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 return (linenr_T)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 671
diff changeset
3184 if (curtab->tp_diff_invalid)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3185 ex_diffupdate(NULL); // update after a big change
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3186
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3187 // search for a change that includes "lnum" in the list of diffblocks.
19888
435726a03481 patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents: 18777
diff changeset
3188 FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3192 // When after the last change, compute relative to the last line number.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 if (dp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 return wp->w_buffer->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 - (curbuf->b_ml.ml_line_count - lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3197 // Find index for "wp".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 i = diff_buf_idx(wp->w_buffer);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3199 if (i == DB_COUNT) // safety check
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 return (linenr_T)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202 n = lnum + (dp->df_lnum[i] - dp->df_lnum[idx]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 if (n > dp->df_lnum[i] + dp->df_count[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 n = dp->df_lnum[i] + dp->df_count[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205 return n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3208 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3209 * Handle an ED style diff line.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3210 * Return FAIL if the line does not contain diff info.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3211 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3212 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3213 parse_diff_ed(
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3214 char_u *line,
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3215 diffhunk_T *hunk)
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3216 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3217 char_u *p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3218 long f1, l1, f2, l2;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3219 int difftype;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3220
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3221 // The line must be one of three formats:
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3222 // change: {first}[,{last}]c{first}[,{last}]
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3223 // append: {first}a{first}[,{last}]
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3224 // delete: {first}[,{last}]d{first}
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3225 p = line;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3226 f1 = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3227 if (*p == ',')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3228 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3229 ++p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3230 l1 = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3231 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3232 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3233 l1 = f1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3234 if (*p != 'a' && *p != 'c' && *p != 'd')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3235 return FAIL; // invalid diff format
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3236 difftype = *p++;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3237 f2 = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3238 if (*p == ',')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3239 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3240 ++p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3241 l2 = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3242 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3243 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3244 l2 = f2;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3245 if (l1 < f1 || l2 < f2)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3246 return FAIL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3247
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3248 if (difftype == 'a')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3249 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3250 hunk->lnum_orig = f1 + 1;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3251 hunk->count_orig = 0;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3252 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3253 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3254 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3255 hunk->lnum_orig = f1;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3256 hunk->count_orig = l1 - f1 + 1;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3257 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3258 if (difftype == 'd')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3259 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3260 hunk->lnum_new = f2 + 1;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3261 hunk->count_new = 0;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3262 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3263 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3264 {
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3265 hunk->lnum_new = f2;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3266 hunk->count_new = l2 - f2 + 1;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3267 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3268 return OK;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3269 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3270
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3271 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3272 * Parses unified diff with zero(!) context lines.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3273 * Return FAIL if there is no diff information in "line".
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3274 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3275 static int
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3276 parse_diff_unified(
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3277 char_u *line,
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3278 diffhunk_T *hunk)
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3279 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3280 char_u *p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3281 long oldline, oldcount, newline, newcount;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3282
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3283 // Parse unified diff hunk header:
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3284 // @@ -oldline,oldcount +newline,newcount @@
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3285 p = line;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3286 if (*p++ == '@' && *p++ == '@' && *p++ == ' ' && *p++ == '-')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3287 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3288 oldline = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3289 if (*p == ',')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3290 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3291 ++p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3292 oldcount = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3293 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3294 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3295 oldcount = 1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3296 if (*p++ == ' ' && *p++ == '+')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3297 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3298 newline = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3299 if (*p == ',')
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3300 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3301 ++p;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3302 newcount = getdigits(&p);
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3303 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3304 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3305 newcount = 1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3306 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3307 else
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3308 return FAIL; // invalid diff format
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3309
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3310 if (oldcount == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3311 oldline += 1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3312 if (newcount == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3313 newline += 1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3314 if (newline == 0)
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3315 newline = 1;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3316
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3317 hunk->lnum_orig = oldline;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3318 hunk->count_orig = oldcount;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3319 hunk->lnum_new = newline;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3320 hunk->count_new = newcount;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3321
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3322 return OK;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3323 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3324
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3325 return FAIL;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3326 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3327
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3328 /*
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3329 * Callback function for the xdl_diff() function.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3330 * Stores the diff output in a grow array.
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3331 */
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3332 static int
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3333 xdiff_out(
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3334 long start_a,
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3335 long count_a,
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3336 long start_b,
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3337 long count_b,
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3338 void *priv)
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3339 {
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3340 diffout_T *dout = (diffout_T *)priv;
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3341 diffhunk_T *p = ALLOC_ONE(diffhunk_T);
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3342
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3343 if (p == NULL)
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3344 return -1;
14982
d56f14540dda patch 8.1.0502: internal diff fails when diffing a context diff
Bram Moolenaar <Bram@vim.org>
parents: 14972
diff changeset
3345
d56f14540dda patch 8.1.0502: internal diff fails when diffing a context diff
Bram Moolenaar <Bram@vim.org>
parents: 14972
diff changeset
3346 if (ga_grow(&dout->dout_ga, 1) == FAIL)
26805
77ff030699d2 patch 8.2.3931: Coverity reports a memory leak
Bram Moolenaar <Bram@vim.org>
parents: 26794
diff changeset
3347 {
77ff030699d2 patch 8.2.3931: Coverity reports a memory leak
Bram Moolenaar <Bram@vim.org>
parents: 26794
diff changeset
3348 vim_free(p);
14982
d56f14540dda patch 8.1.0502: internal diff fails when diffing a context diff
Bram Moolenaar <Bram@vim.org>
parents: 14972
diff changeset
3349 return -1;
26805
77ff030699d2 patch 8.2.3931: Coverity reports a memory leak
Bram Moolenaar <Bram@vim.org>
parents: 26794
diff changeset
3350 }
26786
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3351
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3352 p->lnum_orig = start_a + 1;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3353 p->count_orig = count_a;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3354 p->lnum_new = start_b + 1;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3355 p->count_new = count_b;
b802798e4a26 patch 8.2.3921: the way xdiff is used is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
3356 ((diffhunk_T **)dout->dout_ga.ga_data)[dout->dout_ga.ga_len++] = p;
14696
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3357 return 0;
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3358 }
195e8b1fcbbf patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents: 14019
diff changeset
3359
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3360 #endif // FEAT_DIFF
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3361
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3362 #if defined(FEAT_EVAL) || defined(PROTO)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3363
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3364 /*
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3365 * "diff_filler()" function
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3366 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3367 void
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3368 f_diff_filler(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3369 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3370 #ifdef FEAT_DIFF
25384
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25314
diff changeset
3371 if (in_vim9script() && check_for_lnum_arg(argvars, 0) == FAIL)
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25314
diff changeset
3372 return;
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25314
diff changeset
3373
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3374 rettv->vval.v_number = diff_check_fill(curwin, tv_get_lnum(argvars));
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3375 #endif
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3376 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3377
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3378 /*
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3379 * "diff_hlID()" function
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3380 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3381 void
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3382 f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3383 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3384 #ifdef FEAT_DIFF
25272
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3385 linenr_T lnum;
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3386 static linenr_T prev_lnum = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3387 static varnumber_T changedtick = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3388 static int fnum = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3389 static int change_start = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3390 static int change_end = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3391 static hlf_T hlID = (hlf_T)0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3392 int filler_lines;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3393 int col;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3394
25272
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3395 if (in_vim9script()
25314
7e620652bd13 patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25302
diff changeset
3396 && (check_for_lnum_arg(argvars,0) == FAIL
25272
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3397 || check_for_number_arg(argvars, 1) == FAIL))
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3398 return;
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3399
712e867f9721 patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24683
diff changeset
3400 lnum = tv_get_lnum(argvars);
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3401 if (lnum < 0) // ignore type error in {lnum} arg
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3402 lnum = 0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3403 if (lnum != prev_lnum
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3404 || changedtick != CHANGEDTICK(curbuf)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3405 || fnum != curbuf->b_fnum)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3406 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3407 // New line, buffer, change: need to get the values.
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3408 filler_lines = diff_check(curwin, lnum);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3409 if (filler_lines < 0)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3410 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3411 if (filler_lines == -1)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3412 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3413 change_start = MAXCOL;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3414 change_end = -1;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3415 if (diff_find_change(curwin, lnum, &change_start, &change_end))
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3416 hlID = HLF_ADD; // added line
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3417 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3418 hlID = HLF_CHD; // changed line
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3419 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3420 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3421 hlID = HLF_ADD; // added line
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3422 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3423 else
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3424 hlID = (hlf_T)0;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3425 prev_lnum = lnum;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3426 changedtick = CHANGEDTICK(curbuf);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3427 fnum = curbuf->b_fnum;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3428 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3429
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3430 if (hlID == HLF_CHD || hlID == HLF_TXD)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3431 {
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3432 col = tv_get_number(&argvars[1]) - 1; // ignore type error in {col}
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3433 if (col >= change_start && col <= change_end)
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3434 hlID = HLF_TXD; // changed text
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3435 else
18777
3a68dc2a1bc1 patch 8.1.2378: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18619
diff changeset
3436 hlID = HLF_CHD; // changed line
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3437 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3438 rettv->vval.v_number = hlID == (hlf_T)0 ? 0 : (int)hlID;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3439 #endif
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3440 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3441
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17851
diff changeset
3442 #endif