@@ -273,18 +273,31 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
273
273
ecbdata -> blank_at_eof_in_postimage = (at - l2 ) + 1 ;
274
274
}
275
275
276
- static void emit_line (FILE * file , const char * set , const char * reset , const char * line , int len )
276
+ static void emit_line_0 (FILE * file , const char * set , const char * reset ,
277
+ int first , const char * line , int len )
277
278
{
278
279
int has_trailing_newline , has_trailing_carriage_return ;
280
+ int nofirst ;
279
281
280
- has_trailing_newline = (len > 0 && line [len - 1 ] == '\n' );
281
- if (has_trailing_newline )
282
- len -- ;
283
- has_trailing_carriage_return = (len > 0 && line [len - 1 ] == '\r' );
284
- if (has_trailing_carriage_return )
285
- len -- ;
282
+ if (len == 0 ) {
283
+ has_trailing_newline = (first == '\n' );
284
+ has_trailing_carriage_return = (!has_trailing_newline &&
285
+ (first == '\r' ));
286
+ nofirst = has_trailing_newline || has_trailing_carriage_return ;
287
+ } else {
288
+ has_trailing_newline = (len > 0 && line [len - 1 ] == '\n' );
289
+ if (has_trailing_newline )
290
+ len -- ;
291
+ has_trailing_carriage_return = (len > 0 && line [len - 1 ] == '\r' );
292
+ if (has_trailing_carriage_return )
293
+ len -- ;
294
+ nofirst = 0 ;
295
+ }
286
296
287
297
fputs (set , file );
298
+
299
+ if (!nofirst )
300
+ fputc (first , file );
288
301
fwrite (line , len , 1 , file );
289
302
fputs (reset , file );
290
303
if (has_trailing_carriage_return )
@@ -293,6 +306,12 @@ static void emit_line(FILE *file, const char *set, const char *reset, const char
293
306
fputc ('\n' , file );
294
307
}
295
308
309
+ static void emit_line (FILE * file , const char * set , const char * reset ,
310
+ const char * line , int len )
311
+ {
312
+ emit_line_0 (file , set , reset , line [0 ], line + 1 , len - 1 );
313
+ }
314
+
296
315
static int new_blank_line_at_eof (struct emit_callback * ecbdata , const char * line , int len )
297
316
{
298
317
if (!((ecbdata -> ws_rule & WS_BLANK_AT_EOF ) &&
@@ -301,23 +320,25 @@ static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line
301
320
ecbdata -> blank_at_eof_in_preimage <= ecbdata -> lno_in_preimage &&
302
321
ecbdata -> blank_at_eof_in_postimage <= ecbdata -> lno_in_postimage ))
303
322
return 0 ;
304
- return ws_blank_line (line + 1 , len - 1 , ecbdata -> ws_rule );
323
+ return ws_blank_line (line , len , ecbdata -> ws_rule );
305
324
}
306
325
307
- static void emit_add_line (const char * reset , struct emit_callback * ecbdata , const char * line , int len )
326
+ static void emit_add_line (const char * reset ,
327
+ struct emit_callback * ecbdata ,
328
+ const char * line , int len )
308
329
{
309
330
const char * ws = diff_get_color (ecbdata -> color_diff , DIFF_WHITESPACE );
310
331
const char * set = diff_get_color (ecbdata -> color_diff , DIFF_FILE_NEW );
311
332
312
333
if (!* ws )
313
- emit_line (ecbdata -> file , set , reset , line , len );
334
+ emit_line_0 (ecbdata -> file , set , reset , '+' , line , len );
314
335
else if (new_blank_line_at_eof (ecbdata , line , len ))
315
336
/* Blank line at EOF - paint '+' as well */
316
- emit_line (ecbdata -> file , ws , reset , line , len );
337
+ emit_line_0 (ecbdata -> file , ws , reset , '+' , line , len );
317
338
else {
318
339
/* Emit just the prefix, then the rest. */
319
- emit_line (ecbdata -> file , set , reset , line , 1 );
320
- ws_check_emit (line + 1 , len - 1 , ecbdata -> ws_rule ,
340
+ emit_line_0 (ecbdata -> file , set , reset , '+' , "" , 0 );
341
+ ws_check_emit (line , len , ecbdata -> ws_rule ,
321
342
ecbdata -> file , set , reset , ws );
322
343
}
323
344
}
@@ -770,7 +791,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
770
791
emit_line (ecbdata -> file , color , reset , line , len );
771
792
} else {
772
793
ecbdata -> lno_in_postimage ++ ;
773
- emit_add_line (reset , ecbdata , line , len );
794
+ emit_add_line (reset , ecbdata , line + 1 , len - 1 );
774
795
}
775
796
}
776
797
0 commit comments