1 /* m17n-core.c -- body of the CORE API.
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
25 @brief Introduction to the m17n library
29 The API of the m17n library is divided into these four.
34 It provides basic modules to handle M-texts. They do not require
35 the m17n database. To use this API, an application program must
36 include <m17n-core.h> and be linked by -lm17n-core.
40 It provides modules that utilize the m17n database. They load
41 various kinds of data from the database on demand. To use this
42 API, an application program must include <m17n.h> and be linked by
43 -lm17n-core -lm17n. With that, CORE API is also available.
47 It provides GUI modules such as drawing and inputting M-texts on a
48 window system. The API itself is independent on a window system,
49 but the m17n library must be configured to use a specific window
50 system. Currently, we support only the X Window System. To use
51 this API, an application program must include <m17n-gui.h> and
52 <m17n-X.h>, and be linked by -lm17n-core -lm17n -lm17n-X. With
53 that, CORE and SHELL APIs are also available.
57 It provides miscellaneous functions to support error handling and
58 debugging. This API cannot be used by itself, but with one or more
59 APIs listed above. To use the API, an application program must
60 include <m17n-misc.h> in addition to one of <m17n-core.h>,
61 <m17n.h>, and <m17n-gui.h>.
65 See also the section @ref m17n-config "m17n-config(1)".
67 <em>ENVIRONMENT VARIABLE</em>
69 The m17n library pays attention to these environment variables.
74 Name of a directory that contains data of the m17n database. See
75 @ref m17nDatabase for the detail.
79 Environment variables whose name start by "MDEBUG_" controls
80 printing of debug information. See @ref m17nDebug for the detail.
84 <em>API NAMING CONVENTION</em>
86 The library exports functions, variables, macros, and types. All
87 of them start by the letter 'm' or 'M' followed by an object name
88 (e.g. "symbol" and "plist", but "mtext" object is given the name
89 "text" to avoid double 'm' at the head) or a module name
94 <li> functions -- mobject () or mobject_xxx ()
96 They start with 'm' followed by lower case object name. For
97 example, msymbol (), mtext_ref_char (), mdraw_text ().
99 <li> non-symbol variables -- mobject, or mobject_xxx
101 The naming convention is the same as functions (e.g. mface_large).
103 <li> symbol variables -- Mname
105 Variables of type MSymbol start with 'M' followed by their names
106 (e.g. Mlanguage (name is "language"), Miso_2022 (name is
109 <li> macros -- MOBJECT_XXX
111 They start by 'M' followed by upper case object names.
113 <li> types -- MObject or MObjectXxx
115 They start by 'M' followed by capitalized object names (e.g.
116 MConverter, MInputDriver).
123 @addtogroup m17nIntro
124 @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó
128 m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£
133 M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤ÎʬÎà¤Î API ¤Ï
134 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òɬÍפȤ·¤Ê¤¤¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç
135 ¥ó¥×¥í¥°¥é¥à¤Ï<m17n-core.h> ¤ò include ¤·¡¢ -lm17n-core ¤Ç¥ê¥ó¥¯¤µ
140 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÍøÍѤ¹¤ë¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¥â¥¸¥å¡¼¥ë¤Ï¥Ç¡¼
141 ¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼¥¿¤ò¥í¡¼¥É¤¹¤ë¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
142 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï <m17n.h> ¤ò include ¤·¡¢ -lm17n-core
143 -lm17n ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¥³¥¢ API
148 M-texts ¤ò¥¦¥£¥ó¥É¥¦¾å¤Çɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤È¤¤¤Ã¤¿¡¢¥°¥é¥Õ¥£¥Ã
149 ¥¯¥æ¡¼¥¶¥¤¥ó¥¿¥Õ¥§¡¼¥¹¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£API ¼«ÂΤϥ¦¥£¥ó¥É¥¦¥·
150 ¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢ m17n ¥é¥¤¥Ö¥é¥ê¤ÏÆÃÄê¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à
151 ¤ò»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¸½»þÅÀ¤Ç¤Ï¡¢X ¥¦¥£¥ó¥É¥¦¥·
152 ¥¹¥Æ¥à¤À¤±¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×
153 ¥í¥°¥é¥à¤Ï<m17n-gui.h> ¤È <m17n-X.h> ¤ò include ¤·¡¢-lm17n-core
154 -lm17n -lm17n-X ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ ¤³¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã
155 ¤Æ¥³¥¢ API ¤È¥·¥§¥ë API ¤â»ÈÍѤǤ¤ë¡£
159 ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API ¤Ï¤½¤ì¤À
160 ¤±¤Ç¤Ï»ÈÍѤǤ¤º¡¢¾åµ¤Î¾¤Î¤â¤Î¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï
161 <m17n-core.h>, <m17n.h>, <m17n-gui.h> ¤Î¤¤¤º¤ì¤«¤Ë²Ã¤¨¤Æ¡¢
162 <m17n-misc.h> ¤ò include ¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
166 @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£
170 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¼¡¤Î´Ä¶ÊÑ¿ô¤ò¹Íθ¤¹¤ë¡£
175 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¡£¾ÜºÙ¤Ï@ref
180 "MDEBUG_" ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ä¶ÊÑ¿ô¤Ï¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ©¸æ¤¹¤ë¡£¾ÜºÙ
181 ¤Ï@ref m17nDebug »²¾È¡£
185 @em API @em ¤Î̿̾µ¬Â§ ¥³¥Þ¥ó¥É
187 ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï'm' ¤Þ
188 ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾("symbol" ¤ä "plist" ¤Ê¤É¡£¤¿¤À¤·
189 "mtext" ¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤Ï¤¸¤á¤Î 'm' ¤Î½ÅÊ£¤òÈò¤±¤ë¤¿¤á "text" ¤òÍÑ
190 ¤¤¤ë¡£) ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾(draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£
194 <li> ´Ø¿ô -- mobject () ¤Þ¤¿¤Ï mobject_xxx ()
196 'm' ¤Î¤¢¤È¤Ë¾®Ê¸»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð¡¢msymbol (),
197 mtext_ref_char (), mdraw_text () ¤Ê¤É¡£
199 <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject, ¤Þ¤¿¤Ï mobject_xxx
201 ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£(¤¿¤È¤¨¤Ð mface_large)
203 <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
205 MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï
206 "language"), Miso_2022 (̾Á°¤Ï"iso-2022")¤Ê¤É¡£
208 <li> ¥Þ¥¯¥í -- MOBJECT_XXX
210 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£
212 <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
214 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤á¤Æ¥ª¥Ö¥¸¥§¥¯¥È̾¤ò¤¬Â³¤¯¡£ (¤¿¤È¤¨¤Ð
215 MConverter, MInputDriver)
224 The #M17NLIB_MAJOR_VERSION macro gives the major version number
225 of the m17n library. */
228 ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
231 #define M17NLIB_MAJOR_VERSION
236 The #M17NLIB_MINOR_VERSION macro gives the minor version number
237 of the m17n library. */
240 ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç
243 #define M17NLIB_MINOR_VERSION
248 The #M17NLIB_PATCH_LEVEL macro gives the patch level number
249 of the m17n library. */
252 ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò
255 #define M17NLIB_PATCH_LEVEL
260 The #M17NLIB_VERSION_NAME macro gives the version name of the
261 m17n library as a string. */
264 ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò
265 ʸ»úÎó¤È¤·¤ÆÍ¿¤¨¤ë¡£ */
267 #define M17NLIB_VERSION_NAME
272 @brief Initialize the m17n library.
274 The macro M17N_INIT () initializes the m17n library. This macro
275 must be called before any m17n functions are used.
277 If the initialization was successful, the external variable
278 #merror_code is set to 0. Otherwise it is set to -1. */
281 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë.
283 ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n ¤Î´Ø¿ô¤ò
284 ÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
286 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
294 @brief Finalize the m17n library.
296 The macro M17N_FINI () finalizes the m17n library. It frees all the
297 memory area used by the m17n library. Once this macro is
298 called, no m17n functions should be used until the
299 macro M17N_INIT () is called again. */
301 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë.
303 ¥Þ¥¯¥í M17N_FINI () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é¥ê
304 ¤¬»È¤Ã¤¿Á´¤Æ¤Î¥á¥â¥êÎΰè¤Ï²òÊü¤µ¤ì¤ë¡£°ìÅÙ¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤¿¤é¡¢
305 ¥Þ¥¯¥í M17N_INIT () ¤¬ºÆÅٸƤФì¤ë¤Þ¤Ç m17n ´Ø¿ô¤Ï»È¤¦¤Ù¤¤Ç¤Ê¤¤¡£
309 #endif /* FOR_DOXYGEN */
314 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
315 /*** @addtogroup m17nInternal
321 #include <sys/time.h>
322 #include <sys/resource.h>
325 #include "m17n-core.h"
326 #include "m17n-misc.h"
327 #include "internal.h"
329 static int core_initialized;
332 default_error_handler (enum MErrorCode err)
337 static struct timeval time_stack[16];
338 static int time_stack_index;
340 static int report_header_printed;
346 mdebug__report_object (char *name, M17NObjectArray *array)
348 if (! (mdebug__flag & MDEBUG_FINI))
350 if (! report_header_printed)
352 fprintf (stderr, "%16s %7s %7s %7s\n",
353 "object", "created", "freed", "alive");
354 fprintf (stderr, "%16s %7s %7s %7s\n",
355 "------", "-------", "-----", "-----");
356 report_header_printed = 1;
358 fprintf (stderr, "%16s %7d %7d %7d\n", name,
359 array->used, array->used - array->count, array->count);
362 free (array->objects);
363 array->count = array->used = 0;
368 void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
369 MSymbol tag3, MSymbol tag4);
370 void *(*mdatabase__loader) (void *);
379 gettimeofday (time_stack + time_stack_index++, &tz);
389 mdebug__print_time ()
395 gettimeofday (&tv, &tz);
396 diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
397 + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
398 fprintf (stderr, "%8ld ms.", diff);
399 time_stack[time_stack_index - 1] = tv;
402 #define SET_DEBUG_FLAG(env_name, mask) \
404 char *env_value = getenv (env_name); \
406 if (env_value && env_value[0] == '1') \
407 mdebug__flag |= (mask); \
414 /* The following two are actually not exposed to a user but concealed
415 by the macro M17N_INIT (). */
418 m17n_init_core (void)
420 int mdebug_mask = MDEBUG_INIT;
422 if (core_initialized)
425 merror_code = MERROR_NONE;
426 m17n_memory_full_handler = default_error_handler;
429 SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
430 SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
431 SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
432 SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
433 SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
434 SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT);
435 SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
436 SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
437 SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
441 if (msymbol__init () < 0)
443 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize symbol module."));
444 if (mplist__init () < 0)
446 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
447 if (mtext__init () < 0)
449 if (mtext__prop_init () < 0)
451 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
452 if (mchartable__init () < 0)
454 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
456 mdatabase__finder = NULL;
457 mdatabase__loader = NULL;
458 core_initialized = 1;
462 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
467 m17n_fini_core (void)
469 int mdebug_mask = MDEBUG_FINI;
471 if (core_initialized)
475 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize chartable module."));
477 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize textprop module."));
479 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize mtext module."));
481 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize symbol module."));
483 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize plist module."));
485 core_initialized = 0;
487 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the core modules."));
490 report_header_printed = 0;
494 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
498 @addtogroup m17nObject
499 @brief Managed objects are objects managed by the reference count.
501 There are some types of m17n objects that are managed by their
502 reference count. Those objects are called @e managed @e objects.
503 When created, the reference count of a managed object is
504 initialized to one. The m17n_object_ref () function increments
505 the reference count of a managed object by one, and the
506 m17n_object_unref () function decrements by one. A managed
507 object is automatically freed when its reference count becomes
510 A property whose key is a managing key can have only a managed
511 object as its value. Such functions as msymbol_put () and
512 mplist_put () pay special attention to such a property.
514 In addition to the predefined managed object types, users can
515 define their own managed object types. See the documentation of
516 the m17n_object () for the details. */
518 @addtogroup m17nObject
519 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
521 m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
522 ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì
523 ¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï 0 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref ()
524 ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref ()
525 ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ
528 ¥¡¼¤¬´ÉÍý¥¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò
529 ¼è¤ë¡£´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£
532 ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§
533 ¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£¾ÜºÙ¤Ïm17n_object () ¤ÎÀâ
539 @brief Allocate a managed object.
541 The m17n_object () function allocates a new managed object of
542 $SIZE bytes and sets its reference count to 1. $FREER is the
543 function that is used to free the object when the reference count
544 becomes 0. If $FREER is NULL, the object is freed by the free ()
547 The heading bytes of the allocated object is occupied by
548 #M17NObjectHead. That area is reserved for the m17n library and
549 application programs should never touch it.
552 This function returns a newly allocated object.
555 This function never fails. */
558 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
560 ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤ê
561 Åö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò 1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î
562 ¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER ¤¬ NULL¤Ê
563 ¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
565 ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead ¤¬Àê¤á¤ë¡£
566 ¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é
567 ¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
570 ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
573 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
586 free (((MYStruct *) obj)->mem2);
591 my_func (MText *mt, MSymbol key, int num, char *str)
593 MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
596 st->mem2 = strdup (str);
597 /* KEY must be a managing key. */
598 mtext_put_prop (mt, 0, mtext_len (mt), key, st);
599 /* This sets the reference count of ST back to 1. */
600 m17n_object_unref (st);
605 m17n_object (int size, void (*freer) (void *))
607 M17NObject *obj = malloc (size);
610 obj->u.freer = freer;
617 @brief Increment the reference count of a managed object.
619 The m17n_object_ref () function increments the reference count of
620 the managed object pointed to by $OBJECT.
623 This function returns the resulting reference count if it fits in
624 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
628 This function never fails. */
630 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
632 ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î
636 ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
637 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
640 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
643 m17n_object_ref (void *object)
645 M17NObject *obj = (M17NObject *) object;
646 M17NObjectRecord *record;
649 if (! obj->ref_count_extended)
651 if (++obj->ref_count)
652 return (int) obj->ref_count;
653 MSTRUCT_MALLOC (record, MERROR_OBJECT);
654 record->freer = obj->u.freer;
655 MLIST_INIT1 (record, counts, 1);
656 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
657 obj->u.record = record;
658 obj->ref_count_extended = 1;
661 record = obj->u.record;
663 count = record->counts;
664 while (*count == 0xFFFFFFFF)
667 if (*count == 0xFFFFFFFF)
668 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
675 @brief Decrement the reference count of a managed object.
677 The m17n_object_unref () function decrements the reference count
678 of the managed object pointed to by $OBJECT. When the reference
679 count becomes zero, the object is freed by its freer function.
682 This function returns the resulting reference count if it fits in
683 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
684 returns -1. Thus, the return value zero means that $OBJECT is
688 This function never fails. */
690 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
692 ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È
693 ¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë
697 ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
698 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
699 ¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
702 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
704 m17n_object_unref (void *object)
706 M17NObject *obj = (M17NObject *) object;
707 M17NObjectRecord *record;
710 if (! obj->ref_count_extended)
712 if (! --obj->ref_count)
715 (obj->u.freer) (object);
720 return (int) obj->ref_count;
723 record = obj->u.record;
724 count = record->counts;
726 *(count++) = 0xFFFFFFFF;
728 if (! record->counts[0])
730 obj->ref_count_extended = 0;
732 obj->u.freer = record->freer;
733 MLIST_FREE1 (record, counts);
744 @addtogroup m17nError Error handling
745 @brief Error handling of the m17n library.
747 There are two types of errors that may happen in a function of
750 The first type is argument errors. When a library function is
751 called with invalid arguments, it returns a value that indicates
752 error and at the same time sets the external variable @e
753 merror_code to a non-zero integer.
755 The second type is memory allocation errors. When the required
756 amount of memory is not available on the system, m17n library
757 functions call a function pointed to by the external variable @c
758 m17n_memory_full_handler. The default value of the variable is a
759 pointer to the default_error_handle () function, which just calls
760 <tt> exit ()</tt>. */
763 @addtogroup m17nError ¥¨¥é¡¼½èÍý
764 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý
766 m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
768 °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë
769 ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô
770 #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
772 ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â
773 ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c
774 m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô
775 default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
783 /***en @brief External variable to hold error code of the m17n library
785 The external variable #merror_code holds an error code of the
786 m17n library. When a library function is called with an invalid
787 argument, it sets this variable to one of @c enum #MErrorCode.
789 This variable initially has the value 0. */
791 /***ja @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô
793 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
794 ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
795 @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
797 ¤³¤ÎÊÑ¿ô¤Î½é´üÃÍ¤Ï 0 ¤Ç¤¢¤ë¡£ */
799 enum MErrorCode merror_code;
803 /***en @brief Memory allocation error handler
805 The external variable #m17n_memory_full_handler holds a pointer
806 to the function to call when a library function failed to allocate
807 memory. $ERR is one of @c enum #MErrorCode indicating in which
808 function the error occurred.
810 This variable initially points a function that simply calls the
811 <tt>exit </tt>() function with $ERR as an argument.
813 An application program that needs a different error handling can
814 change this variable to point a proper function. */
816 /***ja @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é
818 ÊÑ¿ô #m17n_memory_full_handler ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ
819 ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£$ERR ¤Ï @c enum
820 #MErrorCode ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿
825 ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ
826 ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
828 ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
829 ŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤¤ë¡£ */
831 void (*m17n_memory_full_handler) (enum MErrorCode err);
838 @addtogroup m17nDebug
839 @brief Support for m17n library users to debug their programs.
841 The m17n library provides the following facilities to support the
842 library users to debug their programs.
846 <li> Environment variables to control printing of various
851 <li> MDEBUG_INIT -- If set to 1, print information about the
852 library initialization on the call of M17N_INIT ().
854 <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
855 not yet freed on the call of M17N_FINI ().
857 <li> MDEBUG_CHARSET -- If set to 1, print information about
858 charsets being loaded from the m17n database.
860 <li> MDEBUG_CODING -- If set to 1, print information about coding
861 systems being loaded from the m17n database.
863 <li> MDEBUG_DATABASE -- If set to 1, print information about
864 data being loaded from the m17n database.
866 <li> MDEBUG_FONT -- If set to 1, print information about fonts
867 being selected and opened.
869 <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
870 command of Font Layout Table are being executed.
872 <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
873 feature of OpenType Layout Table are being executed.
875 <li> MDEBUG_INPUT -- If set to 1, print information about how an
876 input method is running.
878 <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
879 setting all the above variables to 1.
883 <li> Functions to print various objects in a human readable way.
884 See the documentation of mdebug_dump_XXXX () functions.
886 <li> The hook function called on an error. See the documentation
892 @addtogroup m17nDebug
893 @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È
895 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á
896 ¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
900 <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶ÊÑ¿ô¡£
904 <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤
905 ¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
907 <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À
908 ²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
910 <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
911 ʸ»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
913 <li> MDEBUG_CODING -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
914 ¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
916 <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì
917 ¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
919 <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä
920 ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
922 <li> MDEBUG_FONT_FLT -- 1 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É¤Î¥³¥Þ¥ó¥É
923 ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
925 <li> MDEBUG_FONT_OTF -- 1 ¤Ê¤é¤Ð¡¢OpenType Layout Table ¤Î¤É¤Î°À
926 ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
928 <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ
929 ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
931 <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú
936 <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï
937 ´Ø¿ô mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
939 <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
949 @brief Hook function called on an error.
951 The mdebug_hook () function is called when an error happens. It
952 returns -1 without doing anything. It is useful to set a break
953 point on this function in a debugger. */
955 @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
957 ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1 ¤ò
958 ÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤