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., 59 Temple Place, Suite 330, Boston, MA
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 (sym->plist.val);
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 sysmbol
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));
667 /*** @addtogroup m17nDebug */
672 @brief Dump a symbol.
674 The mdebug_dump_symbol () function prints symbol $SYMBOL in a human
675 readable way to the stderr. $INDENT specifies how many columns to
676 indent the lines but the first one.
679 This function returns $SYMBOL.
684 @brief ¥·¥ó¥Ü¥ë¤ò¥À¥ó¥×¤¹¤ë.
686 ´Ø¿ô mdebug_dump_symbol () ¤Ï¥·¥ó¥Ü¥ë $symbol ¤ò stderr
687 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
690 ¤³¤Î´Ø¿ô¤Ï $SYMBOL ¤òÊÖ¤¹¡£
696 mdebug_dump_symbol (MSymbol symbol, int indent)
703 MERROR (MERROR_DEBUG, Mnil);
704 prefix = (char *) alloca (indent + 1);
705 memset (prefix, 32, indent);
709 plist = NULL, name = "nil";
711 plist = &symbol->plist, name = symbol->name;
713 fprintf (stderr, "%s%s", prefix, name);
714 while (plist && MPLIST_KEY (plist) != Mnil)
716 fprintf (stderr, ":%s", MPLIST_KEY (plist)->name);
717 plist = MPLIST_NEXT (plist);
723 @brief Dump all symbol names.
725 The mdebug_dump_all_symbols () function prints names of all
726 symbols to the stderr. $INDENT specifies how many columns to
727 indent the lines but the first one.
730 This function returns #Mnil.
735 @brief ¤¹¤Ù¤Æ¤Î¥·¥ó¥Ü¥ë̾¤ò¥À¥ó¥×¤¹¤ë.
737 ´Ø¿ô mdebug_dump_all_symbols () ¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥ó¥Ü¥ë¤Î̾Á°¤ò
738 stderr ¤Ë°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
741 ¤³¤Î´Ø¿ô¤Ï #Mnil ¤òÊÖ¤¹¡£
748 mdebug_dump_all_symbols (int indent)
755 MERROR (MERROR_DEBUG, Mnil);
756 prefix = (char *) alloca (indent + 1);
757 memset (prefix, 32, indent);
760 fprintf (stderr, "(symbol-list");
761 for (i = n = 0; i < SYMBOL_TABLE_SIZE; i++)
762 if ((sym = symbol_table[i]))
764 fprintf (stderr, "\n%s (%4d", prefix, i);
765 for (; sym; sym = sym->next, n++)
766 fprintf (stderr, " '%s'", sym->name);
767 fprintf (stderr, ")");
769 fprintf (stderr, "\n%s (total %d)", prefix, n);
770 fprintf (stderr, ")");