aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2014-10-03 19:33:07 +0300
committerEli Zaretskii2014-10-03 19:33:07 +0300
commit6382f0a1d64caa4a688b6a264a4693ffe93c63ca (patch)
tree19a580012583a6de610e086af3b3f4caee78bf42
parente8207eb00d5be19c9e3678cc9697504da60b68c5 (diff)
downloademacs-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.
-rw-r--r--src/bidi.c305
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;