@@ -194,8 +194,8 @@ struct emit_callback {
194
194
sane_truncate_fn truncate ;
195
195
const char * * label_path ;
196
196
struct diff_words_data * diff_words ;
197
+ struct diff_options * opt ;
197
198
int * found_changesp ;
198
- FILE * file ;
199
199
struct strbuf * header ;
200
200
};
201
201
@@ -282,11 +282,19 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
282
282
ecbdata -> blank_at_eof_in_postimage = (at - l2 ) + 1 ;
283
283
}
284
284
285
- static void emit_line_0 (FILE * file , const char * set , const char * reset ,
285
+ static void emit_line_0 (struct diff_options * o , const char * set , const char * reset ,
286
286
int first , const char * line , int len )
287
287
{
288
288
int has_trailing_newline , has_trailing_carriage_return ;
289
289
int nofirst ;
290
+ FILE * file = o -> file ;
291
+
292
+ if (o -> output_prefix ) {
293
+ struct strbuf * msg = NULL ;
294
+ msg = o -> output_prefix (o , o -> output_prefix_data );
295
+ assert (msg );
296
+ fwrite (msg -> buf , msg -> len , 1 , file );
297
+ }
290
298
291
299
if (len == 0 ) {
292
300
has_trailing_newline = (first == '\n' );
@@ -316,10 +324,10 @@ static void emit_line_0(FILE *file, const char *set, const char *reset,
316
324
fputc ('\n' , file );
317
325
}
318
326
319
- static void emit_line (FILE * file , const char * set , const char * reset ,
327
+ static void emit_line (struct diff_options * o , const char * set , const char * reset ,
320
328
const char * line , int len )
321
329
{
322
- emit_line_0 (file , set , reset , line [0 ], line + 1 , len - 1 );
330
+ emit_line_0 (o , set , reset , line [0 ], line + 1 , len - 1 );
323
331
}
324
332
325
333
static int new_blank_line_at_eof (struct emit_callback * ecbdata , const char * line , int len )
@@ -341,15 +349,15 @@ static void emit_add_line(const char *reset,
341
349
const char * set = diff_get_color (ecbdata -> color_diff , DIFF_FILE_NEW );
342
350
343
351
if (!* ws )
344
- emit_line_0 (ecbdata -> file , set , reset , '+' , line , len );
352
+ emit_line_0 (ecbdata -> opt , set , reset , '+' , line , len );
345
353
else if (new_blank_line_at_eof (ecbdata , line , len ))
346
354
/* Blank line at EOF - paint '+' as well */
347
- emit_line_0 (ecbdata -> file , ws , reset , '+' , line , len );
355
+ emit_line_0 (ecbdata -> opt , ws , reset , '+' , line , len );
348
356
else {
349
357
/* Emit just the prefix, then the rest. */
350
- emit_line_0 (ecbdata -> file , set , reset , '+' , "" , 0 );
358
+ emit_line_0 (ecbdata -> opt , set , reset , '+' , "" , 0 );
351
359
ws_check_emit (line , len , ecbdata -> ws_rule ,
352
- ecbdata -> file , set , reset , ws );
360
+ ecbdata -> opt -> file , set , reset , ws );
353
361
}
354
362
}
355
363
@@ -370,23 +378,23 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
370
378
if (len < 10 ||
371
379
memcmp (line , atat , 2 ) ||
372
380
!(ep = memmem (line + 2 , len - 2 , atat , 2 ))) {
373
- emit_line (ecbdata -> file , plain , reset , line , len );
381
+ emit_line (ecbdata -> opt , plain , reset , line , len );
374
382
return ;
375
383
}
376
384
ep += 2 ; /* skip over @@ */
377
385
378
386
/* The hunk header in fraginfo color */
379
- emit_line (ecbdata -> file , frag , reset , line , ep - line );
387
+ emit_line (ecbdata -> opt , frag , reset , line , ep - line );
380
388
381
389
/* blank before the func header */
382
390
for (cp = ep ; ep - line < len ; ep ++ )
383
391
if (* ep != ' ' && * ep != '\t' )
384
392
break ;
385
393
if (ep != cp )
386
- emit_line (ecbdata -> file , plain , reset , cp , ep - cp );
394
+ emit_line (ecbdata -> opt , plain , reset , cp , ep - cp );
387
395
388
396
if (ep < line + len )
389
- emit_line (ecbdata -> file , func , reset , ep , line + len - ep );
397
+ emit_line (ecbdata -> opt , func , reset , ep , line + len - ep );
390
398
}
391
399
392
400
static struct diff_tempfile * claim_diff_tempfile (void ) {
@@ -446,7 +454,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
446
454
len = endp ? (endp - data + 1 ) : size ;
447
455
if (prefix != '+' ) {
448
456
ecb -> lno_in_preimage ++ ;
449
- emit_line_0 (ecb -> file , old , reset , '-' ,
457
+ emit_line_0 (ecb -> opt , old , reset , '-' ,
450
458
data , len );
451
459
} else {
452
460
ecb -> lno_in_postimage ++ ;
@@ -458,7 +466,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
458
466
if (!endp ) {
459
467
const char * plain = diff_get_color (ecb -> color_diff ,
460
468
DIFF_PLAIN );
461
- emit_line_0 (ecb -> file , plain , reset , '\\' ,
469
+ emit_line_0 (ecb -> opt , plain , reset , '\\' ,
462
470
nneof , strlen (nneof ));
463
471
}
464
472
}
@@ -508,7 +516,7 @@ static void emit_rewrite_diff(const char *name_a,
508
516
ecbdata .color_diff = color_diff ;
509
517
ecbdata .found_changesp = & o -> found_changes ;
510
518
ecbdata .ws_rule = whitespace_rule (name_b ? name_b : name_a );
511
- ecbdata .file = o -> file ;
519
+ ecbdata .opt = o ;
512
520
if (ecbdata .ws_rule & WS_BLANK_AT_EOF ) {
513
521
mmfile_t mf1 , mf2 ;
514
522
mf1 .ptr = (char * )data_one ;
@@ -840,7 +848,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
840
848
const char * reset = diff_get_color (ecbdata -> color_diff , DIFF_RESET );
841
849
842
850
if (ecbdata -> header ) {
843
- fprintf (ecbdata -> file , "%s" , ecbdata -> header -> buf );
851
+ fprintf (ecbdata -> opt -> file , "%s" , ecbdata -> header -> buf );
844
852
strbuf_reset (ecbdata -> header );
845
853
ecbdata -> header = NULL ;
846
854
}
@@ -852,9 +860,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
852
860
name_a_tab = strchr (ecbdata -> label_path [0 ], ' ' ) ? "\t" : "" ;
853
861
name_b_tab = strchr (ecbdata -> label_path [1 ], ' ' ) ? "\t" : "" ;
854
862
855
- fprintf (ecbdata -> file , "%s--- %s%s%s\n" ,
863
+ fprintf (ecbdata -> opt -> file , "%s--- %s%s%s\n" ,
856
864
meta , ecbdata -> label_path [0 ], reset , name_a_tab );
857
- fprintf (ecbdata -> file , "%s+++ %s%s%s\n" ,
865
+ fprintf (ecbdata -> opt -> file , "%s+++ %s%s%s\n" ,
858
866
meta , ecbdata -> label_path [1 ], reset , name_b_tab );
859
867
ecbdata -> label_path [0 ] = ecbdata -> label_path [1 ] = NULL ;
860
868
}
@@ -872,15 +880,15 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
872
880
find_lno (line , ecbdata );
873
881
emit_hunk_header (ecbdata , line , len );
874
882
if (line [len - 1 ] != '\n' )
875
- putc ('\n' , ecbdata -> file );
883
+ putc ('\n' , ecbdata -> opt -> file );
876
884
return ;
877
885
}
878
886
879
887
if (len < 1 ) {
880
- emit_line (ecbdata -> file , reset , reset , line , len );
888
+ emit_line (ecbdata -> opt , reset , reset , line , len );
881
889
if (ecbdata -> diff_words
882
890
&& ecbdata -> diff_words -> type == DIFF_WORDS_PORCELAIN )
883
- fputs ("~\n" , ecbdata -> file );
891
+ fputs ("~\n" , ecbdata -> opt -> file );
884
892
return ;
885
893
}
886
894
@@ -896,11 +904,11 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
896
904
}
897
905
diff_words_flush (ecbdata );
898
906
if (ecbdata -> diff_words -> type == DIFF_WORDS_PORCELAIN ) {
899
- emit_line (ecbdata -> file , plain , reset , line , len );
900
- fputs ("~\n" , ecbdata -> file );
907
+ emit_line (ecbdata -> opt , plain , reset , line , len );
908
+ fputs ("~\n" , ecbdata -> opt -> file );
901
909
} else {
902
910
/* don't print the prefix character */
903
- emit_line (ecbdata -> file , plain , reset , line + 1 , len - 1 );
911
+ emit_line (ecbdata -> opt , plain , reset , line + 1 , len - 1 );
904
912
}
905
913
return ;
906
914
}
@@ -912,7 +920,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
912
920
ecbdata -> lno_in_preimage ++ ;
913
921
if (line [0 ] == ' ' )
914
922
ecbdata -> lno_in_postimage ++ ;
915
- emit_line (ecbdata -> file , color , reset , line , len );
923
+ emit_line (ecbdata -> opt , color , reset , line , len );
916
924
} else {
917
925
ecbdata -> lno_in_postimage ++ ;
918
926
emit_add_line (reset , ecbdata , line + 1 , len - 1 );
@@ -1477,7 +1485,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
1477
1485
fprintf (data -> o -> file , "%s:%d: %s.\n" ,
1478
1486
data -> filename , data -> lineno , err );
1479
1487
free (err );
1480
- emit_line (data -> o -> file , set , reset , line , 1 );
1488
+ emit_line (data -> o , set , reset , line , 1 );
1481
1489
ws_check_emit (line + 1 , len - 1 , data -> ws_rule ,
1482
1490
data -> o -> file , set , reset , ws );
1483
1491
} else if (line [0 ] == ' ' ) {
@@ -1787,7 +1795,7 @@ static void builtin_diff(const char *name_a,
1787
1795
ecbdata .ws_rule = whitespace_rule (name_b ? name_b : name_a );
1788
1796
if (ecbdata .ws_rule & WS_BLANK_AT_EOF )
1789
1797
check_blank_at_eof (& mf1 , & mf2 , & ecbdata );
1790
- ecbdata .file = o -> file ;
1798
+ ecbdata .opt = o ;
1791
1799
ecbdata .header = header .len ? & header : NULL ;
1792
1800
xpp .flags = XDF_NEED_MINIMAL | o -> xdl_opts ;
1793
1801
xecfg .ctxlen = o -> context ;
0 commit comments