diff options
| author | Kenichi Handa | 2003-04-24 01:28:43 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2003-04-24 01:28:43 +0000 |
| commit | 9af7511a2adde9a3d745fd5530bd5a898b81c744 (patch) | |
| tree | 2a1d857102cc2353e2063743ab94bea13ced2118 /src | |
| parent | e3b2c21fc734645ad0cc37e708be33cff22c68b5 (diff) | |
| download | emacs-9af7511a2adde9a3d745fd5530bd5a898b81c744.tar.gz emacs-9af7511a2adde9a3d745fd5530bd5a898b81c744.zip | |
(skip_chars): Make the code faster by using the common
technique of *p, *stop, and *endp.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 5 | ||||
| -rw-r--r-- | src/syntax.c | 190 |
2 files changed, 140 insertions, 55 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 3992e51cf27..2ed1cf6fd4c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,8 @@ | |||
| 1 | 2003-04-24 Kenichi Handa <handa@m17n.org> | ||
| 2 | |||
| 3 | * syntax.c (skip_chars): Make the code faster by using the common | ||
| 4 | technique of *p, *stop, and *endp. | ||
| 5 | |||
| 1 | 2003-04-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> | 6 | 2003-04-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> |
| 2 | 7 | ||
| 3 | * xdisp.c (update_tool_bar): BLOCK_INPUT before calling | 8 | * xdisp.c (update_tool_bar): BLOCK_INPUT before calling |
diff --git a/src/syntax.c b/src/syntax.c index cd0d52f3390..dbdac11694d 100644 --- a/src/syntax.c +++ b/src/syntax.c | |||
| @@ -1504,6 +1504,18 @@ skip_chars (forwardp, syntaxp, string, lim) | |||
| 1504 | int start_point = PT; | 1504 | int start_point = PT; |
| 1505 | int pos = PT; | 1505 | int pos = PT; |
| 1506 | int pos_byte = PT_BYTE; | 1506 | int pos_byte = PT_BYTE; |
| 1507 | unsigned char *p = PT_ADDR, *endp, *stop; | ||
| 1508 | |||
| 1509 | if (forwardp) | ||
| 1510 | { | ||
| 1511 | endp = (XINT (lim) == GPT) ? GPT_ADDR : CHAR_POS_ADDR (XINT (lim)); | ||
| 1512 | stop = (pos < GPT && GPT < XINT (lim)) ? GPT_ADDR : endp; | ||
| 1513 | } | ||
| 1514 | else | ||
| 1515 | { | ||
| 1516 | endp = CHAR_POS_ADDR (XINT (lim)); | ||
| 1517 | stop = (pos >= GPT && GPT > XINT (lim)) ? GAP_END_ADDR : endp; | ||
| 1518 | } | ||
| 1507 | 1519 | ||
| 1508 | immediate_quit = 1; | 1520 | immediate_quit = 1; |
| 1509 | if (syntaxp) | 1521 | if (syntaxp) |
| @@ -1512,60 +1524,85 @@ skip_chars (forwardp, syntaxp, string, lim) | |||
| 1512 | if (forwardp) | 1524 | if (forwardp) |
| 1513 | { | 1525 | { |
| 1514 | if (multibyte) | 1526 | if (multibyte) |
| 1515 | { | 1527 | while (1) |
| 1516 | if (pos < XINT (lim)) | 1528 | { |
| 1517 | while (fastmap[(int) SYNTAX (FETCH_CHAR (pos_byte))]) | 1529 | int nbytes; |
| 1530 | |||
| 1531 | if (p >= stop) | ||
| 1518 | { | 1532 | { |
| 1519 | /* Since we already checked for multibyteness, | 1533 | if (p >= endp) |
| 1520 | avoid using INC_BOTH which checks again. */ | 1534 | break; |
| 1521 | INC_POS (pos_byte); | 1535 | p = GAP_END_ADDR; |
| 1522 | pos++; | 1536 | stop = endp; |
| 1523 | if (pos >= XINT (lim)) | ||
| 1524 | break; | ||
| 1525 | UPDATE_SYNTAX_TABLE_FORWARD (pos); | ||
| 1526 | } | 1537 | } |
| 1527 | } | 1538 | c = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, nbytes); |
| 1539 | if (! fastmap[(int) SYNTAX (c)]) | ||
| 1540 | break; | ||
| 1541 | p += nbytes, pos++, pos_byte += nbytes; | ||
| 1542 | UPDATE_SYNTAX_TABLE_FORWARD (pos); | ||
| 1543 | } | ||
| 1528 | else | 1544 | else |
| 1529 | { | 1545 | while (1) |
| 1530 | while (pos < XINT (lim) | 1546 | { |
| 1531 | && fastmap[(int) SYNTAX (FETCH_BYTE (pos))]) | 1547 | if (p >= stop) |
| 1532 | { | 1548 | { |
| 1533 | pos++; | 1549 | if (p >= endp) |
| 1534 | UPDATE_SYNTAX_TABLE_FORWARD (pos); | 1550 | break; |
| 1535 | } | 1551 | p = GAP_END_ADDR; |
| 1536 | } | 1552 | stop = endp; |
| 1553 | } | ||
| 1554 | if (! fastmap[(int) SYNTAX (*p)]) | ||
| 1555 | break; | ||
| 1556 | p++, pos++; | ||
| 1557 | UPDATE_SYNTAX_TABLE_FORWARD (pos); | ||
| 1558 | } | ||
| 1537 | } | 1559 | } |
| 1538 | else | 1560 | else |
| 1539 | { | 1561 | { |
| 1540 | if (multibyte) | 1562 | if (multibyte) |
| 1541 | { | 1563 | while (1) |
| 1542 | while (pos > XINT (lim)) | 1564 | { |
| 1543 | { | 1565 | unsigned char *prev_p; |
| 1544 | int savepos = pos_byte; | 1566 | int nbytes; |
| 1545 | /* Since we already checked for multibyteness, | 1567 | |
| 1546 | avoid using DEC_BOTH which checks again. */ | 1568 | if (p <= stop) |
| 1547 | pos--; | 1569 | { |
| 1548 | DEC_POS (pos_byte); | 1570 | if (p <= endp) |
| 1549 | UPDATE_SYNTAX_TABLE_BACKWARD (pos); | ||
| 1550 | if (!fastmap[(int) SYNTAX (FETCH_CHAR (pos_byte))]) | ||
| 1551 | { | ||
| 1552 | pos++; | ||
| 1553 | pos_byte = savepos; | ||
| 1554 | break; | 1571 | break; |
| 1555 | } | 1572 | p = GPT_ADDR; |
| 1556 | } | 1573 | stop = endp; |
| 1557 | } | 1574 | } |
| 1575 | prev_p = p; | ||
| 1576 | while (--p >= stop && ! CHAR_HEAD_P (*p)); | ||
| 1577 | PARSE_MULTIBYTE_SEQ (p, MAX_MULTIBYTE_LENGTH, nbytes); | ||
| 1578 | if (prev_p - p > nbytes) | ||
| 1579 | p = prev_p - 1, c = *p, nbytes = 1; | ||
| 1580 | else | ||
| 1581 | c = STRING_CHAR (p, MAX_MULTIBYTE_LENGTH); | ||
| 1582 | pos--, pos_byte -= nbytes; | ||
| 1583 | UPDATE_SYNTAX_TABLE_BACKWARD (pos); | ||
| 1584 | if (! fastmap[(int) SYNTAX (c)]) | ||
| 1585 | { | ||
| 1586 | pos++; | ||
| 1587 | pos_byte += nbytes; | ||
| 1588 | break; | ||
| 1589 | } | ||
| 1590 | } | ||
| 1558 | else | 1591 | else |
| 1559 | { | 1592 | while (1) |
| 1560 | if (pos > XINT (lim)) | 1593 | { |
| 1561 | while (fastmap[(int) SYNTAX (FETCH_BYTE (pos - 1))]) | 1594 | if (p <= stop) |
| 1562 | { | 1595 | { |
| 1563 | pos--; | 1596 | if (p <= endp) |
| 1564 | if (pos <= XINT (lim)) | ||
| 1565 | break; | 1597 | break; |
| 1566 | UPDATE_SYNTAX_TABLE_BACKWARD (pos - 1); | 1598 | p = GPT_ADDR; |
| 1599 | stop = endp; | ||
| 1567 | } | 1600 | } |
| 1568 | } | 1601 | if (! fastmap[(int) SYNTAX (p[-1])]) |
| 1602 | break; | ||
| 1603 | p--, pos--; | ||
| 1604 | UPDATE_SYNTAX_TABLE_BACKWARD (pos - 1); | ||
| 1605 | } | ||
| 1569 | } | 1606 | } |
| 1570 | } | 1607 | } |
| 1571 | else | 1608 | else |
| @@ -1573,9 +1610,18 @@ skip_chars (forwardp, syntaxp, string, lim) | |||
| 1573 | if (forwardp) | 1610 | if (forwardp) |
| 1574 | { | 1611 | { |
| 1575 | if (multibyte) | 1612 | if (multibyte) |
| 1576 | while (pos < XINT (lim)) | 1613 | while (1) |
| 1577 | { | 1614 | { |
| 1578 | c = FETCH_MULTIBYTE_CHAR (pos_byte); | 1615 | int nbytes; |
| 1616 | |||
| 1617 | if (p >= stop) | ||
| 1618 | { | ||
| 1619 | if (p >= endp) | ||
| 1620 | break; | ||
| 1621 | p = GAP_END_ADDR; | ||
| 1622 | stop = endp; | ||
| 1623 | } | ||
| 1624 | c = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, nbytes); | ||
| 1579 | if (SINGLE_BYTE_CHAR_P (c)) | 1625 | if (SINGLE_BYTE_CHAR_P (c)) |
| 1580 | { | 1626 | { |
| 1581 | if (!fastmap[c]) | 1627 | if (!fastmap[c]) |
| @@ -1598,21 +1644,45 @@ skip_chars (forwardp, syntaxp, string, lim) | |||
| 1598 | if (!(negate ^ (i < n_char_ranges))) | 1644 | if (!(negate ^ (i < n_char_ranges))) |
| 1599 | break; | 1645 | break; |
| 1600 | } | 1646 | } |
| 1601 | INC_BOTH (pos, pos_byte); | 1647 | p += nbytes, pos++, pos_byte += nbytes; |
| 1602 | } | 1648 | } |
| 1603 | else | 1649 | else |
| 1604 | while (pos < XINT (lim) && fastmap[FETCH_BYTE (pos)]) | 1650 | while (1) |
| 1605 | pos++; | 1651 | { |
| 1652 | if (p >= stop) | ||
| 1653 | { | ||
| 1654 | if (p >= endp) | ||
| 1655 | break; | ||
| 1656 | p = GAP_END_ADDR; | ||
| 1657 | stop = endp; | ||
| 1658 | } | ||
| 1659 | if (fastmap[*p]) | ||
| 1660 | break; | ||
| 1661 | p++, pos++; | ||
| 1662 | } | ||
| 1606 | } | 1663 | } |
| 1607 | else | 1664 | else |
| 1608 | { | 1665 | { |
| 1609 | if (multibyte) | 1666 | if (multibyte) |
| 1610 | while (pos > XINT (lim)) | 1667 | while (1) |
| 1611 | { | 1668 | { |
| 1612 | int prev_pos_byte = pos_byte; | 1669 | unsigned char *prev_p; |
| 1670 | int nbytes; | ||
| 1613 | 1671 | ||
| 1614 | DEC_POS (prev_pos_byte); | 1672 | if (p <= stop) |
| 1615 | c = FETCH_MULTIBYTE_CHAR (prev_pos_byte); | 1673 | { |
| 1674 | if (p <= endp) | ||
| 1675 | break; | ||
| 1676 | p = GPT_ADDR; | ||
| 1677 | stop = endp; | ||
| 1678 | } | ||
| 1679 | prev_p = p; | ||
| 1680 | while (--p >= stop && ! CHAR_HEAD_P (*p)); | ||
| 1681 | PARSE_MULTIBYTE_SEQ (p, MAX_MULTIBYTE_LENGTH, nbytes); | ||
| 1682 | if (prev_p - p > nbytes) | ||
| 1683 | p = prev_p - 1, c = *p, nbytes = 1; | ||
| 1684 | else | ||
| 1685 | c = STRING_CHAR (p, MAX_MULTIBYTE_LENGTH); | ||
| 1616 | if (SINGLE_BYTE_CHAR_P (c)) | 1686 | if (SINGLE_BYTE_CHAR_P (c)) |
| 1617 | { | 1687 | { |
| 1618 | if (!fastmap[c]) | 1688 | if (!fastmap[c]) |
| @@ -1627,12 +1697,22 @@ skip_chars (forwardp, syntaxp, string, lim) | |||
| 1627 | if (!(negate ^ (i < n_char_ranges))) | 1697 | if (!(negate ^ (i < n_char_ranges))) |
| 1628 | break; | 1698 | break; |
| 1629 | } | 1699 | } |
| 1630 | pos--; | 1700 | pos--, pos_byte -= nbytes; |
| 1631 | pos_byte = prev_pos_byte; | ||
| 1632 | } | 1701 | } |
| 1633 | else | 1702 | else |
| 1634 | while (pos > XINT (lim) && fastmap[FETCH_BYTE (pos - 1)]) | 1703 | while (1) |
| 1635 | pos--; | 1704 | { |
| 1705 | if (p <= stop) | ||
| 1706 | { | ||
| 1707 | if (p <= endp) | ||
| 1708 | break; | ||
| 1709 | p = GPT_ADDR; | ||
| 1710 | stop = endp; | ||
| 1711 | } | ||
| 1712 | if (fastmap[p[-1]]) | ||
| 1713 | break; | ||
| 1714 | p--, pos--; | ||
| 1715 | } | ||
| 1636 | } | 1716 | } |
| 1637 | } | 1717 | } |
| 1638 | 1718 | ||