@@ -166,28 +166,41 @@
166 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int lnV2; /* Lines read from v2 */
167 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int lnOut; /* Lines written to out */
168 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nConflict; /* Number of conflicts seen */
169 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags; /* Flags for difference engine */
170 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct MergeBuilderHtml {
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct MergeBuilder base;
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Columns for each of the entries in this summary of the HTML
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** layout:
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** # baseline C # local C # merged-in C # merge-result
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0-1--------2-3-4-----5-6-7---------8-9-10
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob aCol[11];
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
171 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
172 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
173 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
174 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************************* Generic MergeBuilder ******************************/
175 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* These are generic methods for MergeBuilder. They just output debugging
176 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** information. But some of them are useful as base methods for other useful
177 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** implementations of MergeBuilder.
178 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
179 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* xStart() and xEnd() are called to generate header and fotter information
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in the output. This is a no-op in the generic implementation.
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* xStart() and xEnd() are called to generate header and footer
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** information in the output. This is a no-op in the generic
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** implementation.
182 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
183 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void dbgStartEnd(MergeBuilder *p){ (void)p; }
184 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
185 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The next N lines of PIVOT are unchanged in both V1 and V2
186 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
187 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void dbgSame(MergeBuilder *p, unsigned int N){
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->pOut,
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,
189 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"COPY %u from BASELINE(%u..%u) or V1(%u..%u) or V2(%u..%u)\n",
190 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
N, p->lnPivot+1, p->lnPivot+N, p->lnV1+1, p->lnV1+N,
191 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnV2+1, p->lnV2+N);
192 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnPivot += N;
193 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnV1 += N;
@@ -233,11 +246,11 @@
233 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MergeBuilder *p,
234 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nPivot,
235 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nV1,
236 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nV2
237 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->pOut,
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,
239 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CONFLICT %u,%u,%u BASELINE(%u..%u) versus V1(%u..%u) versus V2(%u..%u)\n",
240 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPivot, nV1, nV2,
241 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnPivot+1, p->lnPivot+nPivot,
242 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnV1+1, p->lnV1+nV1,
243 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lnV2+1, p->lnV2+nV2);
@@ -323,11 +336,12 @@
323 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine attempts to resolve the conflict by looking at
324 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** elements of the conflict region that are finer grain than complete
325 338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lines of text.
326 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
327 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The result is written into Blob pOut. pOut is initialized by this
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** routine.
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine. Returns the result of passing the merge state to
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** merge_three_blobs().
329 343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
330 344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int merge_try_to_resolve_conflict(
331 345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MergeBuilder *pMB, /* MergeBuilder that encounter conflict */
332 346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nPivot, /* Lines of conflict in the pivot */
333 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int nV1, /* Lines of conflict in V1 */
@@ -630,11 +644,11 @@
630 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
631 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mx = nPivot;
632 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
633 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRes;
634 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob res;
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
636 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
merge_try_to_resolve_conflict(p, nPivot, nV1, nV2, &res);
637 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRes = blob_linecount(&res);
638 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nV1>mx ) mx = nV1;
639 653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nV2>mx ) mx = nV2;
640 654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRes>mx ) mx = nRes;
@@ -682,10 +696,67 @@
682 696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->xChngV1 = tclChngV1;
683 697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->xChngV2 = tclChngV2;
684 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->xChngBoth = tclChngBoth;
685 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->xConflict = tclConflict;
686 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xStart() */
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlStart(MergeBuilder *p){
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MergeBuilderHtml *pH = (MergeBuilderHtml*)p;
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i;
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: open HTML table */
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i = 0; i < sizeof(pH->aCol)/sizeof(Blob); ++i){
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&pH->aCol[i]);
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xEnd() */
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlEnd(MergeBuilder *p){
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MergeBuilderHtml *pH = (MergeBuilderHtml*)p;
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i;
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: flush pH->aCol to p->pOut and close HTML table */
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i = 0; i < sizeof(pH->aCol)/sizeof(Blob); ++i){
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&pH->aCol[i]);
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xSame() */
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlSame(MergeBuilder *p, unsigned int N){
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xChngV1() */
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlChngV1(MergeBuilder *p, unsigned int nPivot, unsigned int nV1){
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xChngV2() */
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlChngV2(MergeBuilder *p, unsigned int nPivot, unsigned int nV2){
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xChngBoth() */
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlChngBoth(MergeBuilder *p, unsigned int nPivot, unsigned int nV){
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MergeBuilderHtml::xConflict() */
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void htmlConflict(
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MergeBuilder *p,
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nPivot,
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nV1,
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nV2
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void mergebuilder_init_html(MergeBuilderHtml *pH){
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MergeBuilder *p = &pH->base;
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i;
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mergebuilder_init(p);
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xStart = htmlStart;
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = htmlEnd;
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSame = htmlSame;
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xChngV1 = htmlChngV1;
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xChngV2 = htmlChngV2;
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xChngBoth = htmlChngBoth;
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xConflict = htmlConflict;
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i = 0; i < sizeof(pH->aCol)/sizeof(Blob); ++i){
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pH->aCol[i] = empty_blob;
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
687 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*****************************************************************************/
688 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
689 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
690 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The aC[] array contains triples of integers. Within each triple, the
691 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** elements are:
@@ -744,11 +815,11 @@
744 815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to pV2.
745 816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
746 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The return is 0 upon complete success. If any input file is binary,
747 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** -1 is returned and pOut is unmodified. If there are merge
748 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** conflicts, the merge proceeds as best as it can and the number
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of conflicts is returns
820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of conflicts is returned.
750 821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
751 822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int merge_three_blobs(MergeBuilder *p){
752 823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aC1; /* Changes from pPivot to pV1 */
753 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aC2; /* Changes from pPivot to pV2 */
754 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i1, i2; /* Index into aC1[] and aC2[] */
@@ -848,11 +919,11 @@
848 919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
849 920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i1 = skip_conflict(aC1, i1, sz, &nV1);
850 921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i2 = skip_conflict(aC2, i2, sz, &nV2);
851 922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->xConflict(p, sz, nV1, nV2);
852 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
854 925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are finished with an edit triple, advance to the next
855 926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** triple.
856 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
857 928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i1<limit1 && aC1[i1]==0 && aC1[i1+1]==0 && aC1[i1+2]==0 ) i1+=3;
858 929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i2<limit2 && aC2[i2]==0 && aC2[i2+1]==0 && aC2[i2+2]==0 ) i2+=3;
859 930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!