Port better to POSIX hosts lacking _setjmp.
[bpt/emacs.git] / src / category.c
CommitLineData
4ed46869 1/* GNU Emacs routines to deal with category tables.
95df8112 2
acaf905b 3Copyright (C) 1998, 2001-2012 Free Software Foundation, Inc.
95df8112
GM
4Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5 2005, 2006, 2007, 2008, 2009, 2010, 2011
6 National Institute of Advanced Industrial Science and Technology (AIST)
7 Registration Number H14PRO021
8Copyright (C) 2003
9 National Institute of Advanced Industrial Science and Technology (AIST)
10 Registration Number H13PRO009
4ed46869
KH
11
12This file is part of GNU Emacs.
13
9ec0b715 14GNU Emacs is free software: you can redistribute it and/or modify
4ed46869 15it under the terms of the GNU General Public License as published by
9ec0b715
GM
16the Free Software Foundation, either version 3 of the License, or
17(at your option) any later version.
4ed46869
KH
18
19GNU Emacs is distributed in the hope that it will be useful,
20but WITHOUT ANY WARRANTY; without even the implied warranty of
21MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22GNU General Public License for more details.
23
24You should have received a copy of the GNU General Public License
9ec0b715 25along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
4ed46869
KH
26
27
28/* Here we handle three objects: category, category set, and category
29 table. Read comments in the file category.h to understand them. */
30
31#include <config.h>
f162bcc3
PE
32
33#define CATEGORY_INLINE EXTERN_INLINE
34
4ed46869 35#include "lisp.h"
ea012abd 36#include "character.h"
e5560ff7 37#include "buffer.h"
4ed46869
KH
38#include "charset.h"
39#include "category.h"
e35f6ff7 40#include "keymap.h"
4ed46869 41
39eb03f1
PE
42/* This setter is used only in this file, so it can be private. */
43static inline void
44bset_category_table (struct buffer *b, Lisp_Object val)
45{
46 b->INTERNAL_FIELD (category_table) = val;
47}
48
4ed46869
KH
49/* The version number of the latest category table. Each category
50 table has a unique version number. It is assigned a new number
51 also when it is modified. When a regular expression is compiled
52 into the struct re_pattern_buffer, the version number of the
53 category table (of the current buffer) at that moment is also
54 embedded in the structure.
55
56 For the moment, we are not using this feature. */
57static int category_table_version;
58
955cbe7b 59static Lisp_Object Qcategory_table, Qcategoryp, Qcategorysetp, Qcategory_table_p;
4ed46869 60
d85b608f
PE
61/* Make CATEGORY_SET includes (if VAL is t) or excludes (if VAL is
62 nil) CATEGORY. */
63#define SET_CATEGORY_SET(category_set, category, val) \
64 set_category_set (category_set, category, val)
65static void set_category_set (Lisp_Object, Lisp_Object, Lisp_Object);
4ed46869
KH
66\f
67/* Category set staff. */
68
f57e2426 69static Lisp_Object hash_get_category_set (Lisp_Object, Lisp_Object);
cd486875
KH
70
71static Lisp_Object
971de7fb 72hash_get_category_set (Lisp_Object table, Lisp_Object category_set)
cd486875 73{
cd486875 74 struct Lisp_Hash_Table *h;
d3411f89 75 ptrdiff_t i;
0de4bb68 76 EMACS_UINT hash;
cd486875
KH
77
78 if (NILP (XCHAR_TABLE (table)->extras[1]))
34dabdb7 79 set_char_table_extras
a098c930
DA
80 (table, 1,
81 make_hash_table (Qequal, make_number (DEFAULT_HASH_SIZE),
82 make_float (DEFAULT_REHASH_SIZE),
83 make_float (DEFAULT_REHASH_THRESHOLD),
84 Qnil, Qnil, Qnil));
cd486875
KH
85 h = XHASH_TABLE (XCHAR_TABLE (table)->extras[1]);
86 i = hash_lookup (h, category_set, &hash);
87 if (i >= 0)
88 return HASH_KEY (h, i);
89 hash_put (h, category_set, Qnil, hash);
90 return category_set;
91}
92
93
4ed46869 94DEFUN ("make-category-set", Fmake_category_set, Smake_category_set, 1, 1, 0,
fdb82f93
PJ
95 doc: /* Return a newly created category-set which contains CATEGORIES.
96CATEGORIES is a string of category mnemonics.
97The value is a bool-vector which has t at the indices corresponding to
98those categories. */)
5842a27b 99 (Lisp_Object categories)
4ed46869
KH
100{
101 Lisp_Object val;
102 int len;
103
b7826503 104 CHECK_STRING (categories);
4ed46869
KH
105 val = MAKE_CATEGORY_SET;
106
115afec3 107 if (STRING_MULTIBYTE (categories))
95030461 108 error ("Multibyte string in `make-category-set'");
115afec3 109
d5db4077 110 len = SCHARS (categories);
4ed46869
KH
111 while (--len >= 0)
112 {
15c60737 113 Lisp_Object category;
4ed46869 114
d5db4077 115 XSETFASTINT (category, SREF (categories, len));
b7826503 116 CHECK_CATEGORY (category);
4ed46869
KH
117 SET_CATEGORY_SET (val, category, Qt);
118 }
119 return val;
120}
121
122\f
123/* Category staff. */
124
d85b608f 125static Lisp_Object check_category_table (Lisp_Object table);
4ed46869
KH
126
127DEFUN ("define-category", Fdefine_category, Sdefine_category, 2, 3, 0,
839966f3
KH
128 doc: /* Define CATEGORY as a category which is described by DOCSTRING.
129CATEGORY should be an ASCII printing character in the range ` ' to `~'.
f6d2f045
KH
130DOCSTRING is the documentation string of the category. The first line
131should be a terse text (preferably less than 16 characters),
132and the rest lines should be the full description.
fdb82f93 133The category is defined only in category table TABLE, which defaults to
839966f3 134the current buffer's category table. */)
5842a27b 135 (Lisp_Object category, Lisp_Object docstring, Lisp_Object table)
4ed46869 136{
b7826503
PJ
137 CHECK_CATEGORY (category);
138 CHECK_STRING (docstring);
4ed46869
KH
139 table = check_category_table (table);
140
141 if (!NILP (CATEGORY_DOCSTRING (table, XFASTINT (category))))
5fdb398c 142 error ("Category `%c' is already defined", (int) XFASTINT (category));
905a9ed3
DN
143 if (!NILP (Vpurify_flag))
144 docstring = Fpurecopy (docstring);
f1a95992 145 SET_CATEGORY_DOCSTRING (table, XFASTINT (category), docstring);
4ed46869
KH
146
147 return Qnil;
148}
149
150DEFUN ("category-docstring", Fcategory_docstring, Scategory_docstring, 1, 2, 0,
839966f3
KH
151 doc: /* Return the documentation string of CATEGORY, as defined in TABLE.
152TABLE should be a category table and defaults to the current buffer's
153category table. */)
5842a27b 154 (Lisp_Object category, Lisp_Object table)
4ed46869 155{
b7826503 156 CHECK_CATEGORY (category);
4ed46869
KH
157 table = check_category_table (table);
158
159 return CATEGORY_DOCSTRING (table, XFASTINT (category));
160}
161
162DEFUN ("get-unused-category", Fget_unused_category, Sget_unused_category,
163 0, 1, 0,
839966f3 164 doc: /* Return a category which is not yet defined in TABLE.
0b6694a5 165If no category remains available, return nil.
839966f3 166The optional argument TABLE specifies which category table to modify;
0b6694a5 167it defaults to the current buffer's category table. */)
5842a27b 168 (Lisp_Object table)
4ed46869
KH
169{
170 int i;
4ed46869
KH
171
172 table = check_category_table (table);
173
174 for (i = ' '; i <= '~'; i++)
175 if (NILP (CATEGORY_DOCSTRING (table, i)))
176 return make_number (i);
177
178 return Qnil;
179}
180
181\f
182/* Category-table staff. */
183
184DEFUN ("category-table-p", Fcategory_table_p, Scategory_table_p, 1, 1, 0,
fdb82f93 185 doc: /* Return t if ARG is a category table. */)
5842a27b 186 (Lisp_Object arg)
4ed46869
KH
187{
188 if (CHAR_TABLE_P (arg)
ed8ec86d 189 && EQ (XCHAR_TABLE (arg)->purpose, Qcategory_table))
4ed46869
KH
190 return Qt;
191 return Qnil;
192}
193
194/* If TABLE is nil, return the current category table. If TABLE is
195 not nil, check the validity of TABLE as a category table. If
196 valid, return TABLE itself, but if not valid, signal an error of
197 wrong-type-argument. */
198
d85b608f 199static Lisp_Object
971de7fb 200check_category_table (Lisp_Object table)
4ed46869 201{
4ed46869 202 if (NILP (table))
4b4deea2 203 return BVAR (current_buffer, category_table);
88674269 204 CHECK_TYPE (!NILP (Fcategory_table_p (table)), Qcategory_table_p, table);
4ed46869 205 return table;
177c0ea7 206}
4ed46869
KH
207
208DEFUN ("category-table", Fcategory_table, Scategory_table, 0, 0, 0,
fdb82f93
PJ
209 doc: /* Return the current category table.
210This is the one specified by the current buffer. */)
5842a27b 211 (void)
4ed46869 212{
4b4deea2 213 return BVAR (current_buffer, category_table);
4ed46869
KH
214}
215
216DEFUN ("standard-category-table", Fstandard_category_table,
217 Sstandard_category_table, 0, 0, 0,
fdb82f93
PJ
218 doc: /* Return the standard category table.
219This is the one used for new buffers. */)
5842a27b 220 (void)
4ed46869
KH
221{
222 return Vstandard_category_table;
223}
224
ea012abd
KH
225
226static void
971de7fb 227copy_category_entry (Lisp_Object table, Lisp_Object c, Lisp_Object val)
ea012abd 228{
f4b670ef 229 val = Fcopy_sequence (val);
8f924df7
KH
230 if (CONSP (c))
231 char_table_set_range (table, XINT (XCAR (c)), XINT (XCDR (c)), val);
f4b670ef 232 else
8f924df7 233 char_table_set (table, XINT (c), val);
ea012abd
KH
234}
235
4ed46869
KH
236/* Return a copy of category table TABLE. We can't simply use the
237 function copy-sequence because no contents should be shared between
ed8ec86d 238 the original and the copy. This function is called recursively by
9da95d53 239 binding TABLE to a sub char table. */
4ed46869 240
9f3b5e69 241static Lisp_Object
971de7fb 242copy_category_table (Lisp_Object table)
4ed46869 243{
ea012abd 244 table = copy_char_table (table);
4ed46869 245
ea012abd 246 if (! NILP (XCHAR_TABLE (table)->defalt))
742af32f
PE
247 set_char_table_defalt (table,
248 Fcopy_sequence (XCHAR_TABLE (table)->defalt));
34dabdb7 249 set_char_table_extras
a098c930 250 (table, 0, Fcopy_sequence (XCHAR_TABLE (table)->extras[0]));
8f924df7 251 map_char_table (copy_category_entry, Qnil, table, table);
ed8ec86d 252
4ed46869
KH
253 return table;
254}
255
256DEFUN ("copy-category-table", Fcopy_category_table, Scopy_category_table,
257 0, 1, 0,
fdb82f93
PJ
258 doc: /* Construct a new category table and return it.
259It is a copy of the TABLE, which defaults to the standard category table. */)
5842a27b 260 (Lisp_Object table)
4ed46869
KH
261{
262 if (!NILP (table))
263 check_category_table (table);
264 else
265 table = Vstandard_category_table;
266
9da95d53 267 return copy_category_table (table);
4ed46869
KH
268}
269
70414a3d
KH
270DEFUN ("make-category-table", Fmake_category_table, Smake_category_table,
271 0, 0, 0,
fdb82f93 272 doc: /* Construct a new and empty category table and return it. */)
5842a27b 273 (void)
70414a3d
KH
274{
275 Lisp_Object val;
ea012abd 276 int i;
70414a3d
KH
277
278 val = Fmake_char_table (Qcategory_table, Qnil);
742af32f 279 set_char_table_defalt (val, MAKE_CATEGORY_SET);
8f924df7 280 for (i = 0; i < (1 << CHARTAB_SIZE_BITS_0); i++)
34dabdb7 281 set_char_table_contents (val, i, MAKE_CATEGORY_SET);
70414a3d
KH
282 Fset_char_table_extra_slot (val, make_number (0),
283 Fmake_vector (make_number (95), Qnil));
284 return val;
285}
286
4ed46869 287DEFUN ("set-category-table", Fset_category_table, Sset_category_table, 1, 1, 0,
839966f3
KH
288 doc: /* Specify TABLE as the category table for the current buffer.
289Return TABLE. */)
5842a27b 290 (Lisp_Object table)
4ed46869 291{
6f598a6d 292 int idx;
4ed46869 293 table = check_category_table (table);
39eb03f1 294 bset_category_table (current_buffer, table);
4ed46869 295 /* Indicate that this buffer now has a specified category table. */
f6cd0527
GM
296 idx = PER_BUFFER_VAR_IDX (category_table);
297 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 1);
4ed46869
KH
298 return table;
299}
300
301\f
ea012abd 302Lisp_Object
971de7fb 303char_category_set (int c)
ea012abd 304{
4b4deea2 305 return CHAR_TABLE_REF (BVAR (current_buffer, category_table), c);
ea012abd
KH
306}
307
4ed46869 308DEFUN ("char-category-set", Fchar_category_set, Schar_category_set, 1, 1, 0,
a2c2f196
JB
309 doc: /* Return the category set of CHAR.
310usage: (char-category-set CHAR) */)
5842a27b 311 (Lisp_Object ch)
4ed46869 312{
d311d28c 313 CHECK_CHARACTER (ch);
4ed46869
KH
314 return CATEGORY_SET (XFASTINT (ch));
315}
316
317DEFUN ("category-set-mnemonics", Fcategory_set_mnemonics,
318 Scategory_set_mnemonics, 1, 1, 0,
fdb82f93
PJ
319 doc: /* Return a string containing mnemonics of the categories in CATEGORY-SET.
320CATEGORY-SET is a bool-vector, and the categories \"in\" it are those
839966f3 321that are indexes where t occurs in the bool-vector.
fdb82f93 322The return value is a string containing those same categories. */)
5842a27b 323 (Lisp_Object category_set)
4ed46869
KH
324{
325 int i, j;
326 char str[96];
327
b7826503 328 CHECK_CATEGORY_SET (category_set);
4ed46869
KH
329
330 j = 0;
331 for (i = 32; i < 127; i++)
332 if (CATEGORY_MEMBER (i, category_set))
333 str[j++] = i;
334 str[j] = '\0';
335
336 return build_string (str);
337}
338
d85b608f 339static void
971de7fb 340set_category_set (Lisp_Object category_set, Lisp_Object category, Lisp_Object val)
4ed46869
KH
341{
342 do {
343 int idx = XINT (category) / 8;
344 unsigned char bits = 1 << (XINT (category) % 8);
345
346 if (NILP (val))
347 XCATEGORY_SET (category_set)->data[idx] &= ~bits;
348 else
349 XCATEGORY_SET (category_set)->data[idx] |= bits;
350 } while (0);
351}
352
353DEFUN ("modify-category-entry", Fmodify_category_entry,
354 Smodify_category_entry, 2, 4, 0,
fdb82f93
PJ
355 doc: /* Modify the category set of CHARACTER by adding CATEGORY to it.
356The category is changed only for table TABLE, which defaults to
8f7e5042
DL
357the current buffer's category table.
358CHARACTER can be either a single character or a cons representing the
359lower and upper ends of an inclusive character range to modify.
fdb82f93
PJ
360If optional fourth argument RESET is non-nil,
361then delete CATEGORY from the category set instead of adding it. */)
5842a27b 362 (Lisp_Object character, Lisp_Object category, Lisp_Object table, Lisp_Object reset)
4ed46869 363{
4ed46869 364 Lisp_Object set_value; /* Actual value to be set in category sets. */
8f7e5042 365 Lisp_Object category_set;
ea012abd
KH
366 int start, end;
367 int from, to;
4ed46869 368
ea012abd 369 if (INTEGERP (character))
4ed46869 370 {
ea012abd
KH
371 CHECK_CHARACTER (character);
372 start = end = XFASTINT (character);
4ed46869 373 }
ea012abd 374 else
4ed46869 375 {
ea012abd 376 CHECK_CONS (character);
8f924df7
KH
377 CHECK_CHARACTER_CAR (character);
378 CHECK_CHARACTER_CDR (character);
ea012abd
KH
379 start = XFASTINT (XCAR (character));
380 end = XFASTINT (XCDR (character));
4ed46869 381 }
4ed46869 382
b7826503 383 CHECK_CATEGORY (category);
4ed46869 384 table = check_category_table (table);
4ed46869 385
4ed46869 386 if (NILP (CATEGORY_DOCSTRING (table, XFASTINT (category))))
5fdb398c 387 error ("Undefined category: %c", (int) XFASTINT (category));
4ed46869 388
4ed46869 389 set_value = NILP (reset) ? Qt : Qnil;
4ed46869 390
ea012abd 391 while (start <= end)
4ed46869 392 {
cd486875 393 from = start, to = end;
ea012abd 394 category_set = char_table_ref_and_range (table, start, &from, &to);
0b261f59 395 if (CATEGORY_MEMBER (XFASTINT (category), category_set) != NILP (reset))
ea012abd 396 {
d8887a31
KH
397 category_set = Fcopy_sequence (category_set);
398 SET_CATEGORY_SET (category_set, category, set_value);
cd486875
KH
399 category_set = hash_get_category_set (table, category_set);
400 char_table_set_range (table, start, to, category_set);
ea012abd 401 }
ea012abd 402 start = to + 1;
4ed46869 403 }
4ed46869
KH
404
405 return Qnil;
406}
407\f
17c05d74
PE
408/* Return true if there is a word boundary between two word-constituent
409 characters C1 and C2 if they appear in this order.
4ed46869
KH
410 Use the macro WORD_BOUNDARY_P instead of calling this function
411 directly. */
412
17c05d74 413bool
971de7fb 414word_boundary_p (int c1, int c2)
4ed46869
KH
415{
416 Lisp_Object category_set1, category_set2;
417 Lisp_Object tail;
17c05d74 418 bool default_result;
4ed46869 419
714b2198
KH
420 if (EQ (CHAR_TABLE_REF (Vchar_script_table, c1),
421 CHAR_TABLE_REF (Vchar_script_table, c2)))
4ed46869
KH
422 {
423 tail = Vword_separating_categories;
424 default_result = 0;
425 }
426 else
427 {
428 tail = Vword_combining_categories;
429 default_result = 1;
430 }
431
432 category_set1 = CATEGORY_SET (c1);
433 if (NILP (category_set1))
434 return default_result;
435 category_set2 = CATEGORY_SET (c2);
436 if (NILP (category_set2))
437 return default_result;
438
03699b14 439 for (; CONSP (tail); tail = XCDR (tail))
4ed46869 440 {
03699b14 441 Lisp_Object elt = XCAR (tail);
4ed46869
KH
442
443 if (CONSP (elt)
714b2198
KH
444 && (NILP (XCAR (elt))
445 || (CATEGORYP (XCAR (elt))
8a605fe8
KH
446 && CATEGORY_MEMBER (XFASTINT (XCAR (elt)), category_set1)
447 && ! CATEGORY_MEMBER (XFASTINT (XCAR (elt)), category_set2)))
714b2198
KH
448 && (NILP (XCDR (elt))
449 || (CATEGORYP (XCDR (elt))
8a605fe8 450 && ! CATEGORY_MEMBER (XFASTINT (XCDR (elt)), category_set1)
714b2198 451 && CATEGORY_MEMBER (XFASTINT (XCDR (elt)), category_set2))))
4ed46869
KH
452 return !default_result;
453 }
454 return default_result;
455}
456
457\f
dfcf069d 458void
971de7fb 459init_category_once (void)
4ed46869
KH
460{
461 /* This has to be done here, before we call Fmake_char_table. */
cd3520a4 462 DEFSYM (Qcategory_table, "category-table");
4ed46869
KH
463
464 /* Intern this now in case it isn't already done.
465 Setting this variable twice is harmless.
466 But don't staticpro it here--that is done in alloc.c. */
d67b4f80 467 Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots");
4ed46869
KH
468
469 /* Now we are ready to set up this property, so we can
470 create category tables. */
471 Fput (Qcategory_table, Qchar_table_extra_slots, make_number (2));
472
473 Vstandard_category_table = Fmake_char_table (Qcategory_table, Qnil);
177c0ea7 474 /* Set a category set which contains nothing to the default. */
742af32f 475 set_char_table_defalt (Vstandard_category_table, MAKE_CATEGORY_SET);
9da95d53 476 Fset_char_table_extra_slot (Vstandard_category_table, make_number (0),
4ed46869
KH
477 Fmake_vector (make_number (95), Qnil));
478}
479
dfcf069d 480void
971de7fb 481syms_of_category (void)
4ed46869 482{
cd3520a4
JB
483 DEFSYM (Qcategoryp, "categoryp");
484 DEFSYM (Qcategorysetp, "categorysetp");
485 DEFSYM (Qcategory_table_p, "category-table-p");
4ed46869 486
29208e82 487 DEFVAR_LISP ("word-combining-categories", Vword_combining_categories,
fdb82f93
PJ
488 doc: /* List of pair (cons) of categories to determine word boundary.
489
490Emacs treats a sequence of word constituent characters as a single
e0f24100 491word (i.e. finds no word boundary between them) only if they belong to
714b2198 492the same script. But, exceptions are allowed in the following cases.
fdb82f93 493
714b2198 494\(1) The case that characters are in different scripts is controlled
fdb82f93
PJ
495by the variable `word-combining-categories'.
496
714b2198 497Emacs finds no word boundary between characters of different scripts
fdb82f93
PJ
498if they have categories matching some element of this list.
499
500More precisely, if an element of this list is a cons of category CAT1
501and CAT2, and a multibyte character C1 which has CAT1 is followed by
502C2 which has CAT2, there's no word boundary between C1 and C2.
503
714b2198
KH
504For instance, to tell that Han characters followed by Hiragana
505characters can form a single word, the element `(?C . ?H)' should be
506in this list.
fdb82f93 507
714b2198 508\(2) The case that character are in the same script is controlled by
fdb82f93
PJ
509the variable `word-separating-categories'.
510
ecdcaa09 511Emacs finds a word boundary between characters of the same script
fdb82f93
PJ
512if they have categories matching some element of this list.
513
514More precisely, if an element of this list is a cons of category CAT1
8a605fe8
KH
515and CAT2, and a multibyte character C1 which has CAT1 but not CAT2 is
516followed by C2 which has CAT2 but not CAT1, there's a word boundary
517between C1 and C2.
fdb82f93 518
714b2198
KH
519For instance, to tell that there's a word boundary between Hiragana
520and Katakana (both are in the same script `kana'),
521the element `(?H . ?K) should be in this list. */);
4ed46869
KH
522
523 Vword_combining_categories = Qnil;
524
29208e82 525 DEFVAR_LISP ("word-separating-categories", Vword_separating_categories,
fdb82f93
PJ
526 doc: /* List of pair (cons) of categories to determine word boundary.
527See the documentation of the variable `word-combining-categories'. */);
4ed46869
KH
528
529 Vword_separating_categories = Qnil;
530
531 defsubr (&Smake_category_set);
532 defsubr (&Sdefine_category);
533 defsubr (&Scategory_docstring);
534 defsubr (&Sget_unused_category);
535 defsubr (&Scategory_table_p);
536 defsubr (&Scategory_table);
537 defsubr (&Sstandard_category_table);
538 defsubr (&Scopy_category_table);
70414a3d 539 defsubr (&Smake_category_table);
4ed46869
KH
540 defsubr (&Sset_category_table);
541 defsubr (&Schar_category_set);
542 defsubr (&Scategory_set_mnemonics);
543 defsubr (&Smodify_category_entry);
4ed46869
KH
544
545 category_table_version = 0;
546}