@@ -42,12 +42,16 @@
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define DIFF_INVERT (((u64)0x02)<<32) /* Invert the diff (debug) */
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define DIFF_CONTEXT_EX (((u64)0x04)<<32) /* Use context even if zero */
44 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define DIFF_NOTTOOBIG (((u64)0x08)<<32) /* Only display if not too big */
45 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define DIFF_STRIP_EOLCR (((u64)0x10)<<32) /* Strip trailing CR */
46 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define DIFF_SLOW_SBS (((u64)0x20)<<32) /* Better but slower side-by-side */
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define DIFF_WEBPAGE (((u64)0x40)<<32) /* Complete webpage */
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define DIFF_BROWSER (((u64)0x80)<<32) /* The --browser option */
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_WEBPAGE (((u64)0x00040)<<32) /* Complete webpage */
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_BROWSER (((u64)0x00080)<<32) /* The --browser option */
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_JSON (((u64)0x00100)<<32) /* JSON output */
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_DEBUG (((u64)0x00200)<<32) /* Debugging diff output */
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_RAW (((u64)0x00400)<<32) /* Raw triples - for debugging */
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DIFF_TCL (((u64)0x00800)<<32) /* For the --tk option */
49 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
50 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
51 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These error messages are shared in multiple locations. They are defined
52 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** here for consistency.
53 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -95,10 +99,15 @@
95 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
96 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Length of a dline
97 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
98 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define LENGTH(X) ((X)->n)
99 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Number of diff chunks generated
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int nChunk = 0;
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
101 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A context for running a raw diff.
102 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
103 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The aEdit[] array describes the raw diff. Each triple of integers in
104 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** aEdit[] means:
@@ -273,13 +282,13 @@
273 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
274 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true if the regular expression *pRe matches any of the
275 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** N dlines
276 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
277 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int re_dline_match(
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ReCompiled *pRe, /* The regular expression to be matched */
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *aDLine, /* First of N DLines to compare against */
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int N /* Number of DLines to check */
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ReCompiled *pRe, /* The regular expression to be matched */
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *aDLine, /* First of N DLines to compare against */
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int N /* Number of DLines to check */
281 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
282 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( N-- ){
283 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( re_match(pRe, (const unsigned char *)aDLine->z, LENGTH(aDLine)) ){
284 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
285 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -292,41 +301,23 @@
292 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Append a single line of context-diff output to pOut.
293 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
294 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void appendDiffLine(
295 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pOut, /* Where to write the line of output */
296 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char cPrefix, /* One of " ", "+", or "-" */
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *pLine, /* The line to be output */
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int html, /* True if generating HTML. False for plain text */
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ReCompiled *pRe /* Colorize only if line matches this Regex */
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DLine *pLine /* The line to be output */
300 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, &cPrefix, 1);
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ){
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pRe && re_dline_match(pRe, pLine, 1)==0 ){
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cPrefix = ' ';
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( cPrefix=='+' ){
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "<span class=\"diffadd\">", -1);
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( cPrefix=='-' ){
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "<span class=\"diffrm\">", -1);
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- htmlize_to_blob(pOut, pLine->z, pLine->n);
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( cPrefix!=' ' ){
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "</span>", -1);
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, pLine->z, pLine->n);
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "\n", 1);
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, cPrefix);
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pOut, pLine->z, pLine->n);
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, '\n');
318 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
319 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
320 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
321 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add two line numbers to the beginning of an output line for a context
322 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** diff. One or the other of the two numbers might be zero, which means
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to leave that number field blank. The "html" parameter means to format
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the output for HTML.
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to leave that number field blank.
325 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void appendDiffLineno(Blob *pOut, int lnA, int lnB, int html){
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_append(pOut, "<span class=\"diffln\">", -1);
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void appendDiffLineno(Blob *pOut, int lnA, int lnB){
328 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( lnA>0 ){
329 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut, "%6d ", lnA);
330 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
331 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pOut, " ", 7);
332 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -333,21 +324,18 @@
333 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( lnB>0 ){
334 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut, "%6d ", lnB);
335 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
336 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pOut, " ", 8);
337 328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_append(pOut, "</span>", -1);
339 329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
340 330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
341 331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Given a raw diff p[] in which the p->aEdit[] array has been filled
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in, compute a context diff into pOut.
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Output a patch-style text diff.
344 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
345 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void contextDiff(
346 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DContext *p, /* The difference */
347 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pOut, /* Output a context diff to here */
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ReCompiled *pRe, /* Only show changes that match this regex */
349 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags /* Flags controlling the diff format */
350 338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
351 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DLine *A; /* Left side of the diff */
352 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DLine *B; /* Right side of the diff */
353 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int a = 0; /* Index of next line in A[] */
@@ -361,17 +349,14 @@
361 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int m; /* Number of lines to output */
362 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int skip; /* Number of lines to skip */
363 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int nChunk = 0; /* Number of diff chunks seen so far */
364 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nContext; /* Number of lines of context */
365 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int showLn; /* Show line numbers */
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int html; /* Render as HTML */
367 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int showDivider = 0; /* True to show the divider between diff blocks */
368 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
369 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nContext = diff_context_lines(diffFlags);
370 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
showLn = (diffFlags & DIFF_LINENO)!=0;
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- html = (diffFlags & DIFF_HTML)!=0;
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_append(pOut, "<pre class=\"udiff\">\n", -1);
373 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A = p->aFrom;
374 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
B = p->aTo;
375 360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
R = p->aEdit;
376 361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxr = p->nEdit;
377 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( mxr>2 && R[mxr-1]==0 && R[mxr-2]==0 ){ mxr -= 3; }
@@ -378,35 +363,10 @@
378 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(r=0; r<mxr; r += 3*nr){
379 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Figure out how many triples to show in a single block */
380 365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(nr=1; R[r+nr*3]>0 && R[r+nr*3]<nContext*2; nr++){}
381 366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* printf("r=%d nr=%d\n", r, nr); */
382 367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If there is a regex, skip this block (generate no diff output)
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** if the regex matches or does not match both insert and delete.
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Only display the block if one side matches but the other side does
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** not.
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pRe ){
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int hideBlock = 1;
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int xa = a, xb = b;
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; hideBlock && i<nr; i++){
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int c1, c2;
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xa += R[r+i*3];
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xb += R[r+i*3];
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- c1 = re_dline_match(pRe, &A[xa], R[r+i*3+1]);
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- c2 = re_dline_match(pRe, &B[xb], R[r+i*3+2]);
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- hideBlock = c1==c2;
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xa += R[r+i*3+1];
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xb += R[r+i*3+2];
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( hideBlock ){
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a = xa;
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- b = xb;
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
408 368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* For the current block comprising nr triples, figure out
409 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** how many lines of A and B are to be displayed
410 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
411 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( R[r]>nContext ){
412 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
na = nb = nContext;
@@ -438,60 +398,55 @@
438 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nChunk++;
439 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( showLn ){
440 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !showDivider ){
441 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Do not show a top divider */
442 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
showDivider = 1;
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( html ){
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(pOut, "<span class=\"diffhr\">%.80c</span>\n", '.');
445 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
446 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut, "%.80c\n", '.');
447 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_appendf(pOut, "<span id=\"chunk%d\"></span>", nChunk);
449 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_appendf(pOut, "<span class=\"diffln\">");
451 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
452 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* If the patch changes an empty file or results in an empty file,
453 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* the block header must use 0,0 as position indicator and not 1,0.
454 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* Otherwise, patch would be confused and may reject the diff.
455 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
456 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut,"@@ -%d,%d +%d,%d @@",
457 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
na ? a+skip+1 : a+skip, na,
458 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nb ? b+skip+1 : b+skip, nb);
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_appendf(pOut, "</span>");
460 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pOut, "\n", 1);
461 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
462 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
463 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the initial common area */
464 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += skip;
465 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += skip;
466 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r] - skip;
467 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1, html);
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appendDiffLine(pOut, ' ', &A[a+j], html, 0);
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1);
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appendDiffLine(pOut, ' ', &A[a+j]);
470 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
471 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += m;
472 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += m;
473 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
474 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the differences */
475 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nr; i++){
476 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+i*3+1];
477 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showLn ) appendDiffLineno(pOut, a+j+1, 0, html);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appendDiffLine(pOut, '-', &A[a+j], html, pRe);
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showLn ) appendDiffLineno(pOut, a+j+1, 0);
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appendDiffLine(pOut, '-', &A[a+j]);
480 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
481 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += m;
482 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+i*3+2];
483 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showLn ) appendDiffLineno(pOut, 0, b+j+1, html);
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appendDiffLine(pOut, '+', &B[b+j], html, pRe);
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showLn ) appendDiffLineno(pOut, 0, b+j+1);
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appendDiffLine(pOut, '+', &B[b+j]);
486 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
487 442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += m;
488 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i<nr-1 ){
489 444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+i*3+3];
490 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1, html);
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appendDiffLine(pOut, ' ', &A[a+j], html, 0);
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1);
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appendDiffLine(pOut, ' ', &A[a+j]);
493 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
494 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += m;
495 450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += m;
496 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
497 452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -499,181 +454,33 @@
499 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the final common area */
500 455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nr==i );
501 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+nr*3];
502 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m>nContext ) m = nContext;
503 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1, html);
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appendDiffLine(pOut, ' ', &A[a+j], html, 0);
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( html ) blob_append(pOut, "</pre>\n", -1);
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Status of a single output line
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct SbsLine SbsLine;
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct SbsLine {
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob *apCols[5]; /* Array of pointers to output columns */
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int width; /* Maximum width of a column in the output */
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned char escHtml; /* True to escape html characters */
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iStart; /* Write zStart prior to character iStart */
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zStart; /* A <span> tag */
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iEnd; /* Write </span> prior to character iEnd */
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iStart2; /* Write zStart2 prior to character iStart2 */
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zStart2; /* A <span> tag */
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iEnd2; /* Write </span> prior to character iEnd2 */
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ReCompiled *pRe; /* Only colorize matching lines, if not NULL */
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Column indices for SbsLine.apCols[]
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBS_LNA 0 /* Left line number */
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBS_TXTA 1 /* Left text */
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBS_MKR 2 /* Middle separator column */
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBS_LNB 3 /* Right line number */
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBS_TXTB 4 /* Right text */
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append newlines to all columns.
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteNewlines(SbsLine *p){
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for( i=p->escHtml ? SBS_LNA : SBS_TXTB; i<=SBS_TXTB; i++ ){
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(p->apCols[i], "\n", 1);
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append n spaces to the column.
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteSpace(SbsLine *p, int n, int col){
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->apCols[col], "%*s", n, "");
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Write the text of pLine into column iCol of p.
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If outputting HTML, write the full line. Otherwise, only write the
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** width characters. Translate tabs into spaces. Add newlines if col
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is SBS_TXTB. Translate HTML characters if escHtml is true. Pad the
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** rendering to width bytes if col is SBS_TXTA and escHtml is false.
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This comment contains multibyte unicode characters (ü, Æ, ð) in order
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to test the ability of the diff code to handle such characters.
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteText(SbsLine *p, DLine *pLine, int col){
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob *pCol = p->apCols[col];
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = pLine->n;
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i; /* Number of input characters consumed */
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int k; /* Cursor position */
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int needEndSpan = 0;
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zIn = pLine->z;
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int w = p->width;
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int colorize = p->escHtml;
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( colorize && p->pRe && re_dline_match(p->pRe, pLine, 1)==0 ){
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- colorize = 0;
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=k=0; (p->escHtml || k<w) && i<n; i++, k++){
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char c = zIn[i];
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( colorize ){
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i==p->iStart ){
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int x = strlen(p->zStart);
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, p->zStart, x);
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- needEndSpan = 1;
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->iStart2 ){
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = p->iStart2;
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = p->zStart2;
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = 0;
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( i==p->iEnd ){
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, "</span>", 7);
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- needEndSpan = 0;
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->iEnd2 ){
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = p->iEnd2;
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd2 = 0;
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( c=='\t' && !p->escHtml ){
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, " ", 1);
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (k&7)!=7 && (p->escHtml || k<w) ){
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, " ", 1);
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- k++;
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c=='\r' || c=='\f' ){
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, " ", 1);
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c=='<' && p->escHtml ){
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, "<", 4);
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c=='&' && p->escHtml ){
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, "&", 5);
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c=='>' && p->escHtml ){
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, ">", 4);
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c=='"' && p->escHtml ){
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, """, 6);
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, &zIn[i], 1);
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (c&0xc0)==0x80 ) k--;
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( needEndSpan ){
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pCol, "</span>", 7);
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( col==SBS_TXTB ){
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteNewlines(p);
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( !p->escHtml ){
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSpace(p, w-k, SBS_TXTA);
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append a column to the final output blob.
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteColumn(Blob *pOut, Blob *pCol, int col){
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(pOut,
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "<td><div class=\"diff%scol\">\n"
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "<pre>\n"
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "%s"
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "</pre>\n"
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "</div></td>\n",
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (col % 3) ? (col == SBS_MKR ? "mkr" : "txt") : "ln",
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_str(pCol)
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append a separator line to column iCol
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteSep(SbsLine *p, int len, int col){
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char ch = '.';
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( len<1 ){
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- len = 1;
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ch = ' ';
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->apCols[col], "<span class=\"diffhr\">%.*c</span>\n", len, ch);
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append the appropriate marker into the center column of the diff.
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteMarker(SbsLine *p, const char *zTxt, const char *zHtml){
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(p->apCols[SBS_MKR], p->escHtml ? zHtml : zTxt, -1);
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append a line number to the column.
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteLineno(SbsLine *p, int ln, int col){
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->escHtml ){
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->apCols[col], "%d", ln+1);
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zLn[7];
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(7, zLn, "%5d ", ln+1);
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(p->apCols[col], "%s ", zLn);
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showLn ) appendDiffLineno(pOut, a+j+1, b+j+1);
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appendDiffLine(pOut, ' ', &A[a+j]);
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define MX_CSN 8 /* Maximum number of change spans across a change region */
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A description of zero or more (up to MX_CSN) areas of difference
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between two lines of text.
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct LineChange LineChange;
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct LineChange {
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n; /* Number of change spans */
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Span {
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iStart1; /* Byte offset to start of a change on the left */
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLen1; /* Length of the left change in bytes */
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iStart2; /* Byte offset to start of a change on the right */
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLen2; /* Length of the change on the right in bytes */
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isMin; /* True if this change is known to have no useful subdivs */
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } a[MX_CSN]; /* Array of change spans, sorted order */
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
675 482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
676 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
677 484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The two text segments zLeft and zRight are known to be different on
678 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** both ends, but they might have a common segment in the middle. If
679 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** they do not have a common segment, return 0. If they do have a large
@@ -692,123 +499,177 @@
692 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zRight, int nB, /* String on the right */
693 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aLCS /* Identify bounds of LCS here */
694 501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
695 502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const unsigned char *zA = (const unsigned char*)zLeft; /* left string */
696 503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const unsigned char *zB = (const unsigned char*)zRight; /* right string */
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nt; /* Number of target points */
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ti[3]; /* Index for start of each 4-byte target */
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int target[3]; /* 4-byte alignment targets */
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int probe; /* probe to compare against target */
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iAS, iAE, iBS, iBE; /* Range of common segment */
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i, j; /* Loop counters */
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = 0; /* Result code. 1 for success */
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nA<6 || nB<6 ) return 0;
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aLCS, 0, sizeof(int)*4);
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ti[0] = i = nB/2-2;
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- target[0] = (zB[i]<<24) | (zB[i+1]<<16) | (zB[i+2]<<8) | zB[i+3];
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- probe = 0;
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nB<16 ){
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nt = 1;
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ti[1] = i = nB/4-2;
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- target[1] = (zB[i]<<24) | (zB[i+1]<<16) | (zB[i+2]<<8) | zB[i+3];
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ti[2] = i = (nB*3)/4-2;
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- target[2] = (zB[i]<<24) | (zB[i+1]<<16) | (zB[i+2]<<8) | zB[i+3];
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nt = 3;
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- probe = (zA[0]<<16) | (zA[1]<<8) | zA[2];
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=3; i<nA; i++){
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- probe = (probe<<8) | zA[i];
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; j<nt; j++){
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( probe==target[j] ){
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iAS = i-3;
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iAE = i+1;
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iBS = ti[j];
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iBE = ti[j]+4;
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( iAE<nA && iBE<nB && zA[iAE]==zB[iBE] ){ iAE++; iBE++; }
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( iAS>0 && iBS>0 && zA[iAS-1]==zB[iBS-1] ){ iAS--; iBS--; }
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iAE-iAS > aLCS[1] - aLCS[0] ){
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLCS[0] = iAS;
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLCS[1] = iAE;
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLCS[2] = iBS;
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLCS[3] = iBE;
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = 1;
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Try to shift iStart as far as possible to the left.
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsShiftLeft(SbsLine *p, const char *z){
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i, j;
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (i=p->iStart)>0 && z[i-1]==z[i] ){
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=i+1; j<p->iEnd && z[j-1]==z[j]; j++){}
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( j<p->iEnd ) break;
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart--;
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd--;
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
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!
- ** Simplify iStart and iStart2:
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * If iStart is a null-change then move iStart2 into iStart
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * Make sure any null-changes are in canonoical form.
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * Make sure all changes are at character boundaries for
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** multi-byte characters.
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsSimplifyLine(SbsLine *p, const char *z){
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->iStart2==p->iEnd2 ){
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = p->iEnd2 = 0;
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( p->iStart2 ){
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p->iStart2>0 && (z[p->iStart2]&0xc0)==0x80 ) p->iStart2--;
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (z[p->iEnd2]&0xc0)==0x80 ) p->iEnd2++;
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->iStart==p->iEnd ){
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = p->iStart2;
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = p->iEnd2;
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = p->zStart2;
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = 0;
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd2 = 0;
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->iStart==p->iEnd ){
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = p->iEnd = -1;
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( p->iStart>0 ){
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p->iStart>0 && (z[p->iStart]&0xc0)==0x80 ) p->iStart--;
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (z[p->iEnd]&0xc0)==0x80 ) p->iEnd++;
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Write out lines that have been edited. Adjust the highlight to cover
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** only those parts of the line that actually changed.
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsWriteLineChange(
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbsLine *p, /* The SBS output line */
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *pLeft, /* Left line of the change */
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int lnLeft, /* Line number for the left line */
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *pRight, /* Right line of the change */
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int lnRight /* Line number of the right line */
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j, k; /* Loop counters */
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int lenBest = 0; /* Match length to beat */
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nA-lenBest; i++){
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned char cA = zA[i];
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (cA&0xc0)==0x80 ) continue;
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<nB-lenBest; j++ ){
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zB[j]==cA ){
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(k=1; j+k<nB && i+k<nA && zB[j+k]==zA[i+k]; k++){}
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (zB[j+k]&0xc0)==0x80 ){ k--; }
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( k>lenBest ){
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lenBest = k;
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aLCS[0] = i;
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aLCS[1] = i+k;
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aLCS[2] = j;
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aLCS[3] = j+k;
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return lenBest>0;
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Find the smallest spans that are different between two text strings that
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are known to be different on both ends.
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int textLineChanges(
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zLeft, int nA, /* String on the left */
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zRight, int nB, /* String on the right */
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange *p /* Write results here */
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n = 1;
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = 0;
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen1 = nA;
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = 0;
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen2 = nB;
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].isMin = 0;
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p->n<MX_CSN-1 ){
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxi = -1;
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxLen = -1;
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int x, i;
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int aLCS[4];
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Span *a, *b;
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->n; i++){
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->a[i].isMin ) continue;
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = p->a[i].iLen1;
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->a[i].iLen2<x ) x = p->a[i].iLen2;
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x>mxLen ){
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxLen = x;
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxi = i;
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxLen<6 ) break;
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = textLCS(zLeft + p->a[mxi].iStart1, p->a[mxi].iLen1,
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zRight + p->a[mxi].iStart2, p->a[mxi].iLen2, aLCS);
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ){
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[mxi].isMin = 1;
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a = p->a+mxi;
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b = a+1;
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxi<p->n-1 ){
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memmove(b+1, b, sizeof(*b)*(p->n-mxi-1));
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n++;
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b->iStart1 = a->iStart1 + aLCS[1];
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b->iLen1 = a->iLen1 - aLCS[1];
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a->iLen1 = aLCS[0];
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b->iStart2 = a->iStart2 + aLCS[3];
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b->iLen2 = a->iLen2 - aLCS[3];
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a->iLen2 = aLCS[2];
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b->isMin = 0;
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p->n;
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if the string starts with n spaces
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int allSpaces(const char *z, int n){
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<n && fossil_isspace(z[i]); i++){}
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return i==n;
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Try to improve the human-readability of the LineChange p.
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (1) If the first change span shows a change of indentation, try to
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** move that indentation change to the left margin.
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (2) Try to shift changes so that they begin or end with a space.
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void improveReadability(
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zA, /* Left line of the change */
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zB, /* Right line of the change */
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange *p /* The LineChange to be adjusted */
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j, n, len;
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->n<1 ) return;
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* (1) Attempt to move indentation changes to the left margin */
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->a[0].iLen1==0
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (len = p->a[0].iLen2)>0
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (j = p->a[0].iStart2)>0
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && zB[0]==zB[j]
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && allSpaces(zB, j)
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(n=1; n<len && n<j && zB[j]==zB[j+n]; n++){}
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n<len ){
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memmove(&p->a[1], &p->a[0], sizeof(p->a[0])*p->n);
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n++;
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0] = p->a[1];
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[1].iStart2 += n;
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[1].iLen2 -= n;
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen2 = n;
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = 0;
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = 0;
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->a[0].iLen2==0
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (len = p->a[0].iLen1)>0
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (j = p->a[0].iStart1)>0
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && zA[0]==zA[j]
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && allSpaces(zA, j)
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(n=1; n<len && n<j && zA[j]==zA[j+n]; n++){}
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n<len ){
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memmove(&p->a[1], &p->a[0], sizeof(p->a[0])*p->n);
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n++;
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0] = p->a[1];
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[1].iStart1 += n;
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[1].iLen1 -= n;
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen1 = n;
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = 0;
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = 0;
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* (2) Try to shift changes so that they begin or end with a
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** space. (TBD) */
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Given two lines of text, pFrom and pTo, compute a set of changes
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between those two lines, for enhanced display purposes.
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The result is written into the LineChange object given by the
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** third parameter.
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void oneLineChange(
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *pLeft, /* Left line of the change */
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *pRight, /* Right line of the change */
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange *p /* OUTPUT: Write the results here */
796 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
797 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLeft; /* Length of left line in bytes */
798 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRight; /* Length of right line in bytes */
799 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nShort; /* Shortest of left and right */
800 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPrefix; /* Length of common prefix */
801 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSuffix; /* Length of common suffix */
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nCommon; /* Total byte length of suffix and prefix */
802 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zLeft; /* Text of the left line */
803 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zRight; /* Text of the right line */
804 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLeftDiff; /* nLeft - nPrefix - nSuffix */
805 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRightDiff; /* nRight - nPrefix - nSuffix */
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int aLCS[4]; /* Bounds of common middle segment */
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char zClassRm[] = "<span class=\"diffrm\">";
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char zClassAdd[] = "<span class=\"diffadd\">";
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char zClassChng[] = "<span class=\"diffchng\">";
810 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
811 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nLeft = pLeft->n;
812 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zLeft = pLeft->z;
813 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRight = pRight->n;
814 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zRight = pRight->z;
@@ -821,25 +682,27 @@
821 682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPrefix<nShort ){
822 683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( nPrefix>0 && (zLeft[nPrefix]&0xc0)==0x80 ) nPrefix--;
823 684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
824 685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nSuffix = 0;
825 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPrefix<nShort ){
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( nSuffix<nShort && zLeft[nLeft-nSuffix-1]==zRight[nRight-nSuffix-1] ){
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( nSuffix<nShort
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && zLeft[nLeft-nSuffix-1]==zRight[nRight-nSuffix-1] ){
827 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nSuffix++;
828 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
829 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nSuffix<nShort ){
830 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( nSuffix>0 && (zLeft[nLeft-nSuffix]&0xc0)==0x80 ) nSuffix--;
831 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
832 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nSuffix==nLeft || nSuffix==nRight ) nPrefix = 0;
833 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCommon = nPrefix + nSuffix;
834 697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
835 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the prefix and suffix overlap, that means that we are dealing with
836 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a pure insertion or deletion of text that can have multiple alignments.
837 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Try to find an alignment to begins and ends on whitespace, or on
838 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** punctuation, rather than in the middle of a name or number.
839 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nPrefix+nSuffix > nShort ){
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCommon > nShort ){
841 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iBest = -1;
842 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iBestVal = -1;
843 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
844 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLong = nLeft<nRight ? nRight : nLeft;
845 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nGap = nLong - nShort;
@@ -862,108 +725,931 @@
862 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iBest = i;
863 726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
864 727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
865 728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPrefix = iBest;
866 729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nSuffix = nShort - nPrefix;
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* A single chunk of text inserted on the right */
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nPrefix+nSuffix==nLeft ){
871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnLeft, SBS_LNA);
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = p->iEnd2 = 0;
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = p->iEnd = -1;
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pLeft, SBS_TXTA);
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nLeft==nRight && zLeft[nLeft]==zRight[nRight] ){
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(p, " ", "");
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(p, " | ", "|");
879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnRight, SBS_LNB);
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = nPrefix;
882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nRight - nSuffix;
883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassAdd;
884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pRight, SBS_TXTB);
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCommon = nPrefix + nSuffix;
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A single chunk of text inserted */
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCommon==nLeft ){
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n = 1;
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = nPrefix;
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen1 = 0;
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = nPrefix;
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen2 = nRight - nCommon;
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ improveReadability(zLeft, zRight, p);
885 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
886 742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
887 743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* A single chunk of text deleted from the left */
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nPrefix+nSuffix==nRight ){
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Text deleted from the left */
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnLeft, SBS_LNA);
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = p->iEnd2 = 0;
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = nPrefix;
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nLeft - nSuffix;
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassRm;
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pLeft, SBS_TXTA);
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(p, " | ", "|");
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnRight, SBS_LNB);
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = p->iEnd = -1;
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pRight, SBS_TXTB);
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A single chunk of text deleted */
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCommon==nRight ){
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n = 1;
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = nPrefix;
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen1 = nLeft - nCommon;
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = nPrefix;
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen2 = 0;
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ improveReadability(zLeft, zRight, p);
901 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
902 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
903 754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
904 755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* At this point we know that there is a chunk of text that has
905 756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** changed between the left and the right. Check to see if there
906 757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is a large unchanged section in the middle of that changed block.
907 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nLeftDiff = nLeft - nSuffix - nPrefix;
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRightDiff = nRight - nSuffix - nPrefix;
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->escHtml
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && nLeftDiff >= 6
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && nRightDiff >= 6
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && textLCS(&zLeft[nPrefix], nLeftDiff, &zRight[nPrefix], nRightDiff, aLCS)
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLeftDiff = nLeft - nCommon;
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRightDiff = nRight - nCommon;
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLeftDiff >= 4
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && nRightDiff >= 4
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && textLineChanges(&zLeft[nPrefix], nLeftDiff,
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &zRight[nPrefix], nRightDiff, p)>1
914 765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnLeft, SBS_LNA);
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = nPrefix;
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nPrefix + aLCS[0];
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aLCS[2]==0 ){
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsShiftLeft(p, pLeft->z);
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassRm;
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassChng;
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = nPrefix + aLCS[1];
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd2 = nLeft - nSuffix;
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart2 = aLCS[3]==nRightDiff ? zClassRm : zClassChng;
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsSimplifyLine(p, zLeft);
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pLeft, SBS_TXTA);
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(p, " | ", "|");
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnRight, SBS_LNB);
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = nPrefix;
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nPrefix + aLCS[2];
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aLCS[0]==0 ){
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsShiftLeft(p, pRight->z);
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassAdd;
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassChng;
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = nPrefix + aLCS[3];
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd2 = nRight - nSuffix;
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart2 = aLCS[1]==nLeftDiff ? zClassAdd : zClassChng;
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsSimplifyLine(p, zRight);
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pRight, SBS_TXTB);
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->n; i++){
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[i].iStart1 += nPrefix;
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[i].iStart2 += nPrefix;
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ improveReadability(zLeft, zRight, p);
944 772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
945 773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
946 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
947 775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If all else fails, show a single big change between left and right */
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnLeft, SBS_LNA);
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart2 = p->iEnd2 = 0;
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iStart = nPrefix;
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nLeft - nSuffix;
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zStart = zClassChng;
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pLeft, SBS_TXTA);
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(p, " | ", "|");
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(p, lnRight, SBS_LNB);
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iEnd = nRight - nSuffix;
957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(p, pRight, SBS_TXTB);
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->n = 1;
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart1 = nPrefix;
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen1 = nLeft - nCommon;
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iStart2 = nPrefix;
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a[0].iLen2 = nRight - nCommon;
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ improveReadability(zLeft, zRight, p);
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-line-diff
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil% test-line-diff STRING1 STRING2
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Show the differences between the two strings. Used for testing
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the oneLineChange() routine in the diff logic.
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_line_diff(void){
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DLine a, b;
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j, x;
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=4 ) usage("STRING1 STRING2");
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.z = g.argv[2];
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.n = (int)strlen(a.z);
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.z = g.argv[3];
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.n = (int)strlen(b.z);
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(&a, &b, &chng);
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("left: [%s]\n", a.z);
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart1;
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen1;
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ){ fossil_print("%*s", 8, ""); }
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ofst > x ){
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (a.z[x]&0xc0)!=0x80 ) fossil_print(" ");
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x++;
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<len; j++, x++){
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (a.z[x]&0xc0)!=0x80 ) fossil_print("%d",i);
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x ) fossil_print("\n");
817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("right: [%s]\n", b.z);
818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart2;
820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen2;
821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ){ fossil_print("%*s", 8, ""); }
823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ofst > x ){
824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (b.z[x]&0xc0)!=0x80 ) fossil_print(" ");
825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x++;
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<len; j++, x++){
828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (b.z[x]&0xc0)!=0x80 ) fossil_print("%d",i);
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x ) fossil_print("\n");
958 833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
959 834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
960 835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
961 836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Minimum of two values
962 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
963 838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int minInt(int a, int b){ return a<b ? a : b; }
964 839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is an abstract superclass for an object that accepts difference
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lines and formats them for display. Subclasses of this object format
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the diff output in different ways.
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To subclass, create an instance of the DiffBuilder object and fill
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in appropriate method implementations.
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct DiffBuilder DiffBuilder;
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct DiffBuilder {
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xSkip)(DiffBuilder*, unsigned int, int);
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xCommon)(DiffBuilder*,const DLine*);
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xInsert)(DiffBuilder*,const DLine*);
855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xDelete)(DiffBuilder*,const DLine*);
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xReplace)(DiffBuilder*,const DLine*, const DLine*);
857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xEdit)(DiffBuilder*,const DLine*,const DLine*);
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xEnd)(DiffBuilder*);
859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int lnLeft; /* Lines seen on the left (delete) side */
860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int lnRight; /* Lines seen on the right (insert) side */
861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nPending; /* Number of pending lines */
862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eState; /* State of the output */
863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int width; /* Display width */
864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *pOut; /* Output blob */
865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob aCol[5]; /* Holding blobs */
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderDebug ********************************/
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This version of DiffBuilder is used for debugging the diff and diff
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** diff formatter logic. It is accessed using the (undocumented) --debug
871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** option to the diff command. The output is human-readable text that
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** describes the various method calls that are invoked agains the DiffBuilder
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** object.
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugSkip(DiffBuilder *p, unsigned int n, int isFinal){
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "SKIP %d (%d..%d left and %d..%d right)%s\n",
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n, p->lnLeft+1, p->lnLeft+n, p->lnRight+1, p->lnRight+n,
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isFinal ? " FINAL" : "");
879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft += n;
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight += n;
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugCommon(DiffBuilder *p, const DLine *pLine){
883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "COMMON %8u %8u %.*s\n",
886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft, p->lnRight, (int)pLine->n, pLine->z);
887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugInsert(DiffBuilder *p, const DLine *pLine){
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "INSERT %8d %.*s\n",
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight, (int)pLine->n, pLine->z);
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugDelete(DiffBuilder *p, const DLine *pLine){
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "DELETE %8u %.*s\n",
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft, (int)pLine->n, pLine->z);
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "REPLACE %8u %.*s\n",
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft, (int)pX->n, pX->z);
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, " %8u %.*s\n",
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight, (int)pY->n, pY->z);
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j;
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int x;
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "EDIT %8u %.*s\n",
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft, (int)pX->n, pX->z);
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(pX, pY, &chng);
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart1;
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen1;
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); }
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ofst > x ){
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' ');
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x++;
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<len; j++, x++){
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^');
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x ) blob_append_char(p->pOut, '\n');
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, " %8u %.*s\n",
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight, (int)pY->n, pY->z);
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart2;
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen2;
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); }
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ofst > x ){
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' ');
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x++;
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<len; j++, x++){
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^');
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x ) blob_append_char(p->pOut, '\n');
947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfdebugEnd(DiffBuilder *p){
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "END with %u lines left and %u lines right\n",
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft, p->lnRight);
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dfdebugNew(Blob *pOut){
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dfdebugSkip;
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dfdebugCommon;
957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dfdebugInsert;
958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dfdebugDelete;
959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dfdebugReplace;
960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dfdebugEdit;
961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dfdebugEnd;
962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft = p->lnRight = 0;
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderTcl ********************************/
968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This formatter outputs a description of the diff formatted as TCL, for
970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use by the --tk option to "diff". See also the "diff.tcl" file. The
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** output can be viewed directly using the --tcl option.
972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There is one line per method call:
974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SKIP n -- Skip "n" lines of input
976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COM string -- "string" is an unchanged context line
977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** INS string -- "string" is in the right file only
978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** DEL string -- "string" is in the left file only
979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** EDIT string .... -- Complex edit between left and right
980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The EDIT verb will be followed by 3*N or 3*N+1 strings. The triples
982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** each show:
983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. Common text
985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. Text from the left side
986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. Text on the right that replaces (2) from the left
987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For inserted text (2) will be an empty string. For deleted text, (3)
989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be an empty string. (1) might be empty for the first triple if
990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the line begins with an edit. After all triples, there might be one
991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** additional string which is a common suffix.
992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclSkip(DiffBuilder *p, unsigned int n, int isFinal){
994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "SKIP %u\n", n);
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclCommon(DiffBuilder *p, const DLine *pLine){
997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "COM ");
998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclInsert(DiffBuilder *p, const DLine *pLine){
1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "INS ", -1);
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclDelete(DiffBuilder *p, const DLine *pLine){
1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "DEL ", -1);
1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "EDIT \"\" ", -1);
1013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pX->z, pX->n);
1014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ' ');
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pY->z, pY->n);
1016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, x;
1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "EDIT", 4);
1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(pX, pY, &chng);
1023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ' ');
1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pX->z + x, chng.a[i].iStart1 - x);
1026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = chng.a[i].iStart1;
1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ' ');
1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pX->z + x, chng.a[i].iLen1);
1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += chng.a[i].iLen1;
1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ' ');
1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut,
1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pY->z + chng.a[i].iStart2, chng.a[i].iLen2);
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x<pX->n ){
1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ' ');
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_tcl_literal(p->pOut, pX->z + x, pX->n - x);
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dftclEnd(DiffBuilder *p){
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dftclNew(Blob *pOut){
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dftclSkip;
1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dftclCommon;
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dftclInsert;
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dftclDelete;
1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dftclReplace;
1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dftclEdit;
1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dftclEnd;
1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderJson ********************************/
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This formatter generates a JSON array that describes the difference.
1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The Json array consists of integer opcodes with each opcode followed
1061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by zero or more arguments:
1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Syntax Mnemonic Description
1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ----------- -------- --------------------------
1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0 END This is the end of the diff
1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1 INTEGER SKIP Skip N lines from both files
1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2 STRING COMMON The line show by STRING is in both files
1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3 STRING INSERT The line STRING is in only the right file
1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4 STRING DELETE The STRING line is in only the left file
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 5 SUBARRAY EDIT One line is different on left and right.
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The SUBARRAY is an array of 3*N+1 strings with N>=0. The triples
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** represent common-text, left-text, and right-text. The last string
1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in SUBARRAY is the common-suffix. Any string can be empty if it does
1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not apply.
1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonSkip(DiffBuilder *p, unsigned int n, int isFinal){
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "1,%u,\n", n);
1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonCommon(DiffBuilder *p, const DLine *pLine){
1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "2,",2);
1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, ",\n",2);
1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonInsert(DiffBuilder *p, const DLine *pLine){
1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "3,",2);
1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, ",\n",2);
1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonDelete(DiffBuilder *p, const DLine *pLine){
1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "4,",2);
1092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, ",\n",2);
1094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "5,[\"\",",-1);
1097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pX->z, (int)pX->n);
1098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, ",",1);
1099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pY->z, (int)pY->n);
1100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, ",\"\"],\n",-1);
1101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, x;
1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "5,[", 3);
1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(pX, pY, &chng);
1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pX->z + x, chng.a[i].iStart1 - x);
1109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = chng.a[i].iStart1;
1110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ',');
1111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pX->z + x, chng.a[i].iLen1);
1112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += chng.a[i].iLen1;
1113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ',');
1114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut,
1115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pY->z + chng.a[i].iStart2, chng.a[i].iLen2);
1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, ',');
1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_json_literal(p->pOut, pX->z + x, pX->n - x);
1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "],\n",3);
1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfjsonEnd(DiffBuilder *p){
1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "0]", 2);
1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dfjsonNew(Blob *pOut){
1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dfjsonSkip;
1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dfjsonCommon;
1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dfjsonInsert;
1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dfjsonDelete;
1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dfjsonReplace;
1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dfjsonEdit;
1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dfjsonEnd;
1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft = p->lnRight = 0;
1135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, '[');
1137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
1138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderUnified********************************/
1141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This formatter generates a unified diff for HTML.
1142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The result is a <table> with four columns. The four columns hold:
1144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. The line numbers for the first file.
1146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. The line numbers for the second file.
1147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. The "diff mark": "+" or "-" or just a space
1148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4. Text of the line
1149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Inserted lines are marked with <ins> and deleted lines are marked
1151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with <del>. The whole line is marked this way, not just the part that
1152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** changed. The part that change has an additional nested <ins> or <del>.
1153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The CSS needs to be set up such that a single <ins> or <del> gives a
1154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** light background and a nested <ins> or <del> gives a darker background.
1155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Additional attributes (like bold font) might also be added to nested
1156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <ins> and <del> since those are the characters that have actually
1157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** changed.
1158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Accumulator strategy:
1160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Delete line numbers are output directly to p->pOut
1162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Insert line numbers accumulate in p->aCol[0].
1163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Separator marks accumulate in p->aCol[1].
1164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Change text accumulates in p->aCol[2].
1165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Pending insert line numbers go into p->aCol[3].
1166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Pending insert text goes into p->aCol[4].
1167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** eState is 1 if text has an open <del>
1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedFinishDelete(DiffBuilder *p){
1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->eState==0 ) return;
1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</del>", 6);
1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "</del>", 6);
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 0;
1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedFinishInsert(DiffBuilder *p){
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i;
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nPending==0 ) return;
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishDelete(p);
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Blank lines for delete line numbers for each inserted line */
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nPending; i++) blob_append_char(p->pOut, '\n');
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Insert line numbers */
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "<ins>", 5);
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(&p->aCol[0], &p->aCol[3]);
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "</ins>", 6);
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* "+" marks for the separator on inserted lines */
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nPending; i++) blob_append(&p->aCol[1], "+\n", 2);
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Text of the inserted lines */
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<ins>", 5);
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(&p->aCol[2], &p->aCol[4]);
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "</ins>", 6);
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending = 0;
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedFinishRow(DiffBuilder *p){
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishDelete(p);
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&p->aCol[0])==0 ) return;
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"diffln difflnr\"><pre>\n", -1);
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[0]);
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"diffsep\"><pre>\n", -1);
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[1]);
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtu\"><pre>\n",-1);
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[2]);
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td></tr>\n", -1);
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedStartRow(DiffBuilder *p){
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&p->aCol[0])>0 ) return;
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"<tr id=\"chunk%d\">"
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<td class=\"diffln difflnl\"><pre>\n", ++nChunk);
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 0;
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending = 0;
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishRow(p);
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "<tr><td class=\"diffln difflne\">"
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "︙</td><td></td><td></td></tr>\n", -1);
1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft += n;
1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight += n;
1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedCommon(DiffBuilder *p, const DLine *pLine){
1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedStartRow(p);
1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishDelete(p);
1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[0],"%d\n",p->lnRight);
1233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[1], '\n');
1234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pLine->z, (int)pLine->n);
1235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[2], '\n');
1236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedInsert(DiffBuilder *p, const DLine *pLine){
1238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedStartRow(p);
1239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[3],"%d\n", p->lnRight);
1241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[4], "<ins>", 5);
1242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[4], pLine->z, (int)pLine->n);
1243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[4], "</ins>\n", 7);
1244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending++;
1245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedDelete(DiffBuilder *p, const DLine *pLine){
1247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedStartRow(p);
1248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->eState==0 ){
1250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "<del>", 5);
1252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<del>", 5);
1253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 1;
1254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0],'\n');
1258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1],"-\n",2);
1259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<del>", 5);
1260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pLine->z, (int)pLine->n);
1261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "</del>\n", 7);
1262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedStartRow(p);
1265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->eState==0 ){
1266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "<del>", 5);
1268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<del>", 5);
1269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 1;
1270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], "-\n", 2);
1276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pX->z, pX->n);
1278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[2], '\n');
1279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[3],"%d\n", p->lnRight);
1281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[4], pY->z, pY->n);
1283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[4], '\n');
1284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending++;
1285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int x;
1289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
1290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(pX, pY, &chng);
1291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedStartRow(p);
1292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->eState==0 ){
1293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishInsert(p);
1294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "<del>", 5);
1295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<del>", 5);
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 1;
1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], "-\n", 2);
1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart1;
1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen1;
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pX->z+x, ofst - x);
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = ofst;
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<del>", 5);
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pX->z+x, len);
1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += len;
1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "</del>", 6);
1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[2], pX->z+x, pX->n - x);
1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[2], '\n');
1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[3],"%d\n", p->lnRight);
1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart2;
1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen2;
1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[4], pY->z+x, ofst - x);
1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = ofst;
1326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[4], "<ins>", 5);
1327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[4], pY->z+x, len);
1328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += len;
1329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[4], "</ins>", 6);
1330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[4], pY->z+x, pY->n - x);
1333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[4], '\n');
1334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending++;
1335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfunifiedEnd(DiffBuilder *p){
1337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfunifiedFinishRow(p);
1338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</table>\n",-1);
1339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
1340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dfunifiedNew(Blob *pOut){
1342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
1343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dfunifiedSkip;
1344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dfunifiedCommon;
1345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dfunifiedInsert;
1346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dfunifiedDelete;
1347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dfunifiedReplace;
1348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dfunifiedEdit;
1349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dfunifiedEnd;
1350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft = p->lnRight = 0;
1351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 0;
1352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPending = 0;
1353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
1354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pOut, "<table class=\"diff udiff\">\n", -1);
1355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[0], 0, 0);
1356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[1], 0, 0);
1357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[2], 0, 0);
1358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[3], 0, 0);
1359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[4], 0, 0);
1360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
1361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderSplit ******************************/
1364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This formatter creates a side-by-side diff in HTML. The output is a
1365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <table> with 5 columns:
1366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. Line numbers for the first file.
1368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. Text for the first file.
1369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. The difference mark. "<", ">", "|" or blank
1370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4. Line numbers for the second file.
1371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 5. Text for the second file.
1372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The <ins> and <del> strategy is the same as for unified diff above.
1374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In fact, the same CSS can be used for both.
1375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Accumulator strategy:
1377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Left line numbers are output directly to p->pOut
1379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Left text accumulates in p->aCol[0].
1380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Edit marks accumulates in p->aCol[1].
1381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Right line numbers accumulate in p->aCol[2].
1382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Right text accumulates in p->aCol[3].
1383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** eState:
1385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0 In common block
1386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1 Have <del> on the left
1387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2 Have <ins> on the right
1388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3 Have <del> on left and <ins> on the right
1389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitChangeState(DiffBuilder *p, int newState){
1391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->eState == newState ) return;
1392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (p->eState&1)==0 && (newState & 1)!=0 ){
1393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "<del>", 5);
1394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "<del>", 5);
1395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState |= 1;
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( (p->eState&1)!=0 && (newState & 1)==0 ){
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</del>", 6);
1398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "</del>", 6);
1399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState &= ~1;
1400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (p->eState&2)==0 && (newState & 2)!=0 ){
1402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "<ins>", 5);
1403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "<ins>", 5);
1404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState |= 2;
1405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( (p->eState&2)!=0 && (newState & 2)==0 ){
1406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[2], "</ins>", 6);
1407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "</ins>", 6);
1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState &= ~2;
1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitFinishRow(DiffBuilder *p){
1412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&p->aCol[0])==0 ) return;
1413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 0);
1414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtl\"><pre>\n",-1);
1415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[0]);
1416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"diffsep\"><pre>\n", -1);
1417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[1]);
1418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"diffln difflnr\"><pre>\n",-1);
1419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[2]);
1420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtr\"><pre>\n",-1);
1421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_xfer(p->pOut, &p->aCol[3]);
1422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</pre></td></tr>\n", -1);
1423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitStartRow(DiffBuilder *p){
1425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&p->aCol[0])>0 ) return;
1426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"<tr id=\"chunk%d\">"
1427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<td class=\"diffln difflnl\"><pre>\n", ++nChunk);
1428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 0;
1429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitSkip(DiffBuilder *p, unsigned int n, int isFinal){
1431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitFinishRow(p);
1432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut,
1433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<tr><td class=\"diffln difflnl difflne\">︙</td>"
1434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<td></td><td></td>"
1435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<td class=\"diffln difflnr difflne\">︙</td>"
1436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "<td/td></tr>\n", -1);
1437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft += n;
1438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight += n;
1439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitCommon(DiffBuilder *p, const DLine *pLine){
1441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitStartRow(p);
1442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 0);
1443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n);
1447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[1], '\n');
1449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[2],"%d\n",p->lnRight);
1450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n);
1451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[3], '\n');
1452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitInsert(DiffBuilder *p, const DLine *pLine){
1454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitStartRow(p);
1455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 2);
1456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], ">\n", -1);
1460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
1461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "<ins>", 5);
1462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n);
1463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "</ins>\n", 7);
1464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitDelete(DiffBuilder *p, const DLine *pLine){
1466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitStartRow(p);
1467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 1);
1468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "<del>", 5);
1471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n);
1472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "</del>\n", 7);
1473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], "<\n", -1);
1474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[2],'\n');
1475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[3],'\n');
1476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitStartRow(p);
1479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 3);
1480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pX->z, pX->n);
1484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], "|\n", 2);
1487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
1489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pY->z, pY->n);
1491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[3], '\n');
1492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int x;
1496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LineChange chng;
1497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oneLineChange(pX, pY, &chng);
1498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitStartRow(p);
1499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitChangeState(p, 3);
1500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
1503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart1;
1505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen1;
1506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
1507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pX->z+x, ofst - x);
1508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = ofst;
1509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( chng.a[i].iLen2 ){
1510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "<del class='edit'>", -1);
1511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "<del>", 5);
1513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pX->z+x, len);
1515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += len;
1516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[0], "</del>", 6);
1517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[0], pX->z+x, pX->n - x);
1520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[0], '\n');
1521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[1], "|\n", 2);
1523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
1525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=x=0; i<chng.n; i++){
1526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst = chng.a[i].iStart2;
1527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int len = chng.a[i].iLen2;
1528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
1529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pY->z+x, ofst - x);
1530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = ofst;
1531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( chng.a[i].iLen1 ){
1532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "<ins class='edit'>", -1);
1533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "<ins>", 5);
1535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pY->z+x, len);
1537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x += len;
1538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&p->aCol[3], "</ins>", 6);
1539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ htmlize_to_blob(&p->aCol[3], pY->z+x, pY->n - x);
1542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&p->aCol[3], '\n');
1543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsplitEnd(DiffBuilder *p){
1545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dfsplitFinishRow(p);
1546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut, "</table>\n",-1);
1547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
1548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dfsplitNew(Blob *pOut){
1550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
1551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dfsplitSkip;
1552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dfsplitCommon;
1553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dfsplitInsert;
1554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dfsplitDelete;
1555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dfsplitReplace;
1556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dfsplitEdit;
1557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dfsplitEnd;
1558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft = p->lnRight = 0;
1559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eState = 0;
1560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
1561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pOut, "<table class=\"diff splitdiff\">\n", -1);
1562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[0], 0, 0);
1563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[1], 0, 0);
1564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[2], 0, 0);
1565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[3], 0, 0);
1566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&p->aCol[4], 0, 0);
1567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
1568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************************* DiffBuilderSbs ******************************/
1571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This formatter creates a side-by-side diff in text.
1572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsSkip(DiffBuilder *p, unsigned int n, int isFinal){
1574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (p->lnLeft || p->lnRight) && !isFinal ){
1575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, "%.*c\n", p->width*2 + 16, '.');
1576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft += n;
1578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight += n;
1579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Append at least iMin characters (not bytes) and at most iMax characters
1583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from pX onto the into of p.
1584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This comment contains multibyte unicode characters (ü, Æ, ð) in order
1586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to test the ability of the diff code to handle such characters.
1587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void sbs_append_chars(Blob *p, int iMin, int iMax, const DLine *pX){
1589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *z = pX->z;
1591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<iMax && i<pX->n; i++){
1592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c = z[i];
1593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p, c);
1594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (c&0xc0)==0x80 ){ iMin++; iMax++; }
1595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<iMin ){
1597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p, ' ');
1598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
1599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsCommon(DiffBuilder *p, const DLine *pLine){
1603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%6u ", p->lnLeft);
1606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, p->width, p->width, pLine);
1607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut," %6u ", p->lnRight);
1608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, 0, p->width, pLine);
1609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsInsert(DiffBuilder *p, const DLine *pLine){
1612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%6s %*s > %6u ",
1614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "", p->width, "", p->lnRight);
1615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, 0, p->width, pLine);
1616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsDelete(DiffBuilder *p, const DLine *pLine){
1619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%6u ", p->lnLeft);
1621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, p->width, p->width, pLine);
1622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(p->pOut," <\n", 3);
1623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft++;
1626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnRight++;
1627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut,"%6u ", p->lnLeft);
1628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, p->width, p->width, pX);
1629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(p->pOut, " | %6u ", p->lnRight);
1630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sbs_append_chars(p->pOut, 0, p->width, pY);
1631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(p->pOut, '\n');
1632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void dfsbsEnd(DiffBuilder *p){
1634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(p);
1635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static DiffBuilder *dfsbsNew(Blob *pOut, u64 diffFlags){
1637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
1638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xSkip = dfsbsSkip;
1639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xCommon = dfsbsCommon;
1640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xInsert = dfsbsInsert;
1641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xDelete = dfsbsDelete;
1642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xReplace = dfsbsEdit;
1643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEdit = dfsbsEdit;
1644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->xEnd = dfsbsEnd;
1645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->lnLeft = p->lnRight = 0;
1646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->width = diff_width(diffFlags);
1647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pOut = pOut;
1648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
1649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /****************************************************************************/
965 1651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
966 1652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the number between 0 and 100 that is smaller the closer pA and
967 1653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pB match. Return 0 for a perfect match. Return 100 if pA and pB are
968 1654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** completely different.
969 1655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -972,11 +1658,11 @@
972 1658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) Remove leading and trailing whitespace.
973 1659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) Truncate both strings to at most 250 characters
974 1660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) Find the length of the longest common subsequence
975 1661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (4) Longer common subsequences yield lower scores.
976 1662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int match_dline(DLine *pA, DLine *pB){
1663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int match_dline(const DLine *pA, const DLine *pB){
978 1664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zA; /* Left string */
979 1665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zB; /* right string */
980 1666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nA; /* Bytes in zA[] */
981 1667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nB; /* Bytes in zB[] */
982 1668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int avg; /* Average length of A and B */
@@ -1024,10 +1710,32 @@
1024 1710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
1025 1711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1026 1712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Return the result */
1027 1713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return score;
1028 1714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-line-match
1718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-line-match STRING1 STRING2
1719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return a score from 0 to 100 that is how similar STRING1 is to
1721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** STRING2. Smaller numbers mean more similar. 0 is an exact match.
1722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This command is used to test to match_dline() function in the
1724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** internal Fossil diff logic.
1725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_dline_match(void){
1727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DLine a, b;
1728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int x;
1729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=4 ) usage("STRING1 STRING2");
1730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.z = g.argv[2];
1731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.n = (int)strlen(a.z);
1732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.z = g.argv[3];
1733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.n = (int)strlen(b.z);
1734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = match_dline(&a, &b);
1735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%d\n", x);
1736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1029 1737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1030 1738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1031 1739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** There is a change block in which nLeft lines of text on the left are
1032 1740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** converted into nRight lines of text on the right. This routine computes
1033 1741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** how the lines on the left line up with the lines on the right.
@@ -1039,61 +1747,113 @@
1039 1747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 1. Delete the next line of pLeft.
1040 1748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2. Insert the next line of pRight.
1041 1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 3. The next line of pLeft changes into the next line of pRight.
1042 1750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 4. Delete one line from pLeft and add one line to pRight.
1043 1751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Values larger than three indicate better matches.
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The length of the returned array will be just large enough to cause
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** all elements of pLeft and pRight to be consumed.
1752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The length of the returned array will be at most nLeft+nRight bytes.
1753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the first bytes is 4, that means we could not compute reasonable
1754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** alignment between the two blocks.
1048 1755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1049 1756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Algorithm: Wagner's minimum edit-distance algorithm, modified by
1050 1757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** adding a cost to each match based on how well the two rows match
1051 1758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** each other. Insertion and deletion costs are 50. Match costs
1052 1759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** are between 0 and 100 where 0 is a perfect match 100 is a complete
1053 1760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** mismatch.
1054 1761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static unsigned char *sbsAlignment(
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *aLeft, int nLeft, /* Text on the left */
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *aRight, int nRight, /* Text on the right */
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u64 diffFlags /* Flags passed into the original diff */
1762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static unsigned char *diffBlockAlignment(
1763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *aLeft, int nLeft, /* Text on the left */
1764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *aRight, int nRight, /* Text on the right */
1765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u64 diffFlags, /* Flags passed into the original diff */
1766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pNResult /* OUTPUT: Bytes of result */
1059 1767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1060 1768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j, k; /* Loop counters */
1061 1769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *a; /* One row of the Wagner matrix */
1062 1770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *pToFree; /* Space that needs to be freed */
1063 1771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned char *aM; /* Wagner result matrix */
1064 1772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMatch, iMatch; /* Number of matching lines and match score */
1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mnLen; /* MIN(nLeft, nRight) */
1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mxLen; /* MAX(nLeft, nRight) */
1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int aBuf[100]; /* Stack space for a[] if nRight not to big */
1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aM = fossil_malloc( (nLeft+1)*(nRight+1) );
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nLeft==0 ){
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aM, 2, nRight);
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return aM;
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRight==0 ){
1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aM, 1, nLeft);
1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return aM;
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This algorithm is O(N**2). So if N is too big, bail out with a
1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** simple (but stupid and ugly) result that doesn't take too long. */
1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mnLen = nLeft<nRight ? nLeft : nRight;
1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nLeft*nRight>100000 && (diffFlags & DIFF_SLOW_SBS)==0 ){
1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aM, 4, mnLen);
1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nLeft>mnLen ) memset(aM+mnLen, 1, nLeft-mnLen);
1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRight>mnLen ) memset(aM+mnLen, 2, nRight-mnLen);
1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return aM;
1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mnLen; /* minInt(nLeft, nRight) */
1774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxLen; /* MAX(nLeft, nRight) */
1775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int aBuf[100]; /* Stack space for a[] if nRight not to big */
1776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLeft==0 ){
1778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aM = fossil_malloc( nRight + 2 );
1779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(aM, 2, nRight);
1780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pNResult = nRight;
1781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return aM;
1782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nRight==0 ){
1784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aM = fossil_malloc( nLeft + 2 );
1785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(aM, 1, nLeft);
1786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pNResult = nLeft;
1787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return aM;
1788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* For large alignments, use a divide and conquer algorithm that is
1791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** O(NlogN). The result is not as precise, but this whole thing is an
1792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** approximation anyhow, and the faster response time is an acceptable
1793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** trade-off for reduced precision.
1794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mnLen = nLeft<nRight ? nLeft : nRight;
1796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLeft*nRight>1000 && (diffFlags & DIFF_SLOW_SBS)==0 ){
1797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *aSmall; /* The smaller of aLeft and aRight */
1798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *aBig; /* The larger of aLeft and aRight */
1799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSmall, nBig; /* Size of aSmall and aBig. nSmall<=nBig */
1800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDivSmall, iDivBig; /* Divider point for aSmall and aBig */
1801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDivLeft, iDivRight; /* Divider point for aLeft and aRight */
1802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned char *a1, *a2; /* Results of the alignments on two halves */
1803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n1, n2; /* Number of entries in a1 and a2 */
1804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int score, bestScore; /* Score and best score seen so far */
1805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLeft>nRight ){
1806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSmall = aRight;
1807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSmall = nRight;
1808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aBig = aLeft;
1809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nBig = nLeft;
1810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSmall = aLeft;
1812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSmall = nLeft;
1813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aBig = aRight;
1814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nBig = nRight;
1815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivBig = nBig/2;
1817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivSmall = nSmall/2;
1818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bestScore = 10000;
1819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nSmall; i++){
1820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ score = match_dline(aBig+iDivBig, aSmall+i) + abs(i-nSmall/2)*2;
1821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( score<bestScore ){
1822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bestScore = score;
1823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivSmall = i;
1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSmall==aRight ){
1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivRight = iDivSmall;
1828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivLeft = iDivBig;
1829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivRight = iDivBig;
1831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDivLeft = iDivSmall;
1832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a1 = diffBlockAlignment(aLeft,iDivLeft,aRight,iDivRight,diffFlags,&n1);
1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a2 = diffBlockAlignment(aLeft+iDivLeft, nLeft-iDivLeft,
1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aRight+iDivRight, nRight-iDivRight,
1836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diffFlags, &n2);
1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a1 = fossil_realloc(a1, n1+n2 );
1838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(a1+n1,a2,n2);
1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(a2);
1840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pNResult = n1+n2;
1841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return a1;
1842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we reach this point, we will be doing an O(N*N) Wagner minimum
1845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** edit distance to compute the alignment.
1846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1089 1847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRight < count(aBuf)-1 ){
1090 1848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pToFree = 0;
1091 1849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a = aBuf;
1092 1850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1093 1851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a = pToFree = fossil_malloc( sizeof(a[0])*(nRight+1) );
1094 1852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aM = fossil_malloc( (nLeft+1)*(nRight+1) );
1854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1095 1855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1096 1856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Compute the best alignment */
1097 1857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<=nRight; i++){
1098 1858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aM[i] = 2;
1099 1859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a[i] = i*50;
@@ -1148,10 +1908,11 @@
1148 1908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aM[k] = aM[j*(nRight+1)+i];
1149 1909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1150 1910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
k++;
1151 1911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = (nRight+1)*(nLeft+1) - k;
1152 1912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memmove(aM, &aM[k], i);
1913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pNResult = i;
1153 1914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1154 1915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If:
1155 1916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) the alignment is more than 25% longer than the longest side, and
1156 1917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) the average match cost exceeds 15
1157 1918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Then this is probably an alignment that will be difficult for humans
@@ -1161,13 +1922,13 @@
1161 1922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The coefficients for conditions (1) and (2) above are determined by
1162 1923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** experimentation.
1163 1924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1164 1925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxLen = nLeft>nRight ? nLeft : nRight;
1165 1926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i*4>mxLen*5 && (nMatch==0 || iMatch/nMatch>15) ){
1166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aM, 4, mnLen);
1167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nLeft>mnLen ) memset(aM+mnLen, 1, nLeft-mnLen);
1168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRight>mnLen ) memset(aM+mnLen, 2, nRight-mnLen);
1927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(aM, 4, mnLen); *pNResult = mnLen;
1928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLeft>mnLen ){ memset(aM+mnLen, 1, nLeft-mnLen); *pNResult = nLeft; }
1929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nRight>mnLen ){ memset(aM+mnLen, 2, nRight-mnLen); *pNResult = nRight; }
1169 1930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1170 1931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1171 1932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Return the result */
1172 1933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(pToFree);
1173 1934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return aM;
@@ -1177,70 +1938,47 @@
1177 1938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** R[] is an array of six integer, two COPY/DELETE/INSERT triples for a
1178 1939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pair of adjacent differences. Return true if the gap between these
1179 1940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** two differences is so small that they should be rendered as a single
1180 1941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** edit.
1181 1942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int smallGap(int *R){
1943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int smallGap(const int *R){
1183 1944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return R[3]<=2 || R[3]<=(R[1]+R[2]+R[4]+R[5])/8;
1184 1945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1185 1946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1186 1947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Given a diff context in which the aEdit[] array has been filled
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in, compute a side-by-side diff into pOut.
1948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Format a diff using a DiffBuilder object
1189 1949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void sbsDiff(
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DContext *p, /* The computed diff */
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob *pOut, /* Write the results here */
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ReCompiled *pRe, /* Only show changes that match this regex */
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u64 diffFlags /* Flags controlling the diff */
1950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void formatDiff(
1951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DContext *p, /* The computed diff */
1952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ReCompiled *pRe, /* Only show changes that match this regex */
1953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u64 diffFlags, /* Flags controlling the diff */
1954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder /* The formatter object */
1195 1955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *A; /* Left side of the diff */
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DLine *B; /* Right side of the diff */
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int a = 0; /* Index of next line in A[] */
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int b = 0; /* Index of next line in B[] */
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *R; /* Array of COPY/DELETE/INSERT triples */
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int r; /* Index into R[] */
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nr; /* Number of COPY/DELETE/INSERT triples to process */
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mxr; /* Maximum value for r */
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int na, nb; /* Number of lines shown from A and B */
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i, j; /* Loop counters */
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int m, ma, mb;/* Number of lines to output */
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int skip; /* Number of lines to skip */
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int nChunk = 0; /* Number of chunks of diff output seen so far */
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbsLine s; /* Output line buffer */
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nContext; /* Lines of context above and below each change */
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int showDivider = 0; /* True to show the divider */
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob aCols[5]; /* Array of column blobs */
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&s, 0, sizeof(s));
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.width = diff_width(diffFlags);
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nContext = diff_context_lines(diffFlags);
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.escHtml = (diffFlags & DIFF_HTML)!=0;
1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( s.escHtml ){
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=SBS_LNA; i<=SBS_TXTB; i++){
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&aCols[i]);
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.apCols[i] = &aCols[i];
1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=SBS_LNA; i<=SBS_TXTB; i++){
1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.apCols[i] = pOut;
1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.pRe = pRe;
1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = -1;
1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart2 = 0;
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iEnd = -1;
1956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *A; /* Left side of the diff */
1957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const DLine *B; /* Right side of the diff */
1958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int a = 0; /* Index of next line in A[] */
1959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int b = 0; /* Index of next line in B[] */
1960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int *R; /* Array of COPY/DELETE/INSERT triples */
1961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int r; /* Index into R[] */
1962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nr; /* Number of COPY/DELETE/INSERT triples to process */
1963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int mxr; /* Maximum value for r */
1964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int na, nb; /* Number of lines shown from A and B */
1965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i, j; /* Loop counters */
1966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int m, ma, mb;/* Number of lines to output */
1967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ signed int skip = 0; /* Number of lines to skip */
1968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nContext; /* Lines of context above and below each change */
1969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nContext = diff_context_lines(diffFlags);
1232 1971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A = p->aFrom;
1233 1972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
B = p->aTo;
1234 1973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
R = p->aEdit;
1235 1974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxr = p->nEdit;
1236 1975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( mxr>2 && R[mxr-1]==0 && R[mxr-2]==0 ){ mxr -= 3; }
1237 1976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1238 1977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(r=0; r<mxr; r += 3*nr){
1239 1978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Figure out how many triples to show in a single block */
1240 1979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(nr=1; R[r+nr*3]>0 && R[r+nr*3]<nContext*2; nr++){}
1241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* printf("r=%d nr=%d\n", r, nr); */
1242 1980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1243 1981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is a regex, skip this block (generate no diff output)
1244 1982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if the regex matches or does not match both insert and delete.
1245 1983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Only display the block if one side matches but the other side does
1246 1984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not.
@@ -1263,12 +2001,12 @@
1263 2001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b = xb;
1264 2002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
1265 2003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1266 2004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1267 2005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* For the current block comprising nr triples, figure out
1269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** how many lines of A and B are to be displayed
2006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Figure out how many lines of A and B are to be displayed
2007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for this change block.
1270 2008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1271 2009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( R[r]>nContext ){
1272 2010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
na = nb = nContext;
1273 2011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
skip = R[r] - nContext;
1274 2012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -1289,127 +2027,91 @@
1289 2027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=1; i<nr; i++){
1290 2028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
na += R[r+i*3];
1291 2029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nb += R[r+i*3];
1292 2030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1293 2031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Draw the separator between blocks */
1295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( showDivider ){
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( s.escHtml ){
1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zLn[10];
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(sizeof(zLn), zLn, "%d", a+skip+1);
1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSep(&s, strlen(zLn), SBS_LNA);
1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSep(&s, s.width, SBS_TXTA);
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSep(&s, 0, SBS_MKR);
1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(sizeof(zLn), zLn, "%d", b+skip+1);
1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSep(&s, strlen(zLn), SBS_LNB);
1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSep(&s, s.width, SBS_TXTB);
1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(pOut, "%.*c\n", s.width*2+16, '.');
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- showDivider = 1;
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nChunk++;
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( s.escHtml ){
1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(s.apCols[SBS_LNA], "<span id=\"chunk%d\"></span>", nChunk);
1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1315 2032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the initial common area */
1316 2033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += skip;
1317 2034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += skip;
1318 2035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r] - skip;
2036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( r ) skip -= nContext;
2037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( skip>0 ){
2038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xSkip(pBuilder, skip, 0);
2039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1319 2040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, a+j, SBS_LNA);
1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = s.iEnd = -1;
1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &A[a+j], SBS_TXTA);
1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " ", "");
1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, b+j, SBS_LNB);
1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &B[b+j], SBS_TXTB);
2041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xCommon(pBuilder, &A[a+j]);
1326 2042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1327 2043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += m;
1328 2044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += m;
1329 2045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1330 2046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the differences */
1331 2047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nr; i++){
2048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nAlign;
1332 2049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned char *alignment;
1333 2050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ma = R[r+i*3+1]; /* Lines on left but not on right */
1334 2051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mb = R[r+i*3+2]; /* Lines on right but not on left */
1335 2052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the gap between the current diff and then next diff within the
1337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** same block is not too great, then render them as if they are a
1338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** single diff. */
1339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( i<nr-1 && smallGap(&R[r+i*3]) ){
2053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Try to find an alignment for the lines within this one block */
2054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alignment = diffBlockAlignment(&A[a], ma, &B[b], mb, diffFlags, &nAlign);
2055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we could not get a good alignment, try merging the current
2057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** block with subsequent blocks, if the subsequent blocks are
2058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nearby */
2059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( alignment[0]==4 && i<nr-1 && smallGap(&R[r+i*3]) ){
1340 2060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i++;
1341 2061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+i*3];
1342 2062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ma += R[r+i*3+1] + m;
1343 2063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mb += R[r+i*3+2] + m;
1344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- alignment = sbsAlignment(&A[a], ma, &B[b], mb, diffFlags);
1347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; ma+mb>0; j++){
1348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( alignment[j]==1 ){
1349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Delete one line from the left */
1350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, a, SBS_LNA);
1351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = 0;
1352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.zStart = "<span class=\"diffrm\">";
1353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iEnd = LENGTH(&A[a]);
1354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &A[a], SBS_TXTA);
1355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " <", "<");
1356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteNewlines(&s);
1357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( ma>0 );
1358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ma--;
1359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a++;
1360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( alignment[j]==3 ){
1361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The left line is changed into the right line */
1362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineChange(&s, &A[a], a, &B[b], b);
1363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( ma>0 && mb>0 );
1364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ma--;
1365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mb--;
1366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a++;
1367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- b++;
1368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( alignment[j]==2 ){
1369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Insert one line on the right */
1370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !s.escHtml ){
1371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteSpace(&s, s.width + 7, SBS_TXTA);
1372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " > ", ">");
1374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, b, SBS_LNB);
1375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = 0;
1376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.zStart = "<span class=\"diffadd\">";
1377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iEnd = LENGTH(&B[b]);
1378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &B[b], SBS_TXTB);
1379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( mb>0 );
1380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mb--;
1381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- b++;
1382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
1383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Delete from the left and insert on the right */
1384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, a, SBS_LNA);
1385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = 0;
1386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.zStart = "<span class=\"diffrm\">";
1387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iEnd = LENGTH(&A[a]);
1388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &A[a], SBS_TXTA);
1389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " | ", "|");
1390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, b, SBS_LNB);
1391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = 0;
1392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.zStart = "<span class=\"diffadd\">";
1393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iEnd = LENGTH(&B[b]);
1394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &B[b], SBS_TXTB);
1395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ma--;
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mb--;
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a++;
1398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- b++;
1399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(alignment);
2065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alignment = diffBlockAlignment(&A[a], ma, &B[b], mb, diffFlags,&nAlign);
2066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; ma+mb>0; j++){
2069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( j<nAlign );
2070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( alignment[j] ){
2071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 1: {
2072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Delete one line from the left */
2073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xDelete(pBuilder, &A[a]);
2074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ma--;
2075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a++;
2076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
2077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 2: {
2079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Insert one line on the right */
2080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xInsert(pBuilder, &B[b]);
2081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( mb>0 );
2082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mb--;
2083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b++;
2084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
2085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 3: {
2087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The left line is changed into the right line */
2088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xEdit(pBuilder, &A[a], &B[b]);
2089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ma>0 && mb>0 );
2090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ma--;
2091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mb--;
2092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a++;
2093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b++;
2094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
2095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 4: {
2097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Delete from left then separately insert on the right */
2098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xReplace(pBuilder, &A[a], &B[b]);
2099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ma--;
2100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a++;
2101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mb--;
2102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b++;
2103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
2104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nAlign==j );
1401 2108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(alignment);
1402 2109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i<nr-1 ){
1403 2110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+i*3+3];
1404 2111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<m; j++){
1405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, a+j, SBS_LNA);
1406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = s.iEnd = -1;
1407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &A[a+j], SBS_TXTA);
1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " ", "");
1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, b+j, SBS_LNB);
1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &B[b+j], SBS_TXTB);
2112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xCommon(pBuilder, &A[a+j]);
1411 2113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1412 2114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b += m;
1413 2115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a += m;
1414 2116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1415 2117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1416,29 +2118,20 @@
1416 2118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1417 2119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show the final common area */
1418 2120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nr==i );
1419 2121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = R[r+nr*3];
1420 2122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m>nContext ) m = nContext;
1421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; j<m; j++){
1422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, a+j, SBS_LNA);
1423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s.iStart = s.iEnd = -1;
1424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &A[a+j], SBS_TXTA);
1425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteMarker(&s, " ", "");
1426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteLineno(&s, b+j, SBS_LNB);
1427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteText(&s, &B[b+j], SBS_TXTB);
1428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( s.escHtml && blob_size(s.apCols[SBS_LNA])>0 ){
1432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "<table class=\"sbsdiffcols\"><tr>\n", -1);
1433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=SBS_LNA; i<=SBS_TXTB; i++){
1434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsWriteColumn(pOut, s.apCols[i], i);
1435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(s.apCols[i]);
1436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, "</tr></table>\n", -1);
1438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<m && j<nContext; j++){
2124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xCommon(pBuilder, &A[a+j]);
2125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( R[r]>nContext ){
2128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xSkip(pBuilder, R[r] - nContext, 1);
2129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder->xEnd(pBuilder);
2131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1440 2133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1441 2134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1442 2135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compute the optimal longest common subsequence (LCS) using an
1443 2136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** exhaustive search. This version of the LCS is only used for
1444 2137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** shorter input strings since runtime is O(N*N) where N is the
@@ -1509,11 +2202,11 @@
1509 2202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n; /* Loop limit */
1510 2203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DLine *pA, *pB; /* Pointers to lines */
1511 2204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iSX, iSY, iEX, iEY; /* Current match */
1512 2205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int skew = 0; /* How lopsided is the match */
1513 2206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int dist = 0; /* Distance of match from center */
1514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mid; /* Center of the span */
2207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mid; /* Center of the chng */
1515 2208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iSXb, iSYb, iEXb, iEYb; /* Best match so far */
1516 2209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iSXp, iSYp, iEXp, iEYp; /* Previous match */
1517 2210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 bestScore; /* Best score so far */
1518 2211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 score; /* Score for current candidate LCS */
1519 2212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int span; /* combined width of the input sequences */
@@ -1878,18 +2571,26 @@
1878 2571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pOut, msg, -1);
1879 2572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1880 2573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1881 2574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1882 2575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Generate a report of the differences between files pA and pB.
1884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If pOut is not NULL then a unified diff is appended there. It
1885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is assumed that pOut has already been initialized. If pOut is
1886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** NULL, then a pointer to an array of integers is returned.
1887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The integers come in triples. For each triple,
1888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the elements are the number of lines copied, the number of
1889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** lines deleted, and the number of lines inserted. The vector
1890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is terminated by a triple of all zeros.
2576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Generate a report of the differences between files pA_Blob and pB_Blob.
2577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If pOut!=NULL then append text to pOut that will be the difference,
2579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** formatted according to flags in diffFlags. The pOut Blob must have
2580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** already been initialized.
2581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If pOut==NULL then no formatting occurs. Instead, this routine
2583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns a pointer to an array of integers. The integers come in
2584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** triples. The elements of each triple are:
2585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. The number of lines to copy
2587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. The number of lines to delete
2588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. The number of lines to insert
2589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The return vector is terminated bin a triple of all zeros. The caller
2591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should free the returned vector using fossil_free().
1891 2592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1892 2593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This diff utility does not work on binary files. If a binary
1893 2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file is encountered, 0 is returned and pOut is written with
1894 2595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** text "cannot compute difference between binary files".
1895 2596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -1969,14 +2670,40 @@
1969 2670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.diffCnt[2] += nDel;
1970 2671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nIns+nDel ){
1971 2672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.diffCnt[0]++;
1972 2673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut, "%10d %10d", nIns, nDel);
1973 2674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( diffFlags & DIFF_RAW ){
2676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int *R = c.aEdit;
2677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int r;
2678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(r=0; R[r] || R[r+1] || R[r+2]; r += 3){
2679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, " copy %6d delete %6d insert %6d\n",
2680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ R[r], R[r+1], R[r+2]);
2681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( diffFlags & DIFF_JSON ){
2683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder = dfjsonNew(pOut);
2684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ formatDiff(&c, pRe, diffFlags, pBuilder);
2685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, '\n');
2686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( diffFlags & DIFF_TCL ){
2687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder = dftclNew(pOut);
2688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ formatDiff(&c, pRe, diffFlags, pBuilder);
1974 2689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( diffFlags & DIFF_SIDEBYSIDE ){
1975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sbsDiff(&c, pOut, pRe, diffFlags);
2690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder;
2691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( diffFlags & DIFF_HTML ){
2692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder = dfsplitNew(pOut);
2693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBuilder = dfsbsNew(pOut, diffFlags);
2695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ formatDiff(&c, pRe, diffFlags, pBuilder);
2697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( diffFlags & DIFF_DEBUG ){
2698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder = dfdebugNew(pOut);
2699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ formatDiff(&c, pRe, diffFlags, pBuilder);
2700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( diffFlags & DIFF_HTML ){
2701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DiffBuilder *pBuilder = dfunifiedNew(pOut);
2702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ formatDiff(&c, pRe, diffFlags, pBuilder);
1976 2703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- contextDiff(&c, pOut, pRe, diffFlags);
2704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contextDiff(&c, pOut, diffFlags);
1978 2705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1979 2706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(c.aFrom);
1980 2707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(c.aTo);
1981 2708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(c.aEdit);
1982 2709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
@@ -2049,48 +2776,40 @@
2049 2776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2050 2777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( find_option("by",0,0)!=0 ){
2051 2778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diffFlags |= DIFF_HTML|DIFF_WEBPAGE|DIFF_LINENO|DIFF_BROWSER
2052 2779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|DIFF_SIDEBYSIDE;
2053 2780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("json",0,0)!=0 ){
2782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diffFlags |= DIFF_JSON;
2783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("tcl",0,0)!=0 ){
2785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diffFlags |= DIFF_TCL;
2786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Undocumented and unsupported flags used for development
2789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** debugging and analysis: */
2790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("debug",0,0)!=0 ) diffFlags |= DIFF_DEBUG;
2791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("raw",0,0)!=0 ) diffFlags |= DIFF_RAW;
2054 2792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return diffFlags;
2055 2793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2056 2794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
2058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** COMMAND: test-rawdiff
2059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
2060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Usage: %fossil test-rawdiff FILE1 FILE2
2061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
2062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Show a minimal sequence of Copy/Delete/Insert operations needed to convert
2063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** FILE1 into FILE2. This command is intended for use in testing and debugging
2064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the built-in difference engine of Fossil.
2065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
2066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void test_rawdiff_cmd(void){
2067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob a, b;
2068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int r;
2069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
2070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *R;
2071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u64 diffFlags = diff_options();
2072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.argc<4 ) usage("FILE1 FILE2 ...");
2073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_read_from_file(&a, g.argv[2], ExtFILE);
2074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=3; i<g.argc; i++){
2075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i>3 ) fossil_print("-------------------------------\n");
2076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_read_from_file(&b, g.argv[i], ExtFILE);
2077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- R = text_diff(&a, &b, 0, 0, diffFlags);
2078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(r=0; R[r] || R[r+1] || R[r+2]; r += 3){
2079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print(" copy %4d delete %4d insert %4d\n", R[r], R[r+1], R[r+2]);
2080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* free(R); */
2082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&b);
2083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
2086 2795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
2087 2796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: test-diff
2797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: xdiff
2798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil xdiff [options] FILE1 FILE2
2800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is the "external diff" feature. By "external" here we mean a diff
2802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** applied to files that are not under version control. See the "diff"
2803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command for computing differences between files that are under control.
2088 2804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Usage: %fossil [options] FILE1 FILE2
2805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This command prints the differences between the two files FILE1 and FILE2.
2806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all of the usual diff command-line options apply. See the "diff" command
2807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for a full list of command-line options.
2090 2808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Print the difference between two files. The usual diff options apply.
2809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This command used to be called "test-diff". The older "test-diff" spelling
2810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** still works, for compatibility.
2092 2811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2093 2812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void test_diff_cmd(void){
2094 2813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob a, b, out;
2095 2814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlag;
2096 2815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zRe; /* Regex filter for diff output */
2097 2816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2098 2817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED src/diff.js