diff options
| author | Kenichi Handa | 2002-05-30 00:27:27 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2002-05-30 00:27:27 +0000 |
| commit | 820ee2499687148f4a067f6b7fdc8c8b848c9c06 (patch) | |
| tree | 86f0bb2b2055aa29b8b80f05154ac31b681cec06 /src | |
| parent | 315c0139fbe03bda13d8b287ac1e315fc053caf0 (diff) | |
| download | emacs-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.c | 130 |
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); |