diff options
| author | Jim Blandy | 1992-02-01 19:17:17 +0000 |
|---|---|---|
| committer | Jim Blandy | 1992-02-01 19:17:17 +0000 |
| commit | cde9337b6e730392d9b85a3f7985454bba2d23ab (patch) | |
| tree | 6030eaf33809930786e9b8b23dab33550c416571 /src | |
| parent | 23b0668cf2879d5520b2157ef1fc7ad18f402ac6 (diff) | |
| download | emacs-cde9337b6e730392d9b85a3f7985454bba2d23ab.tar.gz emacs-cde9337b6e730392d9b85a3f7985454bba2d23ab.zip | |
*** empty log message ***
Diffstat (limited to 'src')
| -rw-r--r-- | src/indent.c | 120 |
1 files changed, 58 insertions, 62 deletions
diff --git a/src/indent.c b/src/indent.c index e9031d54069..a48877d84ce 100644 --- a/src/indent.c +++ b/src/indent.c | |||
| @@ -408,27 +408,9 @@ compute_motion (from, fromvpos, fromhpos, to, tovpos, tohpos, width, hscroll, ta | |||
| 408 | register int width; | 408 | register int width; |
| 409 | int hscroll, tab_offset; | 409 | int hscroll, tab_offset; |
| 410 | { | 410 | { |
| 411 | /* Note that `cpos' is CURRENT_VPOS << SHORTBITS + CURRENT_HPOS, | 411 | register int hpos = fromhpos; |
| 412 | and that CURRENT_HPOS may be negative. Use these macros | 412 | register int vpos = fromvpos; |
| 413 | to extract the hpos or the vpos from cpos or anything like it. | 413 | |
| 414 | */ | ||
| 415 | #ifndef SHORT_CAST_BUG | ||
| 416 | #define HPOS(VAR) (short) (VAR) | ||
| 417 | #else | ||
| 418 | #define HPOS(VAR) (((VAR) & (1 << (SHORTBITS - 1)) \ | ||
| 419 | ? ~((1 << SHORTBITS) - 1) : 0) \ | ||
| 420 | | (VAR) & ((1 << SHORTBITS) - 1)) | ||
| 421 | /* #define HPOS(VAR) (((VAR) & 0x8000 ? 0xffff0000 : 0) | ((VAR) & 0xffff)) */ | ||
| 422 | #endif /* SHORT_CAST_BUG */ | ||
| 423 | |||
| 424 | #define VPOS(VAR) (((VAR) >> SHORTBITS) + (HPOS (VAR) < 0)) | ||
| 425 | |||
| 426 | |||
| 427 | #ifndef TAHOE_REGISTER_BUG | ||
| 428 | register | ||
| 429 | #endif /* TAHOE_REGISTER_BUG */ | ||
| 430 | int cpos = fromhpos + (fromvpos << SHORTBITS); | ||
| 431 | register int target = tohpos + (tovpos << SHORTBITS); | ||
| 432 | register int pos; | 414 | register int pos; |
| 433 | register int c; | 415 | register int c; |
| 434 | register int tab_width = XFASTINT (current_buffer->tab_width); | 416 | register int tab_width = XFASTINT (current_buffer->tab_width); |
| @@ -438,28 +420,34 @@ compute_motion (from, fromvpos, fromhpos, to, tovpos, tohpos, width, hscroll, ta | |||
| 438 | = XTYPE (current_buffer->selective_display) == Lisp_Int | 420 | = XTYPE (current_buffer->selective_display) == Lisp_Int |
| 439 | ? XINT (current_buffer->selective_display) | 421 | ? XINT (current_buffer->selective_display) |
| 440 | : !NILP (current_buffer->selective_display) ? -1 : 0; | 422 | : !NILP (current_buffer->selective_display) ? -1 : 0; |
| 441 | int prevpos; | 423 | int prev_vpos, prev_hpos; |
| 442 | int selective_rlen | 424 | int selective_rlen |
| 443 | = (selective && dp && XTYPE (DISP_INVIS_ROPE (dp)) == Lisp_String | 425 | = (selective && dp && XTYPE (DISP_INVIS_ROPE (dp)) == Lisp_String |
| 444 | ? XSTRING (DISP_INVIS_ROPE (dp))->size / sizeof (GLYPH) : 0); | 426 | ? XSTRING (DISP_INVIS_ROPE (dp))->size / sizeof (GLYPH) : 0); |
| 445 | 427 | ||
| 446 | if (tab_width <= 0 || tab_width > 20) tab_width = 8; | 428 | if (tab_width <= 0 || tab_width > 20) tab_width = 8; |
| 447 | for (pos = from; pos < to && cpos < target; pos++) | 429 | for (pos = from; pos < to; pos++) |
| 448 | { | 430 | { |
| 449 | prevpos = cpos; | 431 | /* Stop if past the target screen position. */ |
| 432 | if (vpos > tovpos | ||
| 433 | || (vpos == tovpos && hpos >= tohpos)) | ||
| 434 | break; | ||
| 435 | |||
| 436 | prev_vpos = vpos; | ||
| 437 | prev_hpos = hpos; | ||
| 438 | |||
| 450 | c = FETCH_CHAR (pos); | 439 | c = FETCH_CHAR (pos); |
| 451 | if (c >= 040 && c < 0177 | 440 | if (c >= 040 && c < 0177 |
| 452 | && (dp == 0 || XTYPE (DISP_CHAR_ROPE (dp, c)) != Lisp_String)) | 441 | && (dp == 0 || XTYPE (DISP_CHAR_ROPE (dp, c)) != Lisp_String)) |
| 453 | cpos++; | 442 | hpos++; |
| 454 | else if (c == '\t') | 443 | else if (c == '\t') |
| 455 | { | 444 | { |
| 456 | cpos += tab_width | 445 | hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0) |
| 457 | - HPOS (cpos + tab_offset + hscroll - (hscroll > 0) | 446 | /* Add tab_width here to make sure positive. |
| 458 | /* Add tab_width here to make sure positive. | 447 | hpos can be negative after continuation |
| 459 | cpos can be negative after continuation | 448 | but can't be less than -tab_width. */ |
| 460 | but can't be less than -tab_width. */ | 449 | + tab_width) |
| 461 | + tab_width) | 450 | % tab_width); |
| 462 | % tab_width; | ||
| 463 | } | 451 | } |
| 464 | else if (c == '\n') | 452 | else if (c == '\n') |
| 465 | { | 453 | { |
| @@ -468,61 +456,71 @@ compute_motion (from, fromvpos, fromhpos, to, tovpos, tohpos, width, hscroll, ta | |||
| 468 | /* Skip any number of invisible lines all at once */ | 456 | /* Skip any number of invisible lines all at once */ |
| 469 | do | 457 | do |
| 470 | { | 458 | { |
| 471 | while (++pos < to && FETCH_CHAR(pos) != '\n'); | 459 | while (++pos < to && FETCH_CHAR (pos) != '\n'); |
| 472 | } | 460 | } |
| 473 | while (selective > 0 && position_indentation (pos + 1) >= selective); | 461 | while (selective > 0 && position_indentation (pos + 1) >= selective); |
| 474 | pos--; | 462 | pos--; |
| 475 | /* Allow for the " ..." that is displayed for them. */ | 463 | /* Allow for the " ..." that is displayed for them. */ |
| 476 | if (selective_rlen) | 464 | if (selective_rlen) |
| 477 | { | 465 | { |
| 478 | cpos += selective_rlen; | 466 | hpos += selective_rlen; |
| 479 | if (HPOS (cpos) >= width) | 467 | if (hpos >= width) |
| 480 | cpos -= HPOS (cpos) - width; | 468 | hpos = width; |
| 481 | } | 469 | } |
| 482 | } | 470 | } |
| 483 | else | 471 | else |
| 484 | cpos += (1 << SHORTBITS) - HPOS (cpos); | 472 | { |
| 485 | cpos -= hscroll; | 473 | /* A visible line. */ |
| 486 | if (hscroll > 0) cpos++; /* Count the ! on column 0 */ | 474 | vpos++; |
| 475 | hpos = 0; | ||
| 476 | } | ||
| 477 | hpos -= hscroll; | ||
| 478 | if (hscroll > 0) hpos++; /* Count the ! on column 0 */ | ||
| 487 | tab_offset = 0; | 479 | tab_offset = 0; |
| 488 | } | 480 | } |
| 489 | else if (c == CR && selective < 0) | 481 | else if (c == CR && selective < 0) |
| 490 | { | 482 | { |
| 491 | /* In selective display mode, | 483 | /* In selective display mode, |
| 492 | everything from a ^M to the end of the line is invisible */ | 484 | everything from a ^M to the end of the line is invisible */ |
| 493 | while (pos < to && FETCH_CHAR(pos) != '\n') pos++; | 485 | while (pos < to && FETCH_CHAR (pos) != '\n') pos++; |
| 486 | /* Stop *before* the real newline. */ | ||
| 494 | pos--; | 487 | pos--; |
| 495 | /* Allow for the " ..." that is displayed for them. */ | 488 | /* Allow for the " ..." that is displayed for them. */ |
| 496 | if (selective_rlen) | 489 | if (selective_rlen) |
| 497 | { | 490 | { |
| 498 | cpos += selective_rlen; | 491 | hpos += selective_rlen; |
| 499 | if (HPOS (cpos) >= width) | 492 | if (hpos >= width) |
| 500 | cpos -= HPOS (cpos) - width; | 493 | hpos = width; |
| 501 | } | 494 | } |
| 502 | } | 495 | } |
| 503 | else if (dp != 0 && XTYPE (DISP_CHAR_ROPE (dp, c)) == Lisp_String) | 496 | else if (dp != 0 && XTYPE (DISP_CHAR_ROPE (dp, c)) == Lisp_String) |
| 504 | cpos += XSTRING (DISP_CHAR_ROPE (dp, c))->size / sizeof (GLYPH); | 497 | hpos += XSTRING (DISP_CHAR_ROPE (dp, c))->size / sizeof (GLYPH); |
| 505 | else | 498 | else |
| 506 | cpos += (ctl_arrow && c < 0200) ? 2 : 4; | 499 | hpos += (ctl_arrow && c < 0200) ? 2 : 4; |
| 507 | 500 | ||
| 508 | if (HPOS (cpos) >= width | 501 | /* Handle right margin. */ |
| 509 | && (HPOS (cpos) > width | 502 | if (hpos >= width |
| 510 | || (pos < (ZV - 1) | 503 | && (hpos > width |
| 504 | || (pos < ZV - 1 | ||
| 511 | && FETCH_CHAR (pos + 1) != '\n'))) | 505 | && FETCH_CHAR (pos + 1) != '\n'))) |
| 512 | { | 506 | { |
| 513 | if (cpos >= target) | 507 | if (vpos > tovpos |
| 508 | || (vpos == tovpos && hpos >= tohpos)) | ||
| 514 | break; | 509 | break; |
| 515 | if (hscroll | 510 | if (hscroll |
| 516 | || (truncate_partial_width_windows | 511 | || (truncate_partial_width_windows |
| 517 | && width + 1 < SCREEN_WIDTH (selected_screen)) | 512 | && width + 1 < SCREEN_WIDTH (selected_screen)) |
| 518 | || !NILP (current_buffer->truncate_lines)) | 513 | || !NILP (current_buffer->truncate_lines)) |
| 519 | { | 514 | { |
| 520 | while (pos < to && FETCH_CHAR(pos) != '\n') pos++; | 515 | /* Truncating: skip to newline. */ |
| 516 | while (pos < to && FETCH_CHAR (pos) != '\n') pos++; | ||
| 521 | pos--; | 517 | pos--; |
| 522 | } | 518 | } |
| 523 | else | 519 | else |
| 524 | { | 520 | { |
| 525 | cpos += (1 << SHORTBITS) - width; | 521 | /* Continuing. */ |
| 522 | vpos++; | ||
| 523 | hpos -= width; | ||
| 526 | tab_offset += width; | 524 | tab_offset += width; |
| 527 | } | 525 | } |
| 528 | 526 | ||
| @@ -530,20 +528,18 @@ compute_motion (from, fromvpos, fromhpos, to, tovpos, tohpos, width, hscroll, ta | |||
| 530 | } | 528 | } |
| 531 | 529 | ||
| 532 | val_compute_motion.bufpos = pos; | 530 | val_compute_motion.bufpos = pos; |
| 533 | val_compute_motion.hpos = HPOS (cpos); | 531 | val_compute_motion.hpos = hpos; |
| 534 | val_compute_motion.vpos = VPOS (cpos); | 532 | val_compute_motion.vpos = vpos; |
| 535 | val_compute_motion.prevhpos = HPOS (prevpos); | 533 | val_compute_motion.prevhpos = prev_hpos; |
| 536 | 534 | ||
| 537 | /* Nonzero if have just continued a line */ | 535 | /* Nonzero if have just continued a line */ |
| 538 | val_compute_motion.contin | 536 | val_compute_motion.contin |
| 539 | = pos != from | 537 | = (pos != from |
| 540 | && (val_compute_motion.vpos != VPOS (prevpos)) | 538 | && (val_compute_motion.vpos != prev_vpos) |
| 541 | && c != '\n'; | 539 | && c != '\n'); |
| 542 | 540 | ||
| 543 | return &val_compute_motion; | 541 | return &val_compute_motion; |
| 544 | } | 542 | } |
| 545 | #undef HPOS | ||
| 546 | #undef VPOS | ||
| 547 | 543 | ||
| 548 | 544 | ||
| 549 | /* Return the column of position POS in window W's buffer, | 545 | /* Return the column of position POS in window W's buffer, |
| @@ -608,7 +604,7 @@ vmotion (from, vtarget, width, hscroll, window) | |||
| 608 | prevline = find_next_newline (prevline - 1, -1); | 604 | prevline = find_next_newline (prevline - 1, -1); |
| 609 | pos = *compute_motion (prevline, 0, | 605 | pos = *compute_motion (prevline, 0, |
| 610 | lmargin + (prevline == 1 ? start_hpos : 0), | 606 | lmargin + (prevline == 1 ? start_hpos : 0), |
| 611 | from, 10000, 10000, | 607 | from, 1 << (INTBITS - 2), 0, |
| 612 | width, hscroll, 0); | 608 | width, hscroll, 0); |
| 613 | } | 609 | } |
| 614 | else | 610 | else |
| @@ -617,7 +613,7 @@ vmotion (from, vtarget, width, hscroll, window) | |||
| 617 | pos.vpos = 0; | 613 | pos.vpos = 0; |
| 618 | } | 614 | } |
| 619 | return compute_motion (from, vpos, pos.hpos, | 615 | return compute_motion (from, vpos, pos.hpos, |
| 620 | ZV, vtarget, - (1 << (SHORTBITS - 1)), | 616 | ZV, vtarget, - (1 << (INTBITS - 2)), |
| 621 | width, hscroll, pos.vpos * width); | 617 | width, hscroll, pos.vpos * width); |
| 622 | } | 618 | } |
| 623 | 619 | ||
| @@ -639,7 +635,7 @@ vmotion (from, vtarget, width, hscroll, window) | |||
| 639 | } | 635 | } |
| 640 | pos = *compute_motion (prevline, 0, | 636 | pos = *compute_motion (prevline, 0, |
| 641 | lmargin + (prevline == 1 ? start_hpos : 0), | 637 | lmargin + (prevline == 1 ? start_hpos : 0), |
| 642 | from, 10000, 10000, | 638 | from, 1 << (INTBITS - 2), 0, |
| 643 | width, hscroll, 0); | 639 | width, hscroll, 0); |
| 644 | vpos -= pos.vpos; | 640 | vpos -= pos.vpos; |
| 645 | first = 0; | 641 | first = 0; |