aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2003-04-24 01:28:43 +0000
committerKenichi Handa2003-04-24 01:28:43 +0000
commit9af7511a2adde9a3d745fd5530bd5a898b81c744 (patch)
tree2a1d857102cc2353e2063743ab94bea13ced2118 /src
parente3b2c21fc734645ad0cc37e708be33cff22c68b5 (diff)
downloademacs-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/ChangeLog5
-rw-r--r--src/syntax.c190
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 @@
12003-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
12003-04-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> 62003-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