diff options
| author | Eli Zaretskii | 2014-10-03 19:33:07 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2014-10-03 19:33:07 +0300 |
| commit | 6382f0a1d64caa4a688b6a264a4693ffe93c63ca (patch) | |
| tree | 19a580012583a6de610e086af3b3f4caee78bf42 /src | |
| parent | e8207eb00d5be19c9e3678cc9697504da60b68c5 (diff) | |
| download | emacs-6382f0a1d64caa4a688b6a264a4693ffe93c63ca.tar.gz emacs-6382f0a1d64caa4a688b6a264a4693ffe93c63ca.zip | |
Fixed handling of LRI, RLI, and FSI.
Scrolled successfully through the entire biditest.txt file.
The parentheses are still not implemented.
Diffstat (limited to 'src')
| -rw-r--r-- | src/bidi.c | 305 |
1 files changed, 157 insertions, 148 deletions
diff --git a/src/bidi.c b/src/bidi.c index 1cceccf0119..aad867887b1 100644 --- a/src/bidi.c +++ b/src/bidi.c | |||
| @@ -1726,6 +1726,8 @@ bidi_resolve_explicit (struct bidi_it *bidi_it) | |||
| 1726 | { | 1726 | { |
| 1727 | eassert (bidi_it->prev.charpos == bidi_it->charpos - 1); | 1727 | eassert (bidi_it->prev.charpos == bidi_it->charpos - 1); |
| 1728 | prev_type = bidi_it->prev.orig_type; | 1728 | prev_type = bidi_it->prev.orig_type; |
| 1729 | if (prev_type == FSI) | ||
| 1730 | prev_type = bidi_it->type_after_w1; | ||
| 1729 | } | 1731 | } |
| 1730 | } | 1732 | } |
| 1731 | /* Don't move at end of buffer/string. */ | 1733 | /* Don't move at end of buffer/string. */ |
| @@ -1740,6 +1742,8 @@ bidi_resolve_explicit (struct bidi_it *bidi_it) | |||
| 1740 | emacs_abort (); | 1742 | emacs_abort (); |
| 1741 | bidi_it->bytepos += bidi_it->ch_len; | 1743 | bidi_it->bytepos += bidi_it->ch_len; |
| 1742 | prev_type = bidi_it->orig_type; | 1744 | prev_type = bidi_it->orig_type; |
| 1745 | if (prev_type == FSI) | ||
| 1746 | prev_type = bidi_it->type_after_w1; | ||
| 1743 | } | 1747 | } |
| 1744 | else /* EOB or end of string */ | 1748 | else /* EOB or end of string */ |
| 1745 | prev_type = NEUTRAL_B; | 1749 | prev_type = NEUTRAL_B; |
| @@ -1763,78 +1767,48 @@ bidi_resolve_explicit (struct bidi_it *bidi_it) | |||
| 1763 | embedding level of the _following_ characters, so we must | 1767 | embedding level of the _following_ characters, so we must |
| 1764 | first look at the type of the previous character to support | 1768 | first look at the type of the previous character to support |
| 1765 | that. */ | 1769 | that. */ |
| 1766 | switch (prev_type) | 1770 | switch (prev_type) |
| 1767 | { | 1771 | { |
| 1768 | case FSI: /* X5c */ | 1772 | case RLI: /* X5a */ |
| 1769 | end = string_p ? bidi_it->string.schars : ZV; | 1773 | if (current_level < BIDI_MAXDEPTH |
| 1770 | disp_pos = bidi_it->disp_pos; | 1774 | && bidi_it->invalid_levels == 0 |
| 1771 | disp_prop = bidi_it->disp_prop; | 1775 | && bidi_it->invalid_isolates == 0) |
| 1772 | nchars = bidi_it->nchars; | 1776 | { |
| 1773 | ch_len = bidi_it->ch_len; | 1777 | new_level = ((current_level + 1) & ~1) + 1; |
| 1774 | typ1 = find_first_strong_char (bidi_it->charpos, | 1778 | bidi_it->isolate_level++; |
| 1775 | bidi_it->bytepos, end, | 1779 | bidi_push_embedding_level (bidi_it, new_level, |
| 1776 | &disp_pos, &disp_prop, | 1780 | NEUTRAL_DIR, true); |
| 1777 | &bidi_it->string, bidi_it->w, | 1781 | } |
| 1778 | string_p, bidi_it->frame_window_p, | 1782 | else |
| 1779 | &ch_len, &nchars, true); | 1783 | bidi_it->invalid_isolates++; |
| 1780 | if (typ1 != STRONG_R && typ1 != STRONG_AL) | 1784 | break; |
| 1781 | { | 1785 | case LRI: /* X5b */ |
| 1782 | type = LRI; | 1786 | if (current_level < BIDI_MAXDEPTH - 1 |
| 1783 | goto fsi_as_lri; | 1787 | && bidi_it->invalid_levels == 0 |
| 1784 | } | 1788 | && bidi_it->invalid_isolates == 0) |
| 1785 | else | 1789 | { |
| 1786 | type = RLI; | 1790 | new_level = ((current_level + 2) & ~1); |
| 1787 | /* FALLTHROUGH */ | 1791 | bidi_it->isolate_level++; |
| 1788 | case RLI: /* X5a */ | 1792 | bidi_push_embedding_level (bidi_it, new_level, |
| 1789 | if (override == NEUTRAL_DIR) | 1793 | NEUTRAL_DIR, true); |
| 1790 | bidi_it->type_after_w1 = type; | 1794 | } |
| 1791 | else /* Unicode 8.0 correction. */ | 1795 | else |
| 1792 | bidi_it->type_after_w1 = (override == L2R ? STRONG_L : STRONG_R); | 1796 | bidi_it->invalid_isolates++; |
| 1793 | bidi_check_type (bidi_it->type_after_w1); | 1797 | break; |
| 1794 | if (current_level < BIDI_MAXDEPTH | 1798 | case PDF: /* X7 */ |
| 1795 | && bidi_it->invalid_levels == 0 | 1799 | if (!bidi_it->invalid_isolates) |
| 1796 | && bidi_it->invalid_isolates == 0) | 1800 | { |
| 1797 | { | 1801 | if (bidi_it->invalid_levels) |
| 1798 | new_level = ((current_level + 1) & ~1) + 1; | 1802 | bidi_it->invalid_levels--; |
| 1799 | bidi_it->isolate_level++; | 1803 | else if (!isolate_status && bidi_it->stack_idx >= 1) |
| 1800 | bidi_push_embedding_level (bidi_it, new_level, | 1804 | new_level = bidi_pop_embedding_level (bidi_it); |
| 1801 | NEUTRAL_DIR, true); | 1805 | } |
| 1802 | } | 1806 | break; |
| 1803 | else | 1807 | default: |
| 1804 | bidi_it->invalid_isolates++; | 1808 | eassert (prev_type != FSI); |
| 1805 | break; | 1809 | /* Nothing. */ |
| 1806 | case LRI: /* X5b */ | 1810 | break; |
| 1807 | fsi_as_lri: | 1811 | } |
| 1808 | if (override == NEUTRAL_DIR) | ||
| 1809 | bidi_it->type_after_w1 = type; | ||
| 1810 | else /* Unicode 8.0 correction. */ | ||
| 1811 | bidi_it->type_after_w1 = (override == L2R ? STRONG_L : STRONG_R); | ||
| 1812 | bidi_check_type (bidi_it->type_after_w1); | ||
| 1813 | if (current_level < BIDI_MAXDEPTH - 1 | ||
| 1814 | && bidi_it->invalid_levels == 0 | ||
| 1815 | && bidi_it->invalid_isolates == 0) | ||
| 1816 | { | ||
| 1817 | new_level = ((current_level + 2) & ~1); | ||
| 1818 | bidi_it->isolate_level++; | ||
| 1819 | bidi_push_embedding_level (bidi_it, new_level, | ||
| 1820 | NEUTRAL_DIR, true); | ||
| 1821 | } | ||
| 1822 | else | ||
| 1823 | bidi_it->invalid_isolates++; | ||
| 1824 | break; | ||
| 1825 | case PDF: /* X7 */ | ||
| 1826 | if (!bidi_it->invalid_isolates) | ||
| 1827 | { | ||
| 1828 | if (bidi_it->invalid_levels) | ||
| 1829 | bidi_it->invalid_levels--; | ||
| 1830 | else if (!isolate_status && bidi_it->stack_idx >= 1) | ||
| 1831 | new_level = bidi_pop_embedding_level (bidi_it); | ||
| 1832 | } | ||
| 1833 | break; | ||
| 1834 | default: | ||
| 1835 | /* Nothing. */ | ||
| 1836 | break; | ||
| 1837 | } | ||
| 1838 | /* Fetch the character at BYTEPOS. If it is covered by a | 1812 | /* Fetch the character at BYTEPOS. If it is covered by a |
| 1839 | display string, treat the entire run of covered characters as | 1813 | display string, treat the entire run of covered characters as |
| 1840 | a single character u+FFFC. */ | 1814 | a single character u+FFFC. */ |
| @@ -1859,85 +1833,120 @@ bidi_resolve_explicit (struct bidi_it *bidi_it) | |||
| 1859 | 1833 | ||
| 1860 | switch (type) | 1834 | switch (type) |
| 1861 | { | 1835 | { |
| 1862 | case RLE: /* X2 */ | 1836 | case RLE: /* X2 */ |
| 1863 | case RLO: /* X4 */ | 1837 | case RLO: /* X4 */ |
| 1838 | bidi_it->type_after_w1 = type; | ||
| 1839 | bidi_check_type (bidi_it->type_after_w1); | ||
| 1840 | type = WEAK_BN; /* X9/Retaining */ | ||
| 1841 | if (new_level < BIDI_MAXDEPTH | ||
| 1842 | && bidi_it->invalid_levels == 0 | ||
| 1843 | && bidi_it->invalid_isolates == 0) | ||
| 1844 | { | ||
| 1845 | /* Compute the least odd embedding level greater than | ||
| 1846 | the current level. */ | ||
| 1847 | new_level = ((new_level + 1) & ~1) + 1; | ||
| 1848 | if (bidi_it->type_after_w1 == RLE) | ||
| 1849 | override = NEUTRAL_DIR; | ||
| 1850 | else | ||
| 1851 | override = R2L; | ||
| 1852 | bidi_push_embedding_level (bidi_it, new_level, override, false); | ||
| 1853 | bidi_it->resolved_level = new_level; | ||
| 1854 | } | ||
| 1855 | else | ||
| 1856 | { | ||
| 1857 | if (bidi_it->invalid_isolates == 0) | ||
| 1858 | bidi_it->invalid_levels++; | ||
| 1859 | } | ||
| 1860 | break; | ||
| 1861 | case LRE: /* X3 */ | ||
| 1862 | case LRO: /* X5 */ | ||
| 1863 | bidi_it->type_after_w1 = type; | ||
| 1864 | bidi_check_type (bidi_it->type_after_w1); | ||
| 1865 | type = WEAK_BN; /* X9/Retaining */ | ||
| 1866 | if (new_level < BIDI_MAXDEPTH - 1 | ||
| 1867 | && bidi_it->invalid_levels == 0 | ||
| 1868 | && bidi_it->invalid_isolates == 0) | ||
| 1869 | { | ||
| 1870 | /* Compute the least even embedding level greater than | ||
| 1871 | the current level. */ | ||
| 1872 | new_level = ((new_level + 2) & ~1); | ||
| 1873 | if (bidi_it->type_after_w1 == LRE) | ||
| 1874 | override = NEUTRAL_DIR; | ||
| 1875 | else | ||
| 1876 | override = L2R; | ||
| 1877 | bidi_push_embedding_level (bidi_it, new_level, override, false); | ||
| 1878 | bidi_it->resolved_level = new_level; | ||
| 1879 | } | ||
| 1880 | else | ||
| 1881 | { | ||
| 1882 | if (bidi_it->invalid_isolates == 0) | ||
| 1883 | bidi_it->invalid_levels++; | ||
| 1884 | } | ||
| 1885 | break; | ||
| 1886 | case FSI: /* X5c */ | ||
| 1887 | end = string_p ? bidi_it->string.schars : ZV; | ||
| 1888 | disp_pos = bidi_it->disp_pos; | ||
| 1889 | disp_prop = bidi_it->disp_prop; | ||
| 1890 | nchars = bidi_it->nchars; | ||
| 1891 | ch_len = bidi_it->ch_len; | ||
| 1892 | typ1 = find_first_strong_char (bidi_it->charpos, | ||
| 1893 | bidi_it->bytepos, end, | ||
| 1894 | &disp_pos, &disp_prop, | ||
| 1895 | &bidi_it->string, bidi_it->w, | ||
| 1896 | string_p, bidi_it->frame_window_p, | ||
| 1897 | &ch_len, &nchars, true); | ||
| 1898 | if (typ1 != STRONG_R && typ1 != STRONG_AL) | ||
| 1899 | { | ||
| 1900 | type = LRI; | ||
| 1901 | goto fsi_as_lri; | ||
| 1902 | } | ||
| 1903 | else | ||
| 1904 | type = RLI; | ||
| 1905 | /* FALLTHROUGH */ | ||
| 1906 | case RLI: /* X5a */ | ||
| 1907 | if (override == NEUTRAL_DIR) | ||
| 1864 | bidi_it->type_after_w1 = type; | 1908 | bidi_it->type_after_w1 = type; |
| 1865 | bidi_check_type (bidi_it->type_after_w1); | 1909 | else /* Unicode 8.0 correction. */ |
| 1866 | type = WEAK_BN; /* X9/Retaining */ | 1910 | bidi_it->type_after_w1 = (override == L2R ? STRONG_L : STRONG_R); |
| 1867 | if (new_level < BIDI_MAXDEPTH | 1911 | bidi_check_type (bidi_it->type_after_w1); |
| 1868 | && bidi_it->invalid_levels == 0 | 1912 | break; |
| 1869 | && bidi_it->invalid_isolates == 0) | 1913 | case LRI: /* X5b */ |
| 1870 | { | 1914 | fsi_as_lri: |
| 1871 | /* Compute the least odd embedding level greater than | 1915 | if (override == NEUTRAL_DIR) |
| 1872 | the current level. */ | ||
| 1873 | new_level = ((new_level + 1) & ~1) + 1; | ||
| 1874 | if (bidi_it->type_after_w1 == RLE) | ||
| 1875 | override = NEUTRAL_DIR; | ||
| 1876 | else | ||
| 1877 | override = R2L; | ||
| 1878 | bidi_push_embedding_level (bidi_it, new_level, override, false); | ||
| 1879 | bidi_it->resolved_level = new_level; | ||
| 1880 | } | ||
| 1881 | else | ||
| 1882 | { | ||
| 1883 | if (bidi_it->invalid_isolates == 0) | ||
| 1884 | bidi_it->invalid_levels++; | ||
| 1885 | } | ||
| 1886 | break; | ||
| 1887 | case LRE: /* X3 */ | ||
| 1888 | case LRO: /* X5 */ | ||
| 1889 | bidi_it->type_after_w1 = type; | 1916 | bidi_it->type_after_w1 = type; |
| 1890 | bidi_check_type (bidi_it->type_after_w1); | 1917 | else /* Unicode 8.0 correction. */ |
| 1891 | type = WEAK_BN; /* X9/Retaining */ | 1918 | bidi_it->type_after_w1 = (override == L2R ? STRONG_L : STRONG_R); |
| 1892 | if (new_level < BIDI_MAXDEPTH - 1 | 1919 | bidi_check_type (bidi_it->type_after_w1); |
| 1893 | && bidi_it->invalid_levels == 0 | 1920 | break; |
| 1894 | && bidi_it->invalid_isolates == 0) | 1921 | case PDI: /* X6a */ |
| 1895 | { | 1922 | if (bidi_it->invalid_isolates) |
| 1896 | /* Compute the least even embedding level greater than | 1923 | bidi_it->invalid_isolates--; |
| 1897 | the current level. */ | 1924 | else if (bidi_it->isolate_level > 0) |
| 1898 | new_level = ((new_level + 2) & ~1); | 1925 | { |
| 1899 | if (bidi_it->type_after_w1 == LRE) | 1926 | bidi_it->invalid_levels = 0; |
| 1900 | override = NEUTRAL_DIR; | 1927 | while (!bidi_it->level_stack[bidi_it->stack_idx].isolate_status) |
| 1901 | else | 1928 | bidi_pop_embedding_level (bidi_it); |
| 1902 | override = L2R; | 1929 | eassert (bidi_it->stack_idx > 0); |
| 1903 | bidi_push_embedding_level (bidi_it, new_level, override, false); | 1930 | new_level = bidi_pop_embedding_level (bidi_it); |
| 1904 | bidi_it->resolved_level = new_level; | 1931 | bidi_it->isolate_level--; |
| 1905 | } | 1932 | } |
| 1906 | else | 1933 | bidi_it->resolved_level = new_level; |
| 1907 | { | 1934 | /* Unicode 8.0 correction. */ |
| 1908 | if (bidi_it->invalid_isolates == 0) | 1935 | if (bidi_it->level_stack[bidi_it->stack_idx].override == L2R) |
| 1909 | bidi_it->invalid_levels++; | 1936 | bidi_it->type_after_w1 = STRONG_L; |
| 1910 | } | 1937 | else if (bidi_it->level_stack[bidi_it->stack_idx].override == R2L) |
| 1911 | break; | 1938 | bidi_it->type_after_w1 = STRONG_R; |
| 1912 | case PDI: /* X6a */ | 1939 | else |
| 1913 | if (bidi_it->invalid_isolates) | ||
| 1914 | bidi_it->invalid_isolates--; | ||
| 1915 | else if (bidi_it->isolate_level > 0) | ||
| 1916 | { | ||
| 1917 | bidi_it->invalid_levels = 0; | ||
| 1918 | while (!bidi_it->level_stack[bidi_it->stack_idx].isolate_status) | ||
| 1919 | bidi_pop_embedding_level (bidi_it); | ||
| 1920 | eassert (bidi_it->stack_idx > 0); | ||
| 1921 | new_level = bidi_pop_embedding_level (bidi_it); | ||
| 1922 | bidi_it->isolate_level--; | ||
| 1923 | } | ||
| 1924 | bidi_it->resolved_level = new_level; | ||
| 1925 | /* Unicode 8.0 correction. */ | ||
| 1926 | if (bidi_it->level_stack[bidi_it->stack_idx].override == L2R) | ||
| 1927 | bidi_it->type_after_w1 = STRONG_L; | ||
| 1928 | else if (bidi_it->level_stack[bidi_it->stack_idx].override == R2L) | ||
| 1929 | bidi_it->type_after_w1 = STRONG_R; | ||
| 1930 | else | ||
| 1931 | bidi_it->type_after_w1 = type; | ||
| 1932 | break; | ||
| 1933 | case PDF: /* X7 */ | ||
| 1934 | bidi_it->type_after_w1 = type; | 1940 | bidi_it->type_after_w1 = type; |
| 1935 | bidi_check_type (bidi_it->type_after_w1); | 1941 | break; |
| 1936 | type = WEAK_BN; /* X9/Retaining */ | 1942 | case PDF: /* X7 */ |
| 1937 | break; | 1943 | bidi_it->type_after_w1 = type; |
| 1938 | default: | 1944 | bidi_check_type (bidi_it->type_after_w1); |
| 1939 | /* Nothing. */ | 1945 | type = WEAK_BN; /* X9/Retaining */ |
| 1940 | break; | 1946 | break; |
| 1947 | default: | ||
| 1948 | /* Nothing. */ | ||
| 1949 | break; | ||
| 1941 | } | 1950 | } |
| 1942 | 1951 | ||
| 1943 | bidi_it->type = type; | 1952 | bidi_it->type = type; |