comparison src/fns.c @ 88375:38cab5bfa62b

Include "character.h" instead of "charset.h". (copy_sub_char_table): Moved to chartab.c. (Fcopy_sequence): Call copy_char_table for a char table. (concat): Delete codes calling count_multibyte. (string_char_to_byte): Adjusted for the new multibyte form. (string_byte_to_char): Likewise. (internal_equal): Adjusted for the change of char table structure. (Fchar_table_subtype, Fchar_table_parent, Fset_char_table_parent, Fchar_table_extra_slot, Fset_char_table_extra_slot, Fchar_table_range, Fset_char_table_range, Fset_char_table_default, char_table_translate, optimize_sub_char_table, Foptimize_char_table, map_char_table, Fmap_char_table): Moved to chartab.c. (char_table_ref_and_index): Deleted. (HASH_KEY, HASH_VALUE): Moved to lisp.h. (Fmd5): Call preferred_coding_system instead of accessing Vcoding_category_list. Adjusted for the new code-conversion API. (syms_of_fns): Defsubr for char table related functions moved to chartab.c.
author Kenichi Handa <handa@m17n.org>
date Fri, 01 Mar 2002 01:39:56 +0000
parents fd83ec62a495
children b908df09ec8a
comparison
equal deleted inserted replaced
88374:fa717c37ad16 88375:38cab5bfa62b
31 #undef vector 31 #undef vector
32 #define vector ***** 32 #define vector *****
33 33
34 #include "lisp.h" 34 #include "lisp.h"
35 #include "commands.h" 35 #include "commands.h"
36 #include "charset.h" 36 #include "character.h"
37 37
38 #include "buffer.h" 38 #include "buffer.h"
39 #include "keyboard.h" 39 #include "keyboard.h"
40 #include "keymap.h" 40 #include "keymap.h"
41 #include "intervals.h" 41 #include "intervals.h"
441 Lisp_Object *args; 441 Lisp_Object *args;
442 { 442 {
443 return concat (nargs, args, Lisp_Vectorlike, 0); 443 return concat (nargs, args, Lisp_Vectorlike, 0);
444 } 444 }
445 445
446 /* Retrun a copy of a sub char table ARG. The elements except for a
447 nested sub char table are not copied. */
448 static Lisp_Object
449 copy_sub_char_table (arg)
450 Lisp_Object arg;
451 {
452 Lisp_Object copy = make_sub_char_table (XCHAR_TABLE (arg)->defalt);
453 int i;
454
455 /* Copy all the contents. */
456 bcopy (XCHAR_TABLE (arg)->contents, XCHAR_TABLE (copy)->contents,
457 SUB_CHAR_TABLE_ORDINARY_SLOTS * sizeof (Lisp_Object));
458 /* Recursively copy any sub char-tables in the ordinary slots. */
459 for (i = 32; i < SUB_CHAR_TABLE_ORDINARY_SLOTS; i++)
460 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
461 XCHAR_TABLE (copy)->contents[i]
462 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
463
464 return copy;
465 }
466
467 446
468 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0, 447 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0,
469 doc: /* Return a copy of a list, vector or string. 448 doc: /* Return a copy of a list, vector or string.
470 The elements of a list or vector are not copied; they are shared 449 The elements of a list or vector are not copied; they are shared
471 with the original. */) 450 with the original. */)
474 { 453 {
475 if (NILP (arg)) return arg; 454 if (NILP (arg)) return arg;
476 455
477 if (CHAR_TABLE_P (arg)) 456 if (CHAR_TABLE_P (arg))
478 { 457 {
479 int i; 458 return copy_char_table (arg);
480 Lisp_Object copy; 459 }
481
482 copy = Fmake_char_table (XCHAR_TABLE (arg)->purpose, Qnil);
483 /* Copy all the slots, including the extra ones. */
484 bcopy (XVECTOR (arg)->contents, XVECTOR (copy)->contents,
485 ((XCHAR_TABLE (arg)->size & PSEUDOVECTOR_SIZE_MASK)
486 * sizeof (Lisp_Object)));
487
488 /* Recursively copy any sub char tables in the ordinary slots
489 for multibyte characters. */
490 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS;
491 i < CHAR_TABLE_ORDINARY_SLOTS; i++)
492 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
493 XCHAR_TABLE (copy)->contents[i]
494 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
495
496 return copy;
497 }
498
499 if (BOOL_VECTOR_P (arg)) 460 if (BOOL_VECTOR_P (arg))
500 { 461 {
501 Lisp_Object val; 462 Lisp_Object val;
502 int size_in_chars 463 int size_in_chars
503 = (XBOOL_VECTOR (arg)->size + BITS_PER_CHAR - 1) / BITS_PER_CHAR; 464 = (XBOOL_VECTOR (arg)->size + BITS_PER_CHAR - 1) / BITS_PER_CHAR;
694 /* Between strings of the same kind, copy fast. */ 655 /* Between strings of the same kind, copy fast. */
695 if (STRINGP (this) && STRINGP (val) 656 if (STRINGP (this) && STRINGP (val)
696 && STRING_MULTIBYTE (this) == some_multibyte) 657 && STRING_MULTIBYTE (this) == some_multibyte)
697 { 658 {
698 int thislen_byte = STRING_BYTES (XSTRING (this)); 659 int thislen_byte = STRING_BYTES (XSTRING (this));
699 int combined;
700 660
701 bcopy (XSTRING (this)->data, XSTRING (val)->data + toindex_byte, 661 bcopy (XSTRING (this)->data, XSTRING (val)->data + toindex_byte,
702 STRING_BYTES (XSTRING (this))); 662 STRING_BYTES (XSTRING (this)));
703 combined = (some_multibyte && toindex_byte > 0
704 ? count_combining (XSTRING (val)->data,
705 toindex_byte + thislen_byte,
706 toindex_byte)
707 : 0);
708 if (! NULL_INTERVAL_P (XSTRING (this)->intervals)) 663 if (! NULL_INTERVAL_P (XSTRING (this)->intervals))
709 { 664 {
710 textprops[num_textprops].argnum = argnum; 665 textprops[num_textprops].argnum = argnum;
711 /* We ignore text properties on characters being combined. */ 666 textprops[num_textprops].from = 0;
712 textprops[num_textprops].from = combined;
713 textprops[num_textprops++].to = toindex; 667 textprops[num_textprops++].to = toindex;
714 } 668 }
715 toindex_byte += thislen_byte; 669 toindex_byte += thislen_byte;
716 toindex += thisleni - combined; 670 toindex += thisleni;
717 XSTRING (val)->size -= combined;
718 } 671 }
719 /* Copy a single-byte string to a multibyte string. */ 672 /* Copy a single-byte string to a multibyte string. */
720 else if (STRINGP (this) && STRINGP (val)) 673 else if (STRINGP (this) && STRINGP (val))
721 { 674 {
722 if (! NULL_INTERVAL_P (XSTRING (this)->intervals)) 675 if (! NULL_INTERVAL_P (XSTRING (this)->intervals))
755 } 708 }
756 else 709 else
757 { 710 {
758 XSETFASTINT (elt, XSTRING (this)->data[thisindex++]); 711 XSETFASTINT (elt, XSTRING (this)->data[thisindex++]);
759 if (some_multibyte 712 if (some_multibyte
760 && (XINT (elt) >= 0240 713 && XINT (elt) >= 0200
761 || (XINT (elt) >= 0200
762 && ! NILP (Vnonascii_translation_table)))
763 && XINT (elt) < 0400) 714 && XINT (elt) < 0400)
764 { 715 {
765 c = unibyte_char_to_multibyte (XINT (elt)); 716 c = unibyte_char_to_multibyte (XINT (elt));
766 XSETINT (elt, c); 717 XSETINT (elt, c);
767 } 718 }
790 else if (VECTORP (val)) 741 else if (VECTORP (val))
791 XVECTOR (val)->contents[toindex++] = elt; 742 XVECTOR (val)->contents[toindex++] = elt;
792 else 743 else
793 { 744 {
794 CHECK_NUMBER (elt); 745 CHECK_NUMBER (elt);
795 if (SINGLE_BYTE_CHAR_P (XINT (elt))) 746 if (some_multibyte)
796 { 747 toindex_byte
797 if (some_multibyte) 748 += CHAR_STRING (XINT (elt),
798 toindex_byte 749 XSTRING (val)->data + toindex_byte);
799 += CHAR_STRING (XINT (elt),
800 XSTRING (val)->data + toindex_byte);
801 else
802 XSTRING (val)->data[toindex_byte++] = XINT (elt);
803 if (some_multibyte
804 && toindex_byte > 0
805 && count_combining (XSTRING (val)->data,
806 toindex_byte, toindex_byte - 1))
807 XSTRING (val)->size--;
808 else
809 toindex++;
810 }
811 else 750 else
812 /* If we have any multibyte characters, 751 XSTRING (val)->data[toindex_byte++] = XINT (elt);
813 we already decided to make a multibyte string. */ 752 toindex++;
814 {
815 int c = XINT (elt);
816 /* P exists as a variable
817 to avoid a bug on the Masscomp C compiler. */
818 unsigned char *p = & XSTRING (val)->data[toindex_byte];
819
820 toindex_byte += CHAR_STRING (c, p);
821 toindex++;
822 }
823 } 753 }
824 } 754 }
825 } 755 }
826 if (!NILP (prev)) 756 if (!NILP (prev))
827 XSETCDR (prev, last_tail); 757 XSETCDR (prev, last_tail);
892 } 822 }
893 } 823 }
894 824
895 if (char_index - best_below < best_above - char_index) 825 if (char_index - best_below < best_above - char_index)
896 { 826 {
827 unsigned char *p = XSTRING (string)->data + best_below_byte;
828
897 while (best_below < char_index) 829 while (best_below < char_index)
898 { 830 {
899 int c; 831 p += BYTES_BY_CHAR_HEAD (*p);
900 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, 832 best_below++;
901 best_below, best_below_byte); 833 }
902 } 834 i_byte = p - XSTRING (string)->data;
903 i = best_below;
904 i_byte = best_below_byte;
905 } 835 }
906 else 836 else
907 { 837 {
838 unsigned char *p = XSTRING (string)->data + best_above_byte;
839
908 while (best_above > char_index) 840 while (best_above > char_index)
909 { 841 {
910 unsigned char *pend = XSTRING (string)->data + best_above_byte; 842 p--;
911 unsigned char *pbeg = pend - best_above_byte; 843 while (!CHAR_HEAD_P (*p)) p--;
912 unsigned char *p = pend - 1;
913 int bytes;
914
915 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
916 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
917 if (bytes == pend - p)
918 best_above_byte -= bytes;
919 else if (bytes > pend - p)
920 best_above_byte -= (pend - p);
921 else
922 best_above_byte--;
923 best_above--; 844 best_above--;
924 } 845 }
925 i = best_above; 846 i_byte = p - XSTRING (string)->data;
926 i_byte = best_above_byte;
927 } 847 }
928 848
929 string_char_byte_cache_bytepos = i_byte; 849 string_char_byte_cache_bytepos = i_byte;
930 string_char_byte_cache_charpos = i; 850 string_char_byte_cache_charpos = char_index;
931 string_char_byte_cache_string = string; 851 string_char_byte_cache_string = string;
932 852
933 return i_byte; 853 return i_byte;
934 } 854 }
935 855
965 } 885 }
966 } 886 }
967 887
968 if (byte_index - best_below_byte < best_above_byte - byte_index) 888 if (byte_index - best_below_byte < best_above_byte - byte_index)
969 { 889 {
970 while (best_below_byte < byte_index) 890 unsigned char *p = XSTRING (string)->data + best_below_byte;
971 { 891 unsigned char *pend = XSTRING (string)->data + byte_index;
972 int c; 892
973 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, 893 while (p < pend)
974 best_below, best_below_byte); 894 {
895 p += BYTES_BY_CHAR_HEAD (*p);
896 best_below++;
975 } 897 }
976 i = best_below; 898 i = best_below;
977 i_byte = best_below_byte; 899 i_byte = p - XSTRING (string)->data;
978 } 900 }
979 else 901 else
980 { 902 {
981 while (best_above_byte > byte_index) 903 unsigned char *p = XSTRING (string)->data + best_above_byte;
982 { 904 unsigned char *pbeg = XSTRING (string)->data + byte_index;
983 unsigned char *pend = XSTRING (string)->data + best_above_byte; 905
984 unsigned char *pbeg = pend - best_above_byte; 906 while (p > pbeg)
985 unsigned char *p = pend - 1; 907 {
986 int bytes; 908 p--;
987 909 while (!CHAR_HEAD_P (*p)) p--;
988 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
989 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
990 if (bytes == pend - p)
991 best_above_byte -= bytes;
992 else if (bytes > pend - p)
993 best_above_byte -= (pend - p);
994 else
995 best_above_byte--;
996 best_above--; 910 best_above--;
997 } 911 }
998 i = best_above; 912 i = best_above;
999 i_byte = best_above_byte; 913 i_byte = p - XSTRING (string)->data;
1000 } 914 }
1001 915
1002 string_char_byte_cache_bytepos = i_byte; 916 string_char_byte_cache_bytepos = i_byte;
1003 string_char_byte_cache_charpos = i; 917 string_char_byte_cache_charpos = i;
1004 string_char_byte_cache_string = string; 918 string_char_byte_cache_string = string;
2032 1946
2033 /* Aside from them, only true vectors, char-tables, and compiled 1947 /* Aside from them, only true vectors, char-tables, and compiled
2034 functions are sensible to compare, so eliminate the others now. */ 1948 functions are sensible to compare, so eliminate the others now. */
2035 if (size & PSEUDOVECTOR_FLAG) 1949 if (size & PSEUDOVECTOR_FLAG)
2036 { 1950 {
2037 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE))) 1951 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE
1952 | PVEC_SUB_CHAR_TABLE)))
2038 return 0; 1953 return 0;
2039 size &= PSEUDOVECTOR_SIZE_MASK; 1954 size &= PSEUDOVECTOR_SIZE_MASK;
2040 } 1955 }
2041 for (i = 0; i < size; i++) 1956 for (i = 0; i < size; i++)
2042 { 1957 {
2086 for (index = 0; index < size; index++) 2001 for (index = 0; index < size; index++)
2087 p[index] = item; 2002 p[index] = item;
2088 } 2003 }
2089 else if (CHAR_TABLE_P (array)) 2004 else if (CHAR_TABLE_P (array))
2090 { 2005 {
2091 register Lisp_Object *p = XCHAR_TABLE (array)->contents; 2006 int i;
2092 size = CHAR_TABLE_ORDINARY_SLOTS; 2007
2093 for (index = 0; index < size; index++) 2008 for (i = 0; i < (1 << CHARTAB_SIZE_BITS_0); i++)
2094 p[index] = item; 2009 XCHAR_TABLE (array)->contents[i] = item;
2095 XCHAR_TABLE (array)->defalt = Qnil; 2010 XCHAR_TABLE (array)->defalt = item;
2096 } 2011 }
2097 else if (STRINGP (array)) 2012 else if (STRINGP (array))
2098 { 2013 {
2099 register unsigned char *p = XSTRING (array)->data; 2014 register unsigned char *p = XSTRING (array)->data;
2100 CHECK_NUMBER (item); 2015 CHECK_NUMBER (item);
2137 { 2052 {
2138 array = wrong_type_argument (Qarrayp, array); 2053 array = wrong_type_argument (Qarrayp, array);
2139 goto retry; 2054 goto retry;
2140 } 2055 }
2141 return array; 2056 return array;
2142 }
2143
2144 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype,
2145 1, 1, 0,
2146 doc: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2147 (char_table)
2148 Lisp_Object char_table;
2149 {
2150 CHECK_CHAR_TABLE (char_table);
2151
2152 return XCHAR_TABLE (char_table)->purpose;
2153 }
2154
2155 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent,
2156 1, 1, 0,
2157 doc: /* Return the parent char-table of CHAR-TABLE.
2158 The value is either nil or another char-table.
2159 If CHAR-TABLE holds nil for a given character,
2160 then the actual applicable value is inherited from the parent char-table
2161 \(or from its parents, if necessary). */)
2162 (char_table)
2163 Lisp_Object char_table;
2164 {
2165 CHECK_CHAR_TABLE (char_table);
2166
2167 return XCHAR_TABLE (char_table)->parent;
2168 }
2169
2170 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent,
2171 2, 2, 0,
2172 doc: /* Set the parent char-table of CHAR-TABLE to PARENT.
2173 PARENT must be either nil or another char-table. */)
2174 (char_table, parent)
2175 Lisp_Object char_table, parent;
2176 {
2177 Lisp_Object temp;
2178
2179 CHECK_CHAR_TABLE (char_table);
2180
2181 if (!NILP (parent))
2182 {
2183 CHECK_CHAR_TABLE (parent);
2184
2185 for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
2186 if (EQ (temp, char_table))
2187 error ("Attempt to make a chartable be its own parent");
2188 }
2189
2190 XCHAR_TABLE (char_table)->parent = parent;
2191
2192 return parent;
2193 }
2194
2195 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot,
2196 2, 2, 0,
2197 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2198 (char_table, n)
2199 Lisp_Object char_table, n;
2200 {
2201 CHECK_CHAR_TABLE (char_table);
2202 CHECK_NUMBER (n);
2203 if (XINT (n) < 0
2204 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2205 args_out_of_range (char_table, n);
2206
2207 return XCHAR_TABLE (char_table)->extras[XINT (n)];
2208 }
2209
2210 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot,
2211 Sset_char_table_extra_slot,
2212 3, 3, 0,
2213 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2214 (char_table, n, value)
2215 Lisp_Object char_table, n, value;
2216 {
2217 CHECK_CHAR_TABLE (char_table);
2218 CHECK_NUMBER (n);
2219 if (XINT (n) < 0
2220 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2221 args_out_of_range (char_table, n);
2222
2223 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
2224 }
2225
2226 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
2227 2, 2, 0,
2228 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2229 RANGE should be nil (for the default value)
2230 a vector which identifies a character set or a row of a character set,
2231 a character set name, or a character code. */)
2232 (char_table, range)
2233 Lisp_Object char_table, range;
2234 {
2235 CHECK_CHAR_TABLE (char_table);
2236
2237 if (EQ (range, Qnil))
2238 return XCHAR_TABLE (char_table)->defalt;
2239 else if (INTEGERP (range))
2240 return Faref (char_table, range);
2241 else if (SYMBOLP (range))
2242 {
2243 Lisp_Object charset_info;
2244
2245 charset_info = Fget (range, Qcharset);
2246 CHECK_VECTOR (charset_info);
2247
2248 return Faref (char_table,
2249 make_number (XINT (XVECTOR (charset_info)->contents[0])
2250 + 128));
2251 }
2252 else if (VECTORP (range))
2253 {
2254 if (XVECTOR (range)->size == 1)
2255 return Faref (char_table,
2256 make_number (XINT (XVECTOR (range)->contents[0]) + 128));
2257 else
2258 {
2259 int size = XVECTOR (range)->size;
2260 Lisp_Object *val = XVECTOR (range)->contents;
2261 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2262 size <= 1 ? Qnil : val[1],
2263 size <= 2 ? Qnil : val[2]);
2264 return Faref (char_table, ch);
2265 }
2266 }
2267 else
2268 error ("Invalid RANGE argument to `char-table-range'");
2269 return Qt;
2270 }
2271
2272 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
2273 3, 3, 0,
2274 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2275 RANGE should be t (for all characters), nil (for the default value)
2276 a vector which identifies a character set or a row of a character set,
2277 a coding system, or a character code. */)
2278 (char_table, range, value)
2279 Lisp_Object char_table, range, value;
2280 {
2281 int i;
2282
2283 CHECK_CHAR_TABLE (char_table);
2284
2285 if (EQ (range, Qt))
2286 for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2287 XCHAR_TABLE (char_table)->contents[i] = value;
2288 else if (EQ (range, Qnil))
2289 XCHAR_TABLE (char_table)->defalt = value;
2290 else if (SYMBOLP (range))
2291 {
2292 Lisp_Object charset_info;
2293
2294 charset_info = Fget (range, Qcharset);
2295 CHECK_VECTOR (charset_info);
2296
2297 return Faset (char_table,
2298 make_number (XINT (XVECTOR (charset_info)->contents[0])
2299 + 128),
2300 value);
2301 }
2302 else if (INTEGERP (range))
2303 Faset (char_table, range, value);
2304 else if (VECTORP (range))
2305 {
2306 if (XVECTOR (range)->size == 1)
2307 return Faset (char_table,
2308 make_number (XINT (XVECTOR (range)->contents[0]) + 128),
2309 value);
2310 else
2311 {
2312 int size = XVECTOR (range)->size;
2313 Lisp_Object *val = XVECTOR (range)->contents;
2314 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2315 size <= 1 ? Qnil : val[1],
2316 size <= 2 ? Qnil : val[2]);
2317 return Faset (char_table, ch, value);
2318 }
2319 }
2320 else
2321 error ("Invalid RANGE argument to `set-char-table-range'");
2322
2323 return value;
2324 }
2325
2326 DEFUN ("set-char-table-default", Fset_char_table_default,
2327 Sset_char_table_default, 3, 3, 0,
2328 doc: /* Set the default value in CHAR-TABLE for a generic character CHAR to VALUE.
2329 The generic character specifies the group of characters.
2330 See also the documentation of make-char. */)
2331 (char_table, ch, value)
2332 Lisp_Object char_table, ch, value;
2333 {
2334 int c, charset, code1, code2;
2335 Lisp_Object temp;
2336
2337 CHECK_CHAR_TABLE (char_table);
2338 CHECK_NUMBER (ch);
2339
2340 c = XINT (ch);
2341 SPLIT_CHAR (c, charset, code1, code2);
2342
2343 /* Since we may want to set the default value for a character set
2344 not yet defined, we check only if the character set is in the
2345 valid range or not, instead of it is already defined or not. */
2346 if (! CHARSET_VALID_P (charset))
2347 invalid_character (c);
2348
2349 if (charset == CHARSET_ASCII)
2350 return (XCHAR_TABLE (char_table)->defalt = value);
2351
2352 /* Even if C is not a generic char, we had better behave as if a
2353 generic char is specified. */
2354 if (!CHARSET_DEFINED_P (charset) || CHARSET_DIMENSION (charset) == 1)
2355 code1 = 0;
2356 temp = XCHAR_TABLE (char_table)->contents[charset + 128];
2357 if (!code1)
2358 {
2359 if (SUB_CHAR_TABLE_P (temp))
2360 XCHAR_TABLE (temp)->defalt = value;
2361 else
2362 XCHAR_TABLE (char_table)->contents[charset + 128] = value;
2363 return value;
2364 }
2365 if (SUB_CHAR_TABLE_P (temp))
2366 char_table = temp;
2367 else
2368 char_table = (XCHAR_TABLE (char_table)->contents[charset + 128]
2369 = make_sub_char_table (temp));
2370 temp = XCHAR_TABLE (char_table)->contents[code1];
2371 if (SUB_CHAR_TABLE_P (temp))
2372 XCHAR_TABLE (temp)->defalt = value;
2373 else
2374 XCHAR_TABLE (char_table)->contents[code1] = value;
2375 return value;
2376 }
2377
2378 /* Look up the element in TABLE at index CH,
2379 and return it as an integer.
2380 If the element is nil, return CH itself.
2381 (Actually we do that for any non-integer.) */
2382
2383 int
2384 char_table_translate (table, ch)
2385 Lisp_Object table;
2386 int ch;
2387 {
2388 Lisp_Object value;
2389 value = Faref (table, make_number (ch));
2390 if (! INTEGERP (value))
2391 return ch;
2392 return XINT (value);
2393 }
2394
2395 static void
2396 optimize_sub_char_table (table, chars)
2397 Lisp_Object *table;
2398 int chars;
2399 {
2400 Lisp_Object elt;
2401 int from, to;
2402
2403 if (chars == 94)
2404 from = 33, to = 127;
2405 else
2406 from = 32, to = 128;
2407
2408 if (!SUB_CHAR_TABLE_P (*table))
2409 return;
2410 elt = XCHAR_TABLE (*table)->contents[from++];
2411 for (; from < to; from++)
2412 if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from])))
2413 return;
2414 *table = elt;
2415 }
2416
2417 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
2418 1, 1, 0, doc: /* Optimize char table TABLE. */)
2419 (table)
2420 Lisp_Object table;
2421 {
2422 Lisp_Object elt;
2423 int dim;
2424 int i, j;
2425
2426 CHECK_CHAR_TABLE (table);
2427
2428 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2429 {
2430 elt = XCHAR_TABLE (table)->contents[i];
2431 if (!SUB_CHAR_TABLE_P (elt))
2432 continue;
2433 dim = CHARSET_DIMENSION (i - 128);
2434 if (dim == 2)
2435 for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++)
2436 optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim);
2437 optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim);
2438 }
2439 return Qnil;
2440 }
2441
2442
2443 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2444 character or group of characters that share a value.
2445 DEPTH is the current depth in the originally specified
2446 chartable, and INDICES contains the vector indices
2447 for the levels our callers have descended.
2448
2449 ARG is passed to C_FUNCTION when that is called. */
2450
2451 void
2452 map_char_table (c_function, function, subtable, arg, depth, indices)
2453 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2454 Lisp_Object function, subtable, arg, *indices;
2455 int depth;
2456 {
2457 int i, to;
2458
2459 if (depth == 0)
2460 {
2461 /* At first, handle ASCII and 8-bit European characters. */
2462 for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
2463 {
2464 Lisp_Object elt = XCHAR_TABLE (subtable)->contents[i];
2465 if (c_function)
2466 (*c_function) (arg, make_number (i), elt);
2467 else
2468 call2 (function, make_number (i), elt);
2469 }
2470 #if 0 /* If the char table has entries for higher characters,
2471 we should report them. */
2472 if (NILP (current_buffer->enable_multibyte_characters))
2473 return;
2474 #endif
2475 to = CHAR_TABLE_ORDINARY_SLOTS;
2476 }
2477 else
2478 {
2479 int charset = XFASTINT (indices[0]) - 128;
2480
2481 i = 32;
2482 to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
2483 if (CHARSET_CHARS (charset) == 94)
2484 i++, to--;
2485 }
2486
2487 for (; i < to; i++)
2488 {
2489 Lisp_Object elt;
2490 int charset;
2491
2492 elt = XCHAR_TABLE (subtable)->contents[i];
2493 XSETFASTINT (indices[depth], i);
2494 charset = XFASTINT (indices[0]) - 128;
2495 if (depth == 0
2496 && (!CHARSET_DEFINED_P (charset)
2497 || charset == CHARSET_8_BIT_CONTROL
2498 || charset == CHARSET_8_BIT_GRAPHIC))
2499 continue;
2500
2501 if (SUB_CHAR_TABLE_P (elt))
2502 {
2503 if (depth >= 3)
2504 error ("Too deep char table");
2505 map_char_table (c_function, function, elt, arg, depth + 1, indices);
2506 }
2507 else
2508 {
2509 int c1, c2, c;
2510
2511 if (NILP (elt))
2512 elt = XCHAR_TABLE (subtable)->defalt;
2513 c1 = depth >= 1 ? XFASTINT (indices[1]) : 0;
2514 c2 = depth >= 2 ? XFASTINT (indices[2]) : 0;
2515 c = MAKE_CHAR (charset, c1, c2);
2516 if (c_function)
2517 (*c_function) (arg, make_number (c), elt);
2518 else
2519 call2 (function, make_number (c), elt);
2520 }
2521 }
2522 }
2523
2524 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
2525 2, 2, 0,
2526 doc: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2527 FUNCTION is called with two arguments--a key and a value.
2528 The key is always a possible IDX argument to `aref'. */)
2529 (function, char_table)
2530 Lisp_Object function, char_table;
2531 {
2532 /* The depth of char table is at most 3. */
2533 Lisp_Object indices[3];
2534
2535 CHECK_CHAR_TABLE (char_table);
2536
2537 map_char_table (NULL, function, char_table, char_table, 0, indices);
2538 return Qnil;
2539 }
2540
2541 /* Return a value for character C in char-table TABLE. Store the
2542 actual index for that value in *IDX. Ignore the default value of
2543 TABLE. */
2544
2545 Lisp_Object
2546 char_table_ref_and_index (table, c, idx)
2547 Lisp_Object table;
2548 int c, *idx;
2549 {
2550 int charset, c1, c2;
2551 Lisp_Object elt;
2552
2553 if (SINGLE_BYTE_CHAR_P (c))
2554 {
2555 *idx = c;
2556 return XCHAR_TABLE (table)->contents[c];
2557 }
2558 SPLIT_CHAR (c, charset, c1, c2);
2559 elt = XCHAR_TABLE (table)->contents[charset + 128];
2560 *idx = MAKE_CHAR (charset, 0, 0);
2561 if (!SUB_CHAR_TABLE_P (elt))
2562 return elt;
2563 if (c1 < 32 || NILP (XCHAR_TABLE (elt)->contents[c1]))
2564 return XCHAR_TABLE (elt)->defalt;
2565 elt = XCHAR_TABLE (elt)->contents[c1];
2566 *idx = MAKE_CHAR (charset, c1, 0);
2567 if (!SUB_CHAR_TABLE_P (elt))
2568 return elt;
2569 if (c2 < 32 || NILP (XCHAR_TABLE (elt)->contents[c2]))
2570 return XCHAR_TABLE (elt)->defalt;
2571 *idx = c;
2572 return XCHAR_TABLE (elt)->contents[c2];
2573 } 2057 }
2574 2058
2575 2059
2576 /* ARGSUSED */ 2060 /* ARGSUSED */
2577 Lisp_Object 2061 Lisp_Object
3750 operations is not a requirement, it might therefore be a good idea 3234 operations is not a requirement, it might therefore be a good idea
3751 not to hash. Instead, we could just do a linear search in the 3235 not to hash. Instead, we could just do a linear search in the
3752 key_and_value vector of the hash table. This could be done 3236 key_and_value vector of the hash table. This could be done
3753 if a `:linear-search t' argument is given to make-hash-table. */ 3237 if a `:linear-search t' argument is given to make-hash-table. */
3754 3238
3755
3756 /* Value is the key part of entry IDX in hash table H. */
3757
3758 #define HASH_KEY(H, IDX) AREF ((H)->key_and_value, 2 * (IDX))
3759
3760 /* Value is the value part of entry IDX in hash table H. */
3761
3762 #define HASH_VALUE(H, IDX) AREF ((H)->key_and_value, 2 * (IDX) + 1)
3763 3239
3764 /* Value is the index of the next entry following the one at IDX 3240 /* Value is the index of the next entry following the one at IDX
3765 in hash table H. */ 3241 in hash table H. */
3766 3242
3767 #define HASH_NEXT(H, IDX) AREF ((H)->next, (IDX)) 3243 #define HASH_NEXT(H, IDX) AREF ((H)->next, (IDX))
5082 { 4558 {
5083 /* Decide the coding-system to encode the data with. */ 4559 /* Decide the coding-system to encode the data with. */
5084 4560
5085 if (STRING_MULTIBYTE (object)) 4561 if (STRING_MULTIBYTE (object))
5086 /* use default, we can't guess correct value */ 4562 /* use default, we can't guess correct value */
5087 coding_system = SYMBOL_VALUE (XCAR (Vcoding_category_list)); 4563 coding_system = preferred_coding_system ();
5088 else 4564 else
5089 coding_system = Qraw_text; 4565 coding_system = Qraw_text;
5090 } 4566 }
5091 4567
5092 if (NILP (Fcoding_system_p (coding_system))) 4568 if (NILP (Fcoding_system_p (coding_system)))
5099 while (1) 4575 while (1)
5100 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil)); 4576 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5101 } 4577 }
5102 4578
5103 if (STRING_MULTIBYTE (object)) 4579 if (STRING_MULTIBYTE (object))
5104 object = code_convert_string1 (object, coding_system, Qnil, 1); 4580 object = code_convert_string (object, coding_system, Qnil, 1, 0, 1);
5105 4581
5106 size = XSTRING (object)->size; 4582 size = XSTRING (object)->size;
5107 size_byte = STRING_BYTES (XSTRING (object)); 4583 size_byte = STRING_BYTES (XSTRING (object));
5108 4584
5109 if (!NILP (start)) 4585 if (!NILP (start))
5231 } 4707 }
5232 4708
5233 object = make_buffer_string (b, e, 0); 4709 object = make_buffer_string (b, e, 0);
5234 4710
5235 if (STRING_MULTIBYTE (object)) 4711 if (STRING_MULTIBYTE (object))
5236 object = code_convert_string1 (object, coding_system, Qnil, 1); 4712 object = code_convert_string (object, coding_system, Qnil, 1, 0, 1);
5237 } 4713 }
5238 4714
5239 md5_buffer (XSTRING (object)->data + start_byte, 4715 md5_buffer (XSTRING (object)->data + start_byte,
5240 STRING_BYTES(XSTRING (object)) - (size_byte - end_byte), 4716 STRING_BYTES(XSTRING (object)) - (size_byte - end_byte),
5241 digest); 4717 digest);
5369 defsubr (&Sget); 4845 defsubr (&Sget);
5370 defsubr (&Splist_put); 4846 defsubr (&Splist_put);
5371 defsubr (&Sput); 4847 defsubr (&Sput);
5372 defsubr (&Sequal); 4848 defsubr (&Sequal);
5373 defsubr (&Sfillarray); 4849 defsubr (&Sfillarray);
5374 defsubr (&Schar_table_subtype);
5375 defsubr (&Schar_table_parent);
5376 defsubr (&Sset_char_table_parent);
5377 defsubr (&Schar_table_extra_slot);
5378 defsubr (&Sset_char_table_extra_slot);
5379 defsubr (&Schar_table_range);
5380 defsubr (&Sset_char_table_range);
5381 defsubr (&Sset_char_table_default);
5382 defsubr (&Soptimize_char_table);
5383 defsubr (&Smap_char_table);
5384 defsubr (&Snconc); 4850 defsubr (&Snconc);
5385 defsubr (&Smapcar); 4851 defsubr (&Smapcar);
5386 defsubr (&Smapc); 4852 defsubr (&Smapc);
5387 defsubr (&Smapconcat); 4853 defsubr (&Smapconcat);
5388 defsubr (&Sy_or_n_p); 4854 defsubr (&Sy_or_n_p);