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.

viriketo 2012-08-20 13:20 annotate_links
Commit 36cdc17cc83c22251109463601acc41a9cb597f4
1 file changed +37 -16
+37 -16
--- src/diff.c
+++ src/diff.c
@@ -43,10 +43,11 @@
4343
4444
/*
4545
** Maximum length of a line in a text file. (8192)
4646
*/
4747
#define LENGTH_MASK_SZ 13
48
+#define TABLENGTH 4
4849
#define LENGTH_MASK ((1<<LENGTH_MASK_SZ)-1)
4950
5051
/*
5152
** Information about each line of a file being diffed.
5253
**
@@ -394,59 +395,79 @@
394395
int needEndSpan = 0;
395396
const char *zIn = pLine->z;
396397
char *z = &p->zLine[p->n];
397398
int w = p->width;
398399
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++){
403404
char c = zIn[i];
404405
if( p->escHtml ){
405406
if( i==p->iStart ){
406407
int x = strlen(p->zStart);
407
- memcpy(z+j, p->zStart, x);
408
+ if (w != 0)
409
+ memcpy(z+j, p->zStart, x);
408410
j += x;
409411
needEndSpan = 1;
410412
if( p->iStart2 ){
411413
p->iStart = p->iStart2;
412414
p->zStart = p->zStart2;
413415
p->iStart2 = 0;
414416
}
415417
}else if( i==p->iEnd ){
416
- memcpy(z+j, "</span>", 7);
418
+ if (w != 0)
419
+ memcpy(z+j, "</span>", 7);
417420
j += 7;
418421
needEndSpan = 0;
419422
if( p->iEnd2 ){
420423
p->iEnd = p->iEnd2;
421424
p->iEnd2 = 0;
422425
}
423426
}
424427
}
425428
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
+ }
428436
}else if( c=='\r' || c=='\f' ){
429
- z[j++] = ' ';
437
+ if (w != 0)
438
+ z[j++] = ' ';
430439
}else if( c=='<' && p->escHtml ){
431
- memcpy(&z[j], "&lt;", 4);
432
- j += 4;
440
+ if (w != 0) {
441
+ memcpy(&z[j], "&lt;", 4);
442
+ j += 4;
443
+ }
433444
}else if( c=='&' && p->escHtml ){
434
- memcpy(&z[j], "&amp;", 5);
435
- j += 5;
445
+ if (w != 0) {
446
+ memcpy(&z[j], "&amp;", 5);
447
+ j += 5;
448
+ }
436449
}else if( c=='>' && p->escHtml ){
437
- memcpy(&z[j], "&gt;", 4);
438
- j += 4;
450
+ if (w != 0) {
451
+ memcpy(&z[j], "&gt;", 4);
452
+ j += 4;
453
+ }
439454
}else{
440
- z[j++] = c;
455
+ if (w != 0) {
456
+ z[j++] = c;
457
+ }
441458
if( (c&0xc0)==0x80 ) k--;
442459
}
443460
}
444461
if( needEndSpan ){
445462
memcpy(&z[j], "</span>", 7);
446463
j += 7;
447464
}
465
+
466
+ if (k > maxwidth)
467
+ maxwidth = k;
468
+
448469
if( (flags & SBS_PAD)!=0 ){
449470
while( k<w ){ k++; z[j++] = ' '; }
450471
}
451472
if( flags & SBS_NEWLINE ){
452473
z[j++] = '\n';
453474
--- 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], "&lt;", 4);
432 j += 4;
 
 
433 }else if( c=='&' && p->escHtml ){
434 memcpy(&z[j], "&amp;", 5);
435 j += 5;
 
 
436 }else if( c=='>' && p->escHtml ){
437 memcpy(&z[j], "&gt;", 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], "&lt;", 4);
442 j += 4;
443 }
444 }else if( c=='&' && p->escHtml ){
445 if (w != 0) {
446 memcpy(&z[j], "&amp;", 5);
447 j += 5;
448 }
449 }else if( c=='>' && p->escHtml ){
450 if (w != 0) {
451 memcpy(&z[j], "&gt;", 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button