aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2002-05-30 00:27:27 +0000
committerKenichi Handa2002-05-30 00:27:27 +0000
commit820ee2499687148f4a067f6b7fdc8c8b848c9c06 (patch)
tree86f0bb2b2055aa29b8b80f05154ac31b681cec06 /src
parent315c0139fbe03bda13d8b287ac1e315fc053caf0 (diff)
downloademacs-820ee2499687148f4a067f6b7fdc8c8b848c9c06.tar.gz
emacs-820ee2499687148f4a067f6b7fdc8c8b848c9c06.zip
(CODE_POINT_TO_INDEX): Take charset->char_index_offset
into account. (INDEX_TO_CODE_POINT): Likewise. (Fdefine_charset_internal): Handle args[charset_arg_min_code] and args[charset_arg_max_code]. Setup charset.char_index_offset. (syms_of_charset): Fix args to Fdefine_charset_internal.
Diffstat (limited to 'src')
-rw-r--r--src/charset.c130
1 files changed, 98 insertions, 32 deletions
diff --git a/src/charset.c b/src/charset.c
index 23bf78e33d3..a10fa21b2bc 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -131,25 +131,28 @@ Lisp_Object Vchar_unified_charset_table;
131 * (charset)->code_space[7]) \ 131 * (charset)->code_space[7]) \
132 + (((((code) >> 8) & 0xFF) - (charset)->code_space[4]) \ 132 + (((((code) >> 8) & 0xFF) - (charset)->code_space[4]) \
133 * (charset)->code_space[3]) \ 133 * (charset)->code_space[3]) \
134 + (((code) & 0xFF) - (charset)->code_space[0])) \ 134 + (((code) & 0xFF) - (charset)->code_space[0]) \
135 - ((charset)->char_index_offset)) \
135 : -1) 136 : -1)
136 137
137 138
138/* Convert the character index IDX to code-point CODE for CHARSET. 139/* Convert the character index IDX to code-point CODE for CHARSET.
139 It is assumed that IDX is in a valid range. */ 140 It is assumed that IDX is in a valid range. */
140 141
141#define INDEX_TO_CODE_POINT(charset, idx) \ 142#define INDEX_TO_CODE_POINT(charset, idx) \
142 ((charset)->code_linear_p \ 143 ((charset)->code_linear_p \
143 ? (idx) + (charset)->min_code \ 144 ? (idx) + (charset)->min_code \
144 : (((charset)->code_space[0] + (idx) % (charset)->code_space[2]) \ 145 : (idx += (charset)->char_index_offset, \
145 | (((charset)->code_space[4] \ 146 (((charset)->code_space[0] + (idx) % (charset)->code_space[2]) \
146 + ((idx) / (charset)->code_space[3] % (charset)->code_space[6])) \ 147 | (((charset)->code_space[4] \
147 << 8) \ 148 + ((idx) / (charset)->code_space[3] % (charset)->code_space[6])) \
148 | (((charset)->code_space[8] \ 149 << 8) \
149 + ((idx) / (charset)->code_space[7] % (charset)->code_space[10])) \ 150 | (((charset)->code_space[8] \
150 << 16) \ 151 + ((idx) / (charset)->code_space[7] % (charset)->code_space[10])) \
151 | (((charset)->code_space[12] + ((idx) / (charset)->code_space[11])) \ 152 << 16) \
152 << 24))) 153 | (((charset)->code_space[12] + ((idx) / (charset)->code_space[11])) \
154 << 24))))
155
153 156
154 157
155 158
@@ -736,6 +739,50 @@ usage: (define-charset-internal ...) */)
736 | (charset.code_space[5] << 8) 739 | (charset.code_space[5] << 8)
737 | (charset.code_space[9] << 16) 740 | (charset.code_space[9] << 16)
738 | (charset.code_space[13] << 24)); 741 | (charset.code_space[13] << 24));
742 charset.char_index_offset = 0;
743
744 val = args[charset_arg_min_code];
745 if (! NILP (val))
746 {
747 unsigned code;
748
749 if (INTEGERP (val))
750 code = XINT (val);
751 else
752 {
753 CHECK_CONS (val);
754 CHECK_NUMBER (XCAR (val));
755 CHECK_NUMBER (XCDR (val));
756 code = (XINT (XCAR (val)) << 16) | (XINT (XCDR (val)));
757 }
758 if (code < charset.min_code
759 || code > charset.max_code)
760 args_out_of_range_3 (make_number (charset.min_code),
761 make_number (charset.max_code), val);
762 charset.char_index_offset = CODE_POINT_TO_INDEX (&charset, code);
763 charset.min_code = code;
764 }
765
766 val = args[charset_arg_max_code];
767 if (! NILP (val))
768 {
769 unsigned code;
770
771 if (INTEGERP (val))
772 code = XINT (val);
773 else
774 {
775 CHECK_CONS (val);
776 CHECK_NUMBER (XCAR (val));
777 CHECK_NUMBER (XCDR (val));
778 code = (XINT (XCAR (val)) << 16) | (XINT (XCDR (val)));
779 }
780 if (code < charset.min_code
781 || code > charset.max_code)
782 args_out_of_range_3 (make_number (charset.min_code),
783 make_number (charset.max_code), val);
784 charset.max_code = code;
785 }
739 786
740 charset.compact_codes_p = charset.max_code < 0x1000000; 787 charset.compact_codes_p = charset.max_code < 0x1000000;
741 788
@@ -1405,7 +1452,7 @@ encode_char (charset, c)
1405 if (! CHARSET_COMPACT_CODES_P (charset)) 1452 if (! CHARSET_COMPACT_CODES_P (charset))
1406 code = INDEX_TO_CODE_POINT (charset, code); 1453 code = INDEX_TO_CODE_POINT (charset, code);
1407 } 1454 }
1408 else 1455 else /* method == CHARSET_METHOD_OFFSET */
1409 { 1456 {
1410 code = c - CHARSET_CODE_OFFSET (charset); 1457 code = c - CHARSET_CODE_OFFSET (charset);
1411 code = INDEX_TO_CODE_POINT (charset, code); 1458 code = INDEX_TO_CODE_POINT (charset, code);
@@ -1868,50 +1915,69 @@ The default value is sub-directory "charsets" of `data-directory'. */);
1868 Lisp_Object val; 1915 Lisp_Object val;
1869 1916
1870 plist[0] = intern (":name"); 1917 plist[0] = intern (":name");
1871 plist[1] = args[charset_arg_name] = Qascii;
1872 plist[2] = intern (":dimension"); 1918 plist[2] = intern (":dimension");
1873 plist[3] = args[charset_arg_dimension] = make_number (1);
1874 val = Fmake_vector (make_number (8), make_number (0));
1875 ASET (val, 1, make_number (127));
1876 plist[4] = intern (":code-space"); 1919 plist[4] = intern (":code-space");
1877 plist[5] = args[charset_arg_code_space] = val;
1878 plist[6] = intern (":iso-final-char"); 1920 plist[6] = intern (":iso-final-char");
1879 plist[7] = args[charset_arg_iso_final] = make_number ('B');
1880 args[charset_arg_iso_revision] = Qnil;
1881 plist[8] = intern (":emacs-mule-id"); 1921 plist[8] = intern (":emacs-mule-id");
1882 plist[9] = args[charset_arg_emacs_mule_id] = make_number (0);
1883 plist[10] = intern (":ascii-compatible-p"); 1922 plist[10] = intern (":ascii-compatible-p");
1884 plist[11] = args[charset_arg_ascii_compatible_p] = Qt; 1923 plist[12] = intern (":code-offset");
1924
1925 args[charset_arg_name] = Qascii;
1926 args[charset_arg_dimension] = make_number (1);
1927 val = Fmake_vector (make_number (8), make_number (0));
1928 ASET (val, 1, make_number (127));
1929 args[charset_arg_code_space] = val;
1930 args[charset_arg_min_code] = Qnil;
1931 args[charset_arg_max_code] = Qnil;
1932 args[charset_arg_iso_final] = make_number ('B');
1933 args[charset_arg_iso_revision] = Qnil;
1934 args[charset_arg_emacs_mule_id] = make_number (0);
1935 args[charset_arg_ascii_compatible_p] = Qt;
1885 args[charset_arg_supplementary_p] = Qnil; 1936 args[charset_arg_supplementary_p] = Qnil;
1886 args[charset_arg_invalid_code] = Qnil; 1937 args[charset_arg_invalid_code] = Qnil;
1887 plist[12] = intern (":code-offset"); 1938 args[charset_arg_code_offset] = make_number (0);
1888 plist[13] = args[charset_arg_code_offset] = make_number (0);
1889 args[charset_arg_map] = Qnil; 1939 args[charset_arg_map] = Qnil;
1890 args[charset_arg_parents] = Qnil; 1940 args[charset_arg_parents] = Qnil;
1891 args[charset_arg_unify_map] = Qnil; 1941 args[charset_arg_unify_map] = Qnil;
1892 /* The actual plist is set by mule-conf.el. */ 1942 /* The actual plist is set by mule-conf.el. */
1943 plist[1] = args[charset_arg_name];
1944 plist[3] = args[charset_arg_dimension];
1945 plist[5] = args[charset_arg_code_space];
1946 plist[7] = args[charset_arg_iso_final];
1947 plist[9] = args[charset_arg_emacs_mule_id];
1948 plist[11] = args[charset_arg_ascii_compatible_p];
1949 plist[13] = args[charset_arg_code_offset];
1893 args[charset_arg_plist] = Flist (14, plist); 1950 args[charset_arg_plist] = Flist (14, plist);
1894 Fdefine_charset_internal (charset_arg_max, args); 1951 Fdefine_charset_internal (charset_arg_max, args);
1895 charset_ascii = CHARSET_SYMBOL_ID (Qascii); 1952 charset_ascii = CHARSET_SYMBOL_ID (Qascii);
1896 1953
1897 plist[1] = args[charset_arg_name] = Qunicode; 1954 args[charset_arg_name] = Qunicode;
1898 plist[3] = args[charset_arg_dimension] = make_number (3); 1955 args[charset_arg_dimension] = make_number (3);
1899 val = Fmake_vector (make_number (8), make_number (0)); 1956 val = Fmake_vector (make_number (8), make_number (0));
1900 ASET (val, 1, make_number (255)); 1957 ASET (val, 1, make_number (255));
1901 ASET (val, 3, make_number (255)); 1958 ASET (val, 3, make_number (255));
1902 ASET (val, 5, make_number (16)); 1959 ASET (val, 5, make_number (16));
1903 plist[5] = args[charset_arg_code_space] = val; 1960 args[charset_arg_code_space] = val;
1904 plist[7] = args[charset_arg_iso_final] = Qnil; 1961 args[charset_arg_min_code] = Qnil;
1962 args[charset_arg_max_code] = Qnil;
1963 args[charset_arg_iso_final] = Qnil;
1905 args[charset_arg_iso_revision] = Qnil; 1964 args[charset_arg_iso_revision] = Qnil;
1906 plist[9] = args[charset_arg_emacs_mule_id] = Qnil; 1965 args[charset_arg_emacs_mule_id] = Qnil;
1907 plist[11] = args[charset_arg_ascii_compatible_p] = Qt; 1966 args[charset_arg_ascii_compatible_p] = Qt;
1908 args[charset_arg_supplementary_p] = Qnil; 1967 args[charset_arg_supplementary_p] = Qnil;
1909 args[charset_arg_invalid_code] = Qnil; 1968 args[charset_arg_invalid_code] = Qnil;
1910 plist[13] = args[charset_arg_code_offset] = make_number (0); 1969 args[charset_arg_code_offset] = make_number (0);
1911 args[charset_arg_map] = Qnil; 1970 args[charset_arg_map] = Qnil;
1912 args[charset_arg_parents] = Qnil; 1971 args[charset_arg_parents] = Qnil;
1913 args[charset_arg_unify_map] = Qnil; 1972 args[charset_arg_unify_map] = Qnil;
1914 /* The actual plist is set by mule-conf.el. */ 1973 /* The actual plist is set by mule-conf.el. */
1974 plist[1] = args[charset_arg_name];
1975 plist[3] = args[charset_arg_dimension];
1976 plist[5] = args[charset_arg_code_space];
1977 plist[7] = args[charset_arg_iso_final];
1978 plist[9] = args[charset_arg_emacs_mule_id];
1979 plist[11] = args[charset_arg_ascii_compatible_p];
1980 plist[13] = args[charset_arg_code_offset];
1915 args[charset_arg_plist] = Flist (14, plist); 1981 args[charset_arg_plist] = Flist (14, plist);
1916 Fdefine_charset_internal (charset_arg_max, args); 1982 Fdefine_charset_internal (charset_arg_max, args);
1917 charset_unicode = CHARSET_SYMBOL_ID (Qunicode); 1983 charset_unicode = CHARSET_SYMBOL_ID (Qunicode);