@@ -194,8 +194,8 @@ struct emit_callback {
194194 sane_truncate_fn truncate ;
195195 const char * * label_path ;
196196 struct diff_words_data * diff_words ;
197+ struct diff_options * opt ;
197198 int * found_changesp ;
198- FILE * file ;
199199 struct strbuf * header ;
200200};
201201
@@ -282,11 +282,19 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
282282 ecbdata -> blank_at_eof_in_postimage = (at - l2 ) + 1 ;
283283}
284284
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 ,
286286 int first , const char * line , int len )
287287{
288288 int has_trailing_newline , has_trailing_carriage_return ;
289289 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+ }
290298
291299 if (len == 0 ) {
292300 has_trailing_newline = (first == '\n' );
@@ -316,10 +324,10 @@ static void emit_line_0(FILE *file, const char *set, const char *reset,
316324 fputc ('\n' , file );
317325}
318326
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 ,
320328 const char * line , int len )
321329{
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 );
323331}
324332
325333static 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,
341349 const char * set = diff_get_color (ecbdata -> color_diff , DIFF_FILE_NEW );
342350
343351 if (!* ws )
344- emit_line_0 (ecbdata -> file , set , reset , '+' , line , len );
352+ emit_line_0 (ecbdata -> opt , set , reset , '+' , line , len );
345353 else if (new_blank_line_at_eof (ecbdata , line , len ))
346354 /* 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 );
348356 else {
349357 /* 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 );
351359 ws_check_emit (line , len , ecbdata -> ws_rule ,
352- ecbdata -> file , set , reset , ws );
360+ ecbdata -> opt -> file , set , reset , ws );
353361 }
354362}
355363
@@ -370,23 +378,23 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
370378 if (len < 10 ||
371379 memcmp (line , atat , 2 ) ||
372380 !(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 );
374382 return ;
375383 }
376384 ep += 2 ; /* skip over @@ */
377385
378386 /* 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 );
380388
381389 /* blank before the func header */
382390 for (cp = ep ; ep - line < len ; ep ++ )
383391 if (* ep != ' ' && * ep != '\t' )
384392 break ;
385393 if (ep != cp )
386- emit_line (ecbdata -> file , plain , reset , cp , ep - cp );
394+ emit_line (ecbdata -> opt , plain , reset , cp , ep - cp );
387395
388396 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 );
390398}
391399
392400static struct diff_tempfile * claim_diff_tempfile (void ) {
@@ -446,7 +454,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
446454 len = endp ? (endp - data + 1 ) : size ;
447455 if (prefix != '+' ) {
448456 ecb -> lno_in_preimage ++ ;
449- emit_line_0 (ecb -> file , old , reset , '-' ,
457+ emit_line_0 (ecb -> opt , old , reset , '-' ,
450458 data , len );
451459 } else {
452460 ecb -> lno_in_postimage ++ ;
@@ -458,7 +466,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
458466 if (!endp ) {
459467 const char * plain = diff_get_color (ecb -> color_diff ,
460468 DIFF_PLAIN );
461- emit_line_0 (ecb -> file , plain , reset , '\\' ,
469+ emit_line_0 (ecb -> opt , plain , reset , '\\' ,
462470 nneof , strlen (nneof ));
463471 }
464472}
@@ -508,7 +516,7 @@ static void emit_rewrite_diff(const char *name_a,
508516 ecbdata .color_diff = color_diff ;
509517 ecbdata .found_changesp = & o -> found_changes ;
510518 ecbdata .ws_rule = whitespace_rule (name_b ? name_b : name_a );
511- ecbdata .file = o -> file ;
519+ ecbdata .opt = o ;
512520 if (ecbdata .ws_rule & WS_BLANK_AT_EOF ) {
513521 mmfile_t mf1 , mf2 ;
514522 mf1 .ptr = (char * )data_one ;
@@ -840,7 +848,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
840848 const char * reset = diff_get_color (ecbdata -> color_diff , DIFF_RESET );
841849
842850 if (ecbdata -> header ) {
843- fprintf (ecbdata -> file , "%s" , ecbdata -> header -> buf );
851+ fprintf (ecbdata -> opt -> file , "%s" , ecbdata -> header -> buf );
844852 strbuf_reset (ecbdata -> header );
845853 ecbdata -> header = NULL ;
846854 }
@@ -852,9 +860,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
852860 name_a_tab = strchr (ecbdata -> label_path [0 ], ' ' ) ? "\t" : "" ;
853861 name_b_tab = strchr (ecbdata -> label_path [1 ], ' ' ) ? "\t" : "" ;
854862
855- fprintf (ecbdata -> file , "%s--- %s%s%s\n" ,
863+ fprintf (ecbdata -> opt -> file , "%s--- %s%s%s\n" ,
856864 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" ,
858866 meta , ecbdata -> label_path [1 ], reset , name_b_tab );
859867 ecbdata -> label_path [0 ] = ecbdata -> label_path [1 ] = NULL ;
860868 }
@@ -872,15 +880,15 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
872880 find_lno (line , ecbdata );
873881 emit_hunk_header (ecbdata , line , len );
874882 if (line [len - 1 ] != '\n' )
875- putc ('\n' , ecbdata -> file );
883+ putc ('\n' , ecbdata -> opt -> file );
876884 return ;
877885 }
878886
879887 if (len < 1 ) {
880- emit_line (ecbdata -> file , reset , reset , line , len );
888+ emit_line (ecbdata -> opt , reset , reset , line , len );
881889 if (ecbdata -> diff_words
882890 && ecbdata -> diff_words -> type == DIFF_WORDS_PORCELAIN )
883- fputs ("~\n" , ecbdata -> file );
891+ fputs ("~\n" , ecbdata -> opt -> file );
884892 return ;
885893 }
886894
@@ -896,11 +904,11 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
896904 }
897905 diff_words_flush (ecbdata );
898906 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 );
901909 } else {
902910 /* 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 );
904912 }
905913 return ;
906914 }
@@ -912,7 +920,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
912920 ecbdata -> lno_in_preimage ++ ;
913921 if (line [0 ] == ' ' )
914922 ecbdata -> lno_in_postimage ++ ;
915- emit_line (ecbdata -> file , color , reset , line , len );
923+ emit_line (ecbdata -> opt , color , reset , line , len );
916924 } else {
917925 ecbdata -> lno_in_postimage ++ ;
918926 emit_add_line (reset , ecbdata , line + 1 , len - 1 );
@@ -1477,7 +1485,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
14771485 fprintf (data -> o -> file , "%s:%d: %s.\n" ,
14781486 data -> filename , data -> lineno , err );
14791487 free (err );
1480- emit_line (data -> o -> file , set , reset , line , 1 );
1488+ emit_line (data -> o , set , reset , line , 1 );
14811489 ws_check_emit (line + 1 , len - 1 , data -> ws_rule ,
14821490 data -> o -> file , set , reset , ws );
14831491 } else if (line [0 ] == ' ' ) {
@@ -1787,7 +1795,7 @@ static void builtin_diff(const char *name_a,
17871795 ecbdata .ws_rule = whitespace_rule (name_b ? name_b : name_a );
17881796 if (ecbdata .ws_rule & WS_BLANK_AT_EOF )
17891797 check_blank_at_eof (& mf1 , & mf2 , & ecbdata );
1790- ecbdata .file = o -> file ;
1798+ ecbdata .opt = o ;
17911799 ecbdata .header = header .len ? & header : NULL ;
17921800 xpp .flags = XDF_NEED_MINIMAL | o -> xdl_opts ;
17931801 xecfg .ctxlen = o -> context ;
0 commit comments