@@ -113,65 +113,84 @@ static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
113113 return size ;
114114}
115115
116- static int xdl_fill_merge_buffer (xdfenv_t * xe1 , const char * name1 ,
117- xdfenv_t * xe2 , const char * name2 , xdmerge_t * m , char * dest )
116+ static int fill_conflict_hunk (xdfenv_t * xe1 , const char * name1 ,
117+ xdfenv_t * xe2 , const char * name2 ,
118+ int size , int i ,
119+ xdmerge_t * m , char * dest )
118120{
119121 const int marker_size = 7 ;
120122 int marker1_size = (name1 ? strlen (name1 ) + 1 : 0 );
121123 int marker2_size = (name2 ? strlen (name2 ) + 1 : 0 );
122- int conflict_marker_size = 3 * (marker_size + 1 )
123- + marker1_size + marker2_size ;
124- int size , i1 , j ;
125-
126- for (size = i1 = 0 ; m ; m = m -> next ) {
127- if (m -> mode == 0 ) {
128- size += xdl_recs_copy (xe1 , i1 , m -> i1 - i1 , 0 ,
129- dest ? dest + size : NULL );
130- if (dest ) {
131- for (j = 0 ; j < marker_size ; j ++ )
132- dest [size ++ ] = '<' ;
133- if (marker1_size ) {
134- dest [size ] = ' ' ;
135- memcpy (dest + size + 1 , name1 ,
136- marker1_size - 1 );
137- size += marker1_size ;
138- }
139- dest [size ++ ] = '\n' ;
140- } else
141- size += conflict_marker_size ;
142- size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , 1 ,
143- dest ? dest + size : NULL );
144- if (dest ) {
145- for (j = 0 ; j < marker_size ; j ++ )
146- dest [size ++ ] = '=' ;
147- dest [size ++ ] = '\n' ;
148- }
149- size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , 1 ,
150- dest ? dest + size : NULL );
151- if (dest ) {
152- for (j = 0 ; j < marker_size ; j ++ )
153- dest [size ++ ] = '>' ;
154- if (marker2_size ) {
155- dest [size ] = ' ' ;
156- memcpy (dest + size + 1 , name2 ,
157- marker2_size - 1 );
158- size += marker2_size ;
159- }
160- dest [size ++ ] = '\n' ;
161- }
162- } else if (m -> mode == 1 )
163- size += xdl_recs_copy (xe1 , i1 , m -> i1 + m -> chg1 - i1 , 0 ,
164- dest ? dest + size : NULL );
124+ int j ;
125+
126+ /* Before conflicting part */
127+ size += xdl_recs_copy (xe1 , i , m -> i1 - i , 0 ,
128+ dest ? dest + size : NULL );
129+
130+ if (!dest ) {
131+ size += marker_size + 1 + marker1_size ;
132+ } else {
133+ for (j = 0 ; j < marker_size ; j ++ )
134+ dest [size ++ ] = '<' ;
135+ if (marker1_size ) {
136+ dest [size ] = ' ' ;
137+ memcpy (dest + size + 1 , name1 , marker1_size - 1 );
138+ size += marker1_size ;
139+ }
140+ dest [size ++ ] = '\n' ;
141+ }
142+
143+ /* Postimage from side #1 */
144+ size += xdl_recs_copy (xe1 , m -> i1 , m -> chg1 , 1 ,
145+ dest ? dest + size : NULL );
146+ if (!dest ) {
147+ size += marker_size + 1 ;
148+ } else {
149+ for (j = 0 ; j < marker_size ; j ++ )
150+ dest [size ++ ] = '=' ;
151+ dest [size ++ ] = '\n' ;
152+ }
153+
154+ /* Postimage from side #2 */
155+ size += xdl_recs_copy (xe2 , m -> i2 , m -> chg2 , 1 ,
156+ dest ? dest + size : NULL );
157+ if (!dest ) {
158+ size += marker_size + 1 + marker2_size ;
159+ } else {
160+ for (j = 0 ; j < marker_size ; j ++ )
161+ dest [size ++ ] = '>' ;
162+ if (marker2_size ) {
163+ dest [size ] = ' ' ;
164+ memcpy (dest + size + 1 , name2 , marker2_size - 1 );
165+ size += marker2_size ;
166+ }
167+ dest [size ++ ] = '\n' ;
168+ }
169+ return size ;
170+ }
171+
172+ static int xdl_fill_merge_buffer (xdfenv_t * xe1 , const char * name1 ,
173+ xdfenv_t * xe2 , const char * name2 , xdmerge_t * m , char * dest )
174+ {
175+ int size , i ;
176+
177+ for (size = i = 0 ; m ; m = m -> next ) {
178+ if (m -> mode == 0 )
179+ size = fill_conflict_hunk (xe1 , name1 , xe2 , name2 ,
180+ size , i , m , dest );
181+ else if (m -> mode == 1 )
182+ size += xdl_recs_copy (xe1 , i , m -> i1 + m -> chg1 - i , 0 ,
183+ dest ? dest + size : NULL );
165184 else if (m -> mode == 2 )
166- size += xdl_recs_copy (xe2 , m -> i2 - m -> i1 + i1 ,
167- m -> i1 + m -> chg2 - i1 , 0 ,
168- dest ? dest + size : NULL );
185+ size += xdl_recs_copy (xe2 , m -> i2 - m -> i1 + i ,
186+ m -> i1 + m -> chg2 - i , 0 ,
187+ dest ? dest + size : NULL );
169188 else
170189 continue ;
171- i1 = m -> i1 + m -> chg1 ;
190+ i = m -> i1 + m -> chg1 ;
172191 }
173- size += xdl_recs_copy (xe1 , i1 , xe1 -> xdf2 .nrec - i1 , 0 ,
174- dest ? dest + size : NULL );
192+ size += xdl_recs_copy (xe1 , i , xe1 -> xdf2 .nrec - i , 0 ,
193+ dest ? dest + size : NULL );
175194 return size ;
176195}
177196
0 commit comments