@@ -109,7 +109,7 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
109
109
return 0 ;
110
110
}
111
111
112
- static int xdl_recs_copy_0 (int use_orig , xdfenv_t * xe , int i , int count , int add_nl , char * dest )
112
+ static int xdl_recs_copy_0 (int use_orig , xdfenv_t * xe , int i , int count , int needs_cr , int add_nl , char * dest )
113
113
{
114
114
xrecord_t * * recs ;
115
115
int size = 0 ;
@@ -125,6 +125,12 @@ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add
125
125
if (add_nl ) {
126
126
i = recs [count - 1 ]-> size ;
127
127
if (i == 0 || recs [count - 1 ]-> ptr [i - 1 ] != '\n' ) {
128
+ if (needs_cr ) {
129
+ if (dest )
130
+ dest [size ] = '\r' ;
131
+ size ++ ;
132
+ }
133
+
128
134
if (dest )
129
135
dest [size ] = '\n' ;
130
136
size ++ ;
@@ -133,14 +139,14 @@ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add
133
139
return size ;
134
140
}
135
141
136
- static int xdl_recs_copy (xdfenv_t * xe , int i , int count , int add_nl , char * dest )
142
+ static int xdl_recs_copy (xdfenv_t * xe , int i , int count , int needs_cr , int add_nl , char * dest )
137
143
{
138
- return xdl_recs_copy_0 (0 , xe , i , count , add_nl , dest );
144
+ return xdl_recs_copy_0 (0 , xe , i , count , needs_cr , add_nl , dest );
139
145
}
140
146
141
- static int xdl_orig_copy (xdfenv_t * xe , int i , int count , int add_nl , char * dest )
147
+ static int xdl_orig_copy (xdfenv_t * xe , int i , int count , int needs_cr , int add_nl , char * dest )
142
148
{
143
- return xdl_recs_copy_0 (1 , xe , i , count , add_nl , dest );
149
+ return xdl_recs_copy_0 (1 , xe , i , count , needs_cr , add_nl , dest );
144
150
}
145
151
146
152
/*
@@ -202,7 +208,7 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
202
208
marker_size = DEFAULT_CONFLICT_MARKER_SIZE ;
203
209
204
210
/* Before conflicting part */
205
- size += xdl_recs_copy (xe1 , i , m -> i1 - i , 0 ,
211
+ size += xdl_recs_copy (xe1 , i , m -> i1 - i , 0 , 0 ,
206
212
dest ? dest + size : NULL );
207
213
208
214
if (!dest ) {
@@ -221,7 +227,7 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
221
227
}
222
228
223
229
/* Postimage from side #1 */
224
- size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , 1 ,
230
+ size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , needs_cr , 1 ,
225
231
dest ? dest + size : NULL );
226
232
227
233
if (style == XDL_MERGE_DIFF3 ) {
@@ -240,7 +246,7 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
240
246
dest [size ++ ] = '\r' ;
241
247
dest [size ++ ] = '\n' ;
242
248
}
243
- size += xdl_orig_copy (xe1 , m -> i0 , m -> chg0 , 1 ,
249
+ size += xdl_orig_copy (xe1 , m -> i0 , m -> chg0 , needs_cr , 1 ,
244
250
dest ? dest + size : NULL );
245
251
}
246
252
@@ -255,7 +261,7 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
255
261
}
256
262
257
263
/* Postimage from side #2 */
258
- size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , 1 ,
264
+ size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , needs_cr , 1 ,
259
265
dest ? dest + size : NULL );
260
266
if (!dest ) {
261
267
size += marker_size + 1 + needs_cr + marker2_size ;
@@ -294,21 +300,24 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
294
300
marker_size );
295
301
else if (m -> mode & 3 ) {
296
302
/* Before conflicting part */
297
- size += xdl_recs_copy (xe1 , i , m -> i1 - i , 0 ,
303
+ size += xdl_recs_copy (xe1 , i , m -> i1 - i , 0 , 0 ,
298
304
dest ? dest + size : NULL );
299
305
/* Postimage from side #1 */
300
- if (m -> mode & 1 )
301
- size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , (m -> mode & 2 ),
306
+ if (m -> mode & 1 ) {
307
+ int needs_cr = is_cr_needed (xe1 , xe2 , m );
308
+
309
+ size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , needs_cr , (m -> mode & 2 ),
302
310
dest ? dest + size : NULL );
311
+ }
303
312
/* Postimage from side #2 */
304
313
if (m -> mode & 2 )
305
- size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , 0 ,
314
+ size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , 0 , 0 ,
306
315
dest ? dest + size : NULL );
307
316
} else
308
317
continue ;
309
318
i = m -> i1 + m -> chg1 ;
310
319
}
311
- size += xdl_recs_copy (xe1 , i , xe1 -> xdf2 .nrec - i , 0 ,
320
+ size += xdl_recs_copy (xe1 , i , xe1 -> xdf2 .nrec - i , 0 , 0 ,
312
321
dest ? dest + size : NULL );
313
322
return size ;
314
323
}
0 commit comments