1 /* symbol.c -- symbol module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 @addtogroup m17nSymbol
26 @brief Symbol objects and API for them.
28 The m17n library uses objects called @e symbols as unambiguous
29 identifiers. Symbols are similar to atoms in the X library, but a
30 symbol can have zero or more @e symbol @e properties. A symbol
31 property consists of a @e key and a @e value, where key is also a
32 symbol and value is anything that can be cast to <tt>(void *)</tt>.
33 "The symbol property that belongs to the symbol S and
34 whose key is K" may be shortened to "K property of S".
36 Symbols are used mainly in the following three ways.
38 @li As keys of symbol properties and other properties.
40 @li To represent various objects, e.g. charsets, coding systems,
43 @li As arguments of the m17n library functions to control
46 There is a special kind of symbol, a @e managing @e key. The
47 value of a property whose key is a managing key must be a @e
48 managed @e object. See @ref m17nObject for the detail.
51 @addtogroup m17nSymbol ¥·¥ó¥Ü¥ë
53 @brief ¥·¥ó¥Ü¥ë¥ª¥Ö¥¸¥§¥¯¥È¤È¤½¤ì¤Ë´Ø¤¹¤ë API.
55 m17n ¥é¥¤¥Ö¥é¥ê¤Ï°ì°Õ¤Ë·è¤Þ¤ë¼±Ê̻ҤȤ·¤Æ @e ¥·¥ó¥Ü¥ë
56 ¤È¸Æ¤Ö¥ª¥Ö¥¸¥§¥¯¥È¤òÍѤ¤¤ë¡£¥·¥ó¥Ü¥ë¤Ï X ¥é¥¤¥Ö¥é¥ê¤Î¥¢¥È¥à¤È»÷¤Æ¤¤¤ë¤¬¡¢
57 0 ¸Ä°Ê¾å¤Î @e ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¤ë¡£¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤Ï
58 @e ¥¡¼ ¤È @e ÃÍ ¤«¤é¤Ê¤ë¡£¥¡¼¤Ï¤½¤ì¼«ÂÎ¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃͤÏ
59 <tt>(void *)</tt> ·¿¤Ë¥¥ã¥¹¥È¤Ç¤¤ë¤â¤Î¤Ê¤é²¿¤Ç¤â¤è¤¤¡£¡Ö¥·¥ó¥Ü¥ë
60 S ¤¬»ý¤Ä¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥¡¼¤¬ K ¤Î¤â¤Î¡×¤ò´Êñ¤Ë¡ÖS ¤Î K
61 ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£
63 ¥·¥ó¥Ü¥ë¤ÎÍÑÅӤϼç¤Ë°Ê²¼¤Î3Ä̤ê¤Ç¤¢¤ë¡£
65 @li ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ª¤è¤Ó¾¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òɽ¤¹¡£
67 @li ʸ»ú¥»¥Ã¥È¡¢¥³¡¼¥É·Ï¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ê¤É¤Î³Æ¼ï¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¤¹¡£
69 @li m17n ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Î°ú¿ô¤È¤Ê¤ê¡¢´Ø¿ô¤ÎµóÆ°¤òÀ©¸æ¤¹¤ë¡£
71 @e ´ÉÍý¥¡¼ ¤È¸Æ¤Ð¤ì¤ëÆÃÊ̤ʥ·¥ó¥Ü¥ë¤¬¤¢¤ê¡¢´ÉÍý¥¡¼¤ò¥¡¼¤È¤·¤Æ»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤÏ
72 @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¾ÜºÙ¤Ï @ref m17nObject »²¾È¡£
77 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
78 /*** @addtogroup m17nInternal
87 #include "m17n-misc.h"
90 #include "character.h"
94 static int num_symbols;
96 #define SYMBOL_TABLE_SIZE 1024
98 static MSymbol symbol_table[SYMBOL_TABLE_SIZE];
101 hash_string (const char *str, int len)
104 const char *end = str + len;
109 c = *((unsigned char *) str++);
112 hash = ((hash << 3) + (hash >> 28) + c);
114 return hash & (SYMBOL_TABLE_SIZE - 1);
119 serialize_symbol (void *val)
121 MPlist *plist = mplist ();
123 mplist_add (plist, Msymbol, val);
128 deserialize_symbol (MPlist *plist)
130 return (MPLIST_SYMBOL_P (plist) ? MPLIST_SYMBOL (plist) : Mnil);
142 Msymbol = msymbol ("symbol");
143 Mstring = msymbol ("string");
153 for (i = 0; i < SYMBOL_TABLE_SIZE; i++)
154 for (sym = symbol_table[i]; sym; sym = sym->next)
155 if (! MPLIST_TAIL_P (&sym->plist))
157 if (sym->plist.key->managing_key)
158 M17N_OBJECT_UNREF (MPLIST_VAL (&sym->plist));
159 M17N_OBJECT_UNREF (sym->plist.next);
160 sym->plist.key = Mnil;
165 msymbol__free_table ()
169 int freed_symbols = 0;
171 for (i = 0; i < SYMBOL_TABLE_SIZE; i++)
173 for (sym = symbol_table[i]; sym; sym = next)
180 symbol_table[i] = NULL;
182 if (mdebug__flag & MDEBUG_FINI)
183 fprintf (stderr, "%16s %7d %7d %7d\n", "Symbol",
184 num_symbols, freed_symbols, num_symbols - freed_symbols);
190 msymbol__with_len (const char *name, int len)
192 char *p = alloca (len + 1);
194 memcpy (p, name, len);
199 /** Return a plist of symbols that has non-NULL property PROP. If
200 PROP is Mnil, return a plist of all symbols. Values of the plist
204 msymbol__list (MSymbol prop)
206 MPlist *plist = mplist ();
210 for (i = 0; i < SYMBOL_TABLE_SIZE; i++)
211 for (sym = symbol_table[i]; sym; sym = sym->next)
212 if (prop == Mnil || msymbol_get (sym, prop))
213 mplist_push (plist, sym, NULL);
218 /** Canonicalize the name of SYM, and return a symbol of the
219 canonicalized name. Canonicalization is done by this rule:
220 o convert all uppercase characters to lowercase.
221 o remove all non alpha-numeric characters.
222 o change the leading "ibm" to "cp".
223 o change the leading "cp" to "ibm"
224 o remove the leading "iso".
226 "ISO-8859-2" -> "88592"
229 "CP1250" -> "ibm1250"
231 This function is used to canonicalize charset and coding system
235 msymbol__canonicalize (MSymbol sym)
237 char *name = sym->name;
238 /* Extra 2 bytes are for changing "cpXXX" to "ibmXXX" and
240 char *canon = (char *) alloca (strlen (name) + 2);
243 for (; *name; name++)
245 *p++ = TOLOWER (*name);
247 if (p - canon > 3 && canon[0] == 'i')
249 if (canon[1] == 'b' && canon[2] == 'm' && isdigit (canon[3]))
251 /* Change "ibmXXX" to "cpXXX". */
256 else if (canon[1] == 's' && canon[2] == 'o')
258 /* Change "isoXXX" to "XXX". */
262 else if (p - canon > 2
263 && canon[0] == 'c' && canon[1] == 'p' && isdigit (canon[2]))
265 /* Change "cpXXX" to "ibmXXX". */
266 for (; p >= canon + 2; p--)
273 return msymbol (canon);
276 MTextPropSerializeFunc msymbol__serializer = serialize_symbol;
277 MTextPropDeserializeFunc msymbol__deserializer = deserialize_symbol;
280 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
285 /*** @addtogroup m17nSymbol */
290 @brief Symbol whose name is "nil".
292 The symbol #Mnil has the name <tt>"nil"</tt> and, in general,
293 represents @e false or @e no. When coerced to "int", its value is
294 zero. #Mnil can't have any symbol property. */
296 @brief "nil" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
298 ¥·¥ó¥Ü¥ë #Mnil ¤Ï <tt>"nil"</tt>
299 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Á¡¢°ìÈ̤ˡֵ¶¡×¤Þ¤¿¤Ï¡ÖÈÝÄê¡×¤ò°ÕÌ£¤¹¤ë¡£
300 "int" ¤ËÊÑ´¹¤µ¤ì¤¿¾ì¹ç¡¢ÃÍ¤Ï 0 ¤Ç¤¢¤ë¡£
301 #Mnil ¼«¿È¤Ï¤¤¤«¤Ê¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤â»ý¤¿¤Ê¤¤¡£ */
308 @brief Symbol whose name is "t".
310 The symbol #Mt has the name <tt>"t"</tt> and, in general,
311 represents @e true or @e yes. */
313 @brief "t" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
315 ¥·¥ó¥Ü¥ë #Mt ¤Ï <tt>"t"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Á¡¢°ìÈ̤ˡֿ¿¡×¤Þ¤¿¤Ï¡Ö¹ÎÄê¡×¤ò°ÕÌ£¤¹¤ë¡£ */
322 @brief Symbol whose name is "string".
324 The symbol #Mstring has the name <tt>"string"</tt> and is used
325 as an argument of the functions mchar_define_property (),
328 @brief "string" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
330 ¥·¥ó¥Ü¥ë #Mstring ¤Ï <tt>"string"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Á¡¢´Ø¿ô
331 mchar_define_property () ¤Ê¤É¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
338 @brief Symbol whose name is "symbol".
340 The symbol #Msymbol has the name <tt>"symbol"</tt> and is used
341 as an argument of the functions mchar_define_property (),
344 @brief "symbol" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
346 ÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë #Msymbol ¤Ï <tt>"symbol"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Á¡¢´Ø¿ô
347 mchar_define_property () ¤Ê¤É¤Î°ú¿ô¤È¤·¤Æ»È¤ï¤ì¤ë¡£ */
356 The msymbol () function returns the canonical symbol whose name is
357 $NAME. If there is none, one is created. The created one is not
360 Symbols whose name starts by two spaces are reserved by the m17n
361 library, and are used by the library only internally.
364 This function returns the found or created symbol.
367 This function never fails. */
369 @brief ¥·¥ó¥Ü¥ë¤òÆÀ¤ë.
371 ´Ø¿ô msymbol () ¤Ï $NAME
372 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤ÄÀµµ¬²½¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£¤½¤Î¤è¤¦¤Ê¥·¥ó¥Ü¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢À¸À®¤¹¤ë¡£À¸À®¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤Ï´ÉÍý¥¡¼¤Ç¤Ï¤Ê¤¤¡£
374 ¶õÇòʸ»úÆó¤Ä¤Ç»Ï¤Þ¤ë¥·¥ó¥Ü¥ë¤Ï m17n ¥é¥¤¥Ö¥é¥êÍѤǤ¢¤ê¡¢ÆâÉôŪ¤Ë¤Î¤ßÍѤ¤¤é¤ì¤ë¡£
377 ¤³¤Î´Ø¿ô¤Ï¸«¤Ä¤±¤¿¤«À¸À®¤·¤¿¤«¤·¤¿¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£
380 ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£
382 @latexonly \IPAlabel{msymbol} @endlatexonly */
386 msymbol_as_managing_key (), msymbol_name (), msymbol_exist () */
389 msymbol (const char *name)
396 if (len == 3 && name[0] == 'n' && name[1] == 'i' && name[2] == 'l')
398 hash = hash_string (name, len);
400 for (sym = symbol_table[hash]; sym; sym = sym->next)
401 if (len == sym->length
402 && *name == *(sym->name)
403 && ! memcmp (name, sym->name, len))
407 MTABLE_CALLOC (sym, 1, MERROR_SYMBOL);
408 MTABLE_MALLOC (sym->name, len, MERROR_SYMBOL);
409 memcpy (sym->name, name, len);
411 sym->next = symbol_table[hash];
412 symbol_table[hash] = sym;
417 @brief Create a managing key.
419 The msymbol_as_managing_key () function returns a newly created
420 managing key whose name is $NAME. It there already exists a
421 symbol of name $NAME, it returns #Mnil.
423 Symbols whose name starts by two spaces are reserved by the m17n
424 library, and are used by the library only internally.
427 If the operation was successful, this function returns the created
428 symbol. Otherwise, it returns #Mnil. */
430 @brief ´ÉÍý¥¡¼¤òºî¤ë.
432 ´Ø¿ô msymbol_as_managing_key () ¤Ï̾Á° $NAME
433 ¤ò»ý¤Ä¿·¤·¤¯ºî¤é¤ì¤¿´ÉÍý¥¡¼¤òÊÖ¤¹¡£¤¹¤Ç¤Ë̾Á° $NAME ¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤¬¤¢¤ì¤Ð¡¢
436 ¶õÇòʸ»úÆó¤Ä¤Ç»Ï¤Þ¤ë¥·¥ó¥Ü¥ë¤Ï m17n ¥é¥¤¥Ö¥é¥êÍѤǤ¢¤ê¡¢ÆâÉôŪ¤Ë¤Î¤ßÍѤ¤¤é¤ì¤ë¡£
439 ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤ÏÀ¸À®¤·¤¿¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
447 msymbol (), msymbol_exist () */
450 msymbol_as_managing_key (const char *name)
457 if (len == 3 && name[0] == 'n' && name[1] == 'i' && name[2] == 'l')
458 MERROR (MERROR_SYMBOL, Mnil);
459 hash = hash_string (name, len);
461 for (sym = symbol_table[hash]; sym; sym = sym->next)
462 if (len == sym->length
463 && *name == *(sym->name)
464 && ! memcmp (name, sym->name, len))
465 MERROR (MERROR_SYMBOL, Mnil);
468 MTABLE_CALLOC (sym, 1, MERROR_SYMBOL);
469 sym->managing_key = 1;
470 MTABLE_MALLOC (sym->name, len, MERROR_SYMBOL);
471 memcpy (sym->name, name, len);
473 sym->next = symbol_table[hash];
474 symbol_table[hash] = sym;
481 @brief Check if a symbol is a managing key.
483 The msymbol_is_managing_key () function checks if the symbol
484 $SYMBOL is a managing key or not.
486 @return Return 1 if the symbol is a managing key. Otherwise,
490 msymbol_is_managing_key (MSymbol symbol)
492 return (symbol->managing_key == 1);
498 @brief Search for a symbol that has a specified name.
500 The msymbol_exist () function searches for the symbol whose name
504 If such a symbol exists, msymbol_exist () returns that symbol.
505 Otherwise it returns the predefined symbol #Mnil.
508 This function never fails. */
510 @brief »ØÄꤵ¤ì¤¿Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òõ¤¹.
512 ´Ø¿ô msymbol_exist () ¤Ï $NAME ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òõ¤¹¡£
515 ¤â¤·¤½¤Î¤è¤¦¤Ê¥·¥ó¥Ü¥ë¤¬Â¸ºß¤¹¤ë¤Ê¤é¤Ð¤½¤Î¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¢ÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë
519 ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
522 msymbol_name (), msymbol () */
525 msymbol_exist (const char *name)
532 if (len == 3 && name[0] == 'n' && name[1] == 'i' && name[2] == 'l')
534 hash = hash_string (name, len);
536 for (sym = symbol_table[hash]; sym; sym = sym->next)
537 if (len == sym->length
538 && *name == *(sym->name)
539 && ! memcmp (name, sym->name, len))
547 @brief Get symbol name.
549 The msymbol_name () function returns a pointer to a string
550 containing the name of $SYMBOL.
553 This function never fails. */
555 @brief ¥·¥ó¥Ü¥ë¤Î̾Á°¤òÆÀ¤ë.
557 ´Ø¿ô msymbol_name () ¤Ï»ØÄꤵ¤ì¤¿¥·¥ó¥Ü¥ë $SYMBOL
558 ¤Î̾Á°¤ò´Þ¤àʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
561 ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
564 msymbol (), msymbol_exist () */
567 msymbol_name (MSymbol symbol)
569 return (symbol == Mnil ? "nil" : symbol->name);
574 @brief Set the value of a symbol property.
576 The msymbol_put () function assigns $VAL to the value of the
577 symbol property that belongs to $SYMBOL and whose key is $KEY. If
578 the symbol property already has a value, $VAL overwrites the old
579 one. Both $SYMBOL and $KEY must not be #Mnil.
581 If $KEY is a managing key, $VAL must be a managed object. In this
582 case, the reference count of the old value, if not @c NULL, is
583 decremented by one, and that of $VAL is incremented by one.
586 If the operation was successful, msymbol_put () returns 0.
587 Otherwise it returns -1 and assigns an error code to the external
588 variable #merror_code. */
590 @brief ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
592 ´Ø¿ô msymbol_put () ¤Ï¡¢¥·¥ó¥Ü¥ë $SYMBOL Ãæ¤Ç¥¡¼¤¬ $KEY ¤Ç¤¢¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò
593 $VAL ¤ËÀßÄꤹ¤ë¡£¤½¤Î¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤Ë¤¹¤Ç¤ËÃͤ¬¤¢¤ì¤Ð¾å½ñ¤¤¹¤ë¡£
594 $SYMBOL, $KEY ¤È¤â #Mnil ¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
596 $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢$VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢¸Å¤¤Ãͤλ²¾È¿ô¤Ï
597 @c NULL ¤Ç¤Ê¤±¤ì¤Ð 1 ¸º¤é¤µ¤ì¡¢$VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
600 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¡¢msymbol_put () ¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1
601 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
611 msymbol_put (MSymbol symbol, MSymbol key, void *val)
613 if (symbol == Mnil || key == Mnil)
614 MERROR (MERROR_SYMBOL, -1);
615 mplist_put (&symbol->plist, key, val);
622 @brief Get the value of a symbol property.
624 The msymbol_get () function searches for the value of the symbol
625 property that belongs to $SYMBOL and whose key is $KEY. If
626 $SYMBOL has such a symbol property, its value is returned.
627 Otherwise @c NULL is returned.
630 If an error is detected, msymbol_get () returns @c NULL and
631 assigns an error code to the external variable #merror_code. */
633 @brief ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
635 ´Ø¿ô msymbol_get () ¤Ï¡¢¥·¥ó¥Ü¥ë $SYMBOL
636 ¤¬»ý¤Ä¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬ $KEY
637 ¤Ç¤¢¤ë¤â¤Î¤òõ¤¹¡£¤â¤·³ºÅö¤¹¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤¬Â¸ºß¤¹¤ì¤Ð¡¢¤½¤ì¤ÎÃͤòÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
641 ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¡¢msymbol_get () ¤Ï @c NULL
642 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
652 msymbol_get (MSymbol symbol, MSymbol key)
656 if (symbol == Mnil || key == Mnil)
658 plist = &symbol->plist;
659 MPLIST_FIND (plist, key);
660 return (MPLIST_TAIL_P (plist) ? NULL : MPLIST_VAL (plist));
665 @brief Set the value (function pointer) of a symbol property.
667 The msymbol_put_func () function is similar to msymbol_put () but for
668 setting function pointer $FUNC as the property value of $SYMBOL for
672 @brief ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ(´Ø¿ô¥Ý¥¤¥ó¥¿)¤òÀßÄꤹ¤ë.
674 ´Ø¿ô msymbol_put_func () ¤Ï¡¢´Ø¿ô msymbol_put () ¤ÈƱÍͤˡ¢¥·¥ó¥Ü¥ë
675 $SYMBOL ¤Î¥¡¼¤¬ $KEY ¤Ç¤¢¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë¡£Ã¢¤·
676 ¤½¤ÎÃͤϴؿô¥Ý¥¤¥ó¥¿ $FUNC ¤Ç¤¢¤ë¡£ */
679 @seealso msymbol_put (), M17N_FUNC () */
681 msymbol_put_func (MSymbol symbol, MSymbol key, M17NFunc func)
683 if (symbol == Mnil || key == Mnil)
684 MERROR (MERROR_SYMBOL, -1);
685 mplist_put_func (&symbol->plist, key, func);
692 @brief Get the value (function pointer) of a symbol property.
694 The msymbol_get_func () function is similar to msymbol_get () but for
695 getting a function pointer form the property of symbol $SYMBOL. */
698 @brief ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ (´Ø¿ô¥Ý¥¤¥ó¥¿) ¤òÆÀ¤ë.
700 ´Ø¿ô msymbol_get_func () ¤Ï¡¢´Ø¿ô msymbol_get () ¤ÈƱÍͤˡ¢¥·¥ó¥Ü¥ë
701 $SYMBOL ¤¬»ý¤Ä¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤òÆÀ¤ë¡£Ã¢¤·
702 ¤½¤ÎÃͤϴؿô¥Ý¥¤¥ó¥¿¤ò¤Ç¤¢¤ë¡£ */
709 msymbol_get_func (MSymbol symbol, MSymbol key)
711 if (symbol == Mnil || key == Mnil)
713 return mplist_get_func (&symbol->plist, key);
720 /*** @addtogroup m17nDebug */
725 @brief Dump a symbol.
727 The mdebug_dump_symbol () function prints symbol $SYMBOL in a human
728 readable way to the stderr. $INDENT specifies how many columns to
729 indent the lines but the first one.
732 This function returns $SYMBOL.
737 @brief ¥·¥ó¥Ü¥ë¤ò¥À¥ó¥×¤¹¤ë.
739 ´Ø¿ô mdebug_dump_symbol () ¤Ï¥·¥ó¥Ü¥ë $symbol ¤ò stderr
740 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
743 ¤³¤Î´Ø¿ô¤Ï $SYMBOL ¤òÊÖ¤¹¡£
749 mdebug_dump_symbol (MSymbol symbol, int indent)
756 MERROR (MERROR_DEBUG, Mnil);
757 prefix = (char *) alloca (indent + 1);
758 memset (prefix, 32, indent);
762 plist = NULL, name = "nil";
764 plist = &symbol->plist, name = symbol->name;
766 fprintf (stderr, "%s%s", prefix, name);
767 while (plist && MPLIST_KEY (plist) != Mnil)
769 fprintf (stderr, ":%s", MPLIST_KEY (plist)->name);
770 plist = MPLIST_NEXT (plist);
776 @brief Dump all symbol names.
778 The mdebug_dump_all_symbols () function prints names of all
779 symbols to the stderr. $INDENT specifies how many columns to
780 indent the lines but the first one.
783 This function returns #Mnil.
788 @brief ¤¹¤Ù¤Æ¤Î¥·¥ó¥Ü¥ë̾¤ò¥À¥ó¥×¤¹¤ë.
790 ´Ø¿ô mdebug_dump_all_symbols () ¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥ó¥Ü¥ë¤Î̾Á°¤ò
791 stderr ¤Ë°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
794 ¤³¤Î´Ø¿ô¤Ï #Mnil ¤òÊÖ¤¹¡£
801 mdebug_dump_all_symbols (int indent)
808 MERROR (MERROR_DEBUG, Mnil);
809 prefix = (char *) alloca (indent + 1);
810 memset (prefix, 32, indent);
813 fprintf (stderr, "(symbol-list");
814 for (i = n = 0; i < SYMBOL_TABLE_SIZE; i++)
815 if ((sym = symbol_table[i]))
817 fprintf (stderr, "\n%s (%4d", prefix, i);
818 for (; sym; sym = sym->next, n++)
819 fprintf (stderr, " '%s'", sym->name);
820 fprintf (stderr, ")");
822 fprintf (stderr, "\n%s (total %d)", prefix, n);
823 fprintf (stderr, ")");