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