Fossil SCM
Fixing the automatic calculation of sbs line length, for the case of TABs and UTF8 sequences. I also set the tab size to 4 spaces.
Commit
36cdc17cc83c22251109463601acc41a9cb597f4
Parent
08db320464c7cd1…
1 file changed
+37
-16
+37
-16
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -43,10 +43,11 @@ | ||
| 43 | 43 | |
| 44 | 44 | /* |
| 45 | 45 | ** Maximum length of a line in a text file. (8192) |
| 46 | 46 | */ |
| 47 | 47 | #define LENGTH_MASK_SZ 13 |
| 48 | +#define TABLENGTH 4 | |
| 48 | 49 | #define LENGTH_MASK ((1<<LENGTH_MASK_SZ)-1) |
| 49 | 50 | |
| 50 | 51 | /* |
| 51 | 52 | ** Information about each line of a file being diffed. |
| 52 | 53 | ** |
| @@ -394,59 +395,79 @@ | ||
| 394 | 395 | int needEndSpan = 0; |
| 395 | 396 | const char *zIn = pLine->z; |
| 396 | 397 | char *z = &p->zLine[p->n]; |
| 397 | 398 | int w = p->width; |
| 398 | 399 | |
| 399 | - if (n > maxwidth) | |
| 400 | - maxwidth = n; | |
| 401 | - | |
| 402 | - for(i=j=k=0; k<w && i<n; i++, k++){ | |
| 400 | + /* In the case w == 0, we want to calculate the output line | |
| 401 | + * width (k), but not write anything to 'z', because it has | |
| 402 | + * a buffer of limited size. */ | |
| 403 | + for(i=j=k=0; (w == 0 || k<w) && i<n; i++, k++){ | |
| 403 | 404 | char c = zIn[i]; |
| 404 | 405 | if( p->escHtml ){ |
| 405 | 406 | if( i==p->iStart ){ |
| 406 | 407 | int x = strlen(p->zStart); |
| 407 | - memcpy(z+j, p->zStart, x); | |
| 408 | + if (w != 0) | |
| 409 | + memcpy(z+j, p->zStart, x); | |
| 408 | 410 | j += x; |
| 409 | 411 | needEndSpan = 1; |
| 410 | 412 | if( p->iStart2 ){ |
| 411 | 413 | p->iStart = p->iStart2; |
| 412 | 414 | p->zStart = p->zStart2; |
| 413 | 415 | p->iStart2 = 0; |
| 414 | 416 | } |
| 415 | 417 | }else if( i==p->iEnd ){ |
| 416 | - memcpy(z+j, "</span>", 7); | |
| 418 | + if (w != 0) | |
| 419 | + memcpy(z+j, "</span>", 7); | |
| 417 | 420 | j += 7; |
| 418 | 421 | needEndSpan = 0; |
| 419 | 422 | if( p->iEnd2 ){ |
| 420 | 423 | p->iEnd = p->iEnd2; |
| 421 | 424 | p->iEnd2 = 0; |
| 422 | 425 | } |
| 423 | 426 | } |
| 424 | 427 | } |
| 425 | 428 | if( c=='\t' ){ |
| 426 | - z[j++] = ' '; | |
| 427 | - while( (k&7)!=7 && k<w ){ z[j++] = ' '; k++; } | |
| 429 | + if (w != 0) | |
| 430 | + z[j++] = ' '; | |
| 431 | + while( (k%TABLENGTH)!=0 && (w == 0 || k<w) ){ | |
| 432 | + if (w != 0) | |
| 433 | + z[j++] = ' '; | |
| 434 | + k++; | |
| 435 | + } | |
| 428 | 436 | }else if( c=='\r' || c=='\f' ){ |
| 429 | - z[j++] = ' '; | |
| 437 | + if (w != 0) | |
| 438 | + z[j++] = ' '; | |
| 430 | 439 | }else if( c=='<' && p->escHtml ){ |
| 431 | - memcpy(&z[j], "<", 4); | |
| 432 | - j += 4; | |
| 440 | + if (w != 0) { | |
| 441 | + memcpy(&z[j], "<", 4); | |
| 442 | + j += 4; | |
| 443 | + } | |
| 433 | 444 | }else if( c=='&' && p->escHtml ){ |
| 434 | - memcpy(&z[j], "&", 5); | |
| 435 | - j += 5; | |
| 445 | + if (w != 0) { | |
| 446 | + memcpy(&z[j], "&", 5); | |
| 447 | + j += 5; | |
| 448 | + } | |
| 436 | 449 | }else if( c=='>' && p->escHtml ){ |
| 437 | - memcpy(&z[j], ">", 4); | |
| 438 | - j += 4; | |
| 450 | + if (w != 0) { | |
| 451 | + memcpy(&z[j], ">", 4); | |
| 452 | + j += 4; | |
| 453 | + } | |
| 439 | 454 | }else{ |
| 440 | - z[j++] = c; | |
| 455 | + if (w != 0) { | |
| 456 | + z[j++] = c; | |
| 457 | + } | |
| 441 | 458 | if( (c&0xc0)==0x80 ) k--; |
| 442 | 459 | } |
| 443 | 460 | } |
| 444 | 461 | if( needEndSpan ){ |
| 445 | 462 | memcpy(&z[j], "</span>", 7); |
| 446 | 463 | j += 7; |
| 447 | 464 | } |
| 465 | + | |
| 466 | + if (k > maxwidth) | |
| 467 | + maxwidth = k; | |
| 468 | + | |
| 448 | 469 | if( (flags & SBS_PAD)!=0 ){ |
| 449 | 470 | while( k<w ){ k++; z[j++] = ' '; } |
| 450 | 471 | } |
| 451 | 472 | if( flags & SBS_NEWLINE ){ |
| 452 | 473 | z[j++] = '\n'; |
| 453 | 474 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -43,10 +43,11 @@ | |
| 43 | |
| 44 | /* |
| 45 | ** Maximum length of a line in a text file. (8192) |
| 46 | */ |
| 47 | #define LENGTH_MASK_SZ 13 |
| 48 | #define LENGTH_MASK ((1<<LENGTH_MASK_SZ)-1) |
| 49 | |
| 50 | /* |
| 51 | ** Information about each line of a file being diffed. |
| 52 | ** |
| @@ -394,59 +395,79 @@ | |
| 394 | int needEndSpan = 0; |
| 395 | const char *zIn = pLine->z; |
| 396 | char *z = &p->zLine[p->n]; |
| 397 | int w = p->width; |
| 398 | |
| 399 | if (n > maxwidth) |
| 400 | maxwidth = n; |
| 401 | |
| 402 | for(i=j=k=0; k<w && i<n; i++, k++){ |
| 403 | char c = zIn[i]; |
| 404 | if( p->escHtml ){ |
| 405 | if( i==p->iStart ){ |
| 406 | int x = strlen(p->zStart); |
| 407 | memcpy(z+j, p->zStart, x); |
| 408 | j += x; |
| 409 | needEndSpan = 1; |
| 410 | if( p->iStart2 ){ |
| 411 | p->iStart = p->iStart2; |
| 412 | p->zStart = p->zStart2; |
| 413 | p->iStart2 = 0; |
| 414 | } |
| 415 | }else if( i==p->iEnd ){ |
| 416 | memcpy(z+j, "</span>", 7); |
| 417 | j += 7; |
| 418 | needEndSpan = 0; |
| 419 | if( p->iEnd2 ){ |
| 420 | p->iEnd = p->iEnd2; |
| 421 | p->iEnd2 = 0; |
| 422 | } |
| 423 | } |
| 424 | } |
| 425 | if( c=='\t' ){ |
| 426 | z[j++] = ' '; |
| 427 | while( (k&7)!=7 && k<w ){ z[j++] = ' '; k++; } |
| 428 | }else if( c=='\r' || c=='\f' ){ |
| 429 | z[j++] = ' '; |
| 430 | }else if( c=='<' && p->escHtml ){ |
| 431 | memcpy(&z[j], "<", 4); |
| 432 | j += 4; |
| 433 | }else if( c=='&' && p->escHtml ){ |
| 434 | memcpy(&z[j], "&", 5); |
| 435 | j += 5; |
| 436 | }else if( c=='>' && p->escHtml ){ |
| 437 | memcpy(&z[j], ">", 4); |
| 438 | j += 4; |
| 439 | }else{ |
| 440 | z[j++] = c; |
| 441 | if( (c&0xc0)==0x80 ) k--; |
| 442 | } |
| 443 | } |
| 444 | if( needEndSpan ){ |
| 445 | memcpy(&z[j], "</span>", 7); |
| 446 | j += 7; |
| 447 | } |
| 448 | if( (flags & SBS_PAD)!=0 ){ |
| 449 | while( k<w ){ k++; z[j++] = ' '; } |
| 450 | } |
| 451 | if( flags & SBS_NEWLINE ){ |
| 452 | z[j++] = '\n'; |
| 453 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -43,10 +43,11 @@ | |
| 43 | |
| 44 | /* |
| 45 | ** Maximum length of a line in a text file. (8192) |
| 46 | */ |
| 47 | #define LENGTH_MASK_SZ 13 |
| 48 | #define TABLENGTH 4 |
| 49 | #define LENGTH_MASK ((1<<LENGTH_MASK_SZ)-1) |
| 50 | |
| 51 | /* |
| 52 | ** Information about each line of a file being diffed. |
| 53 | ** |
| @@ -394,59 +395,79 @@ | |
| 395 | int needEndSpan = 0; |
| 396 | const char *zIn = pLine->z; |
| 397 | char *z = &p->zLine[p->n]; |
| 398 | int w = p->width; |
| 399 | |
| 400 | /* In the case w == 0, we want to calculate the output line |
| 401 | * width (k), but not write anything to 'z', because it has |
| 402 | * a buffer of limited size. */ |
| 403 | for(i=j=k=0; (w == 0 || k<w) && i<n; i++, k++){ |
| 404 | char c = zIn[i]; |
| 405 | if( p->escHtml ){ |
| 406 | if( i==p->iStart ){ |
| 407 | int x = strlen(p->zStart); |
| 408 | if (w != 0) |
| 409 | memcpy(z+j, p->zStart, x); |
| 410 | j += x; |
| 411 | needEndSpan = 1; |
| 412 | if( p->iStart2 ){ |
| 413 | p->iStart = p->iStart2; |
| 414 | p->zStart = p->zStart2; |
| 415 | p->iStart2 = 0; |
| 416 | } |
| 417 | }else if( i==p->iEnd ){ |
| 418 | if (w != 0) |
| 419 | memcpy(z+j, "</span>", 7); |
| 420 | j += 7; |
| 421 | needEndSpan = 0; |
| 422 | if( p->iEnd2 ){ |
| 423 | p->iEnd = p->iEnd2; |
| 424 | p->iEnd2 = 0; |
| 425 | } |
| 426 | } |
| 427 | } |
| 428 | if( c=='\t' ){ |
| 429 | if (w != 0) |
| 430 | z[j++] = ' '; |
| 431 | while( (k%TABLENGTH)!=0 && (w == 0 || k<w) ){ |
| 432 | if (w != 0) |
| 433 | z[j++] = ' '; |
| 434 | k++; |
| 435 | } |
| 436 | }else if( c=='\r' || c=='\f' ){ |
| 437 | if (w != 0) |
| 438 | z[j++] = ' '; |
| 439 | }else if( c=='<' && p->escHtml ){ |
| 440 | if (w != 0) { |
| 441 | memcpy(&z[j], "<", 4); |
| 442 | j += 4; |
| 443 | } |
| 444 | }else if( c=='&' && p->escHtml ){ |
| 445 | if (w != 0) { |
| 446 | memcpy(&z[j], "&", 5); |
| 447 | j += 5; |
| 448 | } |
| 449 | }else if( c=='>' && p->escHtml ){ |
| 450 | if (w != 0) { |
| 451 | memcpy(&z[j], ">", 4); |
| 452 | j += 4; |
| 453 | } |
| 454 | }else{ |
| 455 | if (w != 0) { |
| 456 | z[j++] = c; |
| 457 | } |
| 458 | if( (c&0xc0)==0x80 ) k--; |
| 459 | } |
| 460 | } |
| 461 | if( needEndSpan ){ |
| 462 | memcpy(&z[j], "</span>", 7); |
| 463 | j += 7; |
| 464 | } |
| 465 | |
| 466 | if (k > maxwidth) |
| 467 | maxwidth = k; |
| 468 | |
| 469 | if( (flags & SBS_PAD)!=0 ){ |
| 470 | while( k<w ){ k++; z[j++] = ' '; } |
| 471 | } |
| 472 | if( flags & SBS_NEWLINE ){ |
| 473 | z[j++] = '\n'; |
| 474 |