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 (code
41 conversion, character property, etc). They load various kinds of
42 data from the database on demand. To use this API, an application
43 program must include <m17n.h> and be linked by -lm17n. With that,
44 CORE API is also available.
48 It provides GUI modules such as drawing and inputting M-texts on a
49 graphic device. The API itself is independent on a graphic device
50 but most of functions require an argument MFrame which is for a
51 specific type of graphic device. Currently, X Window System,
52 gdImagePtr of GD library, and null device are supported as a
53 graphic device. To use this API, an application program must
54 include <m17n-gui.h>, and be linked by -lm17n-gui. With that,
55 CORE and SHELL APIs are also available.
59 It provides miscellaneous functions to support error handling and
60 debugging. This API cannot be used by itself, but with one or more
61 APIs listed above. To use the API, an application program must
62 include <m17n-misc.h> in addition to one of <m17n-core.h>,
63 <m17n.h>, and <m17n-gui.h>.
67 See also the section @ref m17n-config "m17n-config(1)".
69 <em>ENVIRONMENT VARIABLE</em>
71 The m17n library pays attention to these environment variables.
76 Name of a directory that contains data of the m17n database. See
77 @ref m17nDatabase for the detail.
81 Environment variables whose name start by "MDEBUG_" controls
82 printing of debug information. See @ref m17nDebug for the detail.
86 <em>API NAMING CONVENTION</em>
88 The library exports functions, variables, macros, and types. All
89 of them start by the letter 'm' or 'M' followed by an object name
90 (e.g. "symbol" and "plist", but "mtext" object is given the name
91 "text" to avoid double 'm' at the head) or a module name
96 <li> functions -- mobject () or mobject_xxx ()
98 They start with 'm' followed by lower case object name. For
99 example, msymbol (), mtext_ref_char (), mdraw_text ().
101 <li> non-symbol variables -- mobject, or mobject_xxx
103 The naming convention is the same as functions (e.g. mface_large).
105 <li> symbol variables -- Mname
107 Variables of type MSymbol start with 'M' followed by their names
108 (e.g. Mlanguage (name is "language"), Miso_2022 (name is
111 <li> macros -- MOBJECT_XXX
113 They start by 'M' followed by upper case object names.
115 <li> types -- MObject or MObjectXxx
117 They start by 'M' followed by capitalized object names (e.g.
118 MConverter, MInputDriver).
125 @addtogroup m17nIntro
126 @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó.
130 m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£
135 M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤ÎʬÎà¤Î API ¤Ï
136 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òɬÍפȤ·¤Ê¤¤¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç
137 ¥ó¥×¥í¥°¥é¥à¤Ï<m17n-core.h> ¤ò include ¤·¡¢ -lm17n-core ¤Ç¥ê¥ó¥¯¤µ
142 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÍøÍѤ¹¤ë¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¥â¥¸¥å¡¼¥ë¤Ï¥Ç¡¼
143 ¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼¥¿¤ò¥í¡¼¥É¤¹¤ë¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
144 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï <m17n.h> ¤ò include ¤·¡¢ -lm17n-core
145 -lm17n ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¥³¥¢ API
150 M-texts ¤ò¥¦¥£¥ó¥É¥¦¾å¤Çɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤È¤¤¤Ã¤¿¡¢¥°¥é¥Õ¥£¥Ã
151 ¥¯¥æ¡¼¥¶¥¤¥ó¥¿¥Õ¥§¡¼¥¹¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£API ¼«ÂΤϥ¦¥£¥ó¥É¥¦¥·
152 ¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢ m17n ¥é¥¤¥Ö¥é¥ê¤ÏÆÃÄê¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à
153 ¤ò»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¸½»þÅÀ¤Ç¤Ï¡¢X ¥¦¥£¥ó¥É¥¦¥·
154 ¥¹¥Æ¥à¤À¤±¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×
155 ¥í¥°¥é¥à¤Ï<m17n-gui.h> ¤È <m17n-X.h> ¤ò include ¤·¡¢-lm17n-core
156 -lm17n -lm17n-X ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ ¤³¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã
157 ¤Æ¥³¥¢ API ¤È¥·¥§¥ë API ¤â»ÈÍѤǤ¤ë¡£
161 ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API ¤Ï¤½¤ì¤À
162 ¤±¤Ç¤Ï»ÈÍѤǤ¤º¡¢¾åµ¤Î¾¤Î¤â¤Î¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï
163 <m17n-core.h>, <m17n.h>, <m17n-gui.h> ¤Î¤¤¤º¤ì¤«¤Ë²Ã¤¨¤Æ¡¢
164 <m17n-misc.h> ¤ò include ¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
168 @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£
172 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¼¡¤Î´Ä¶ÊÑ¿ô¤ò¹Íθ¤¹¤ë¡£
177 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¡£¾ÜºÙ¤Ï@ref
182 "MDEBUG_" ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ä¶ÊÑ¿ô¤Ï¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ©¸æ¤¹¤ë¡£¾ÜºÙ
183 ¤Ï@ref m17nDebug »²¾È¡£
187 @em API @em ¤Î̿̾µ¬Â§ ¥³¥Þ¥ó¥É
189 ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï'm' ¤Þ
190 ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾("symbol" ¤ä "plist" ¤Ê¤É¡£¤¿¤À¤·
191 "mtext" ¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤Ï¤¸¤á¤Î 'm' ¤Î½ÅÊ£¤òÈò¤±¤ë¤¿¤á "text" ¤òÍÑ
192 ¤¤¤ë¡£) ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾(draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£
196 <li> ´Ø¿ô -- mobject () ¤Þ¤¿¤Ï mobject_xxx ()
198 'm' ¤Î¤¢¤È¤Ë¾®Ê¸»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð¡¢msymbol (),
199 mtext_ref_char (), mdraw_text () ¤Ê¤É¡£
201 <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject, ¤Þ¤¿¤Ï mobject_xxx
203 ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£(¤¿¤È¤¨¤Ð mface_large)
205 <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
207 MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï
208 "language"), Miso_2022 (̾Á°¤Ï"iso-2022")¤Ê¤É¡£
210 <li> ¥Þ¥¯¥í -- MOBJECT_XXX
212 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£
214 <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
216 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤á¤Æ¥ª¥Ö¥¸¥§¥¯¥È̾¤ò¤¬Â³¤¯¡£ (¤¿¤È¤¨¤Ð
217 MConverter, MInputDriver)
226 The #M17NLIB_MAJOR_VERSION macro gives the major version number
227 of the m17n library. */
230 ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
233 #define M17NLIB_MAJOR_VERSION
238 The #M17NLIB_MINOR_VERSION macro gives the minor version number
239 of the m17n library. */
242 ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç
245 #define M17NLIB_MINOR_VERSION
250 The #M17NLIB_PATCH_LEVEL macro gives the patch level number
251 of the m17n library. */
254 ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò
257 #define M17NLIB_PATCH_LEVEL
262 The #M17NLIB_VERSION_NAME macro gives the version name of the
263 m17n library as a string. */
266 ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò
267 ʸ»úÎó¤È¤·¤ÆÍ¿¤¨¤ë¡£ */
269 #define M17NLIB_VERSION_NAME
274 @brief Initialize the m17n library.
276 The macro M17N_INIT () initializes the m17n library. This macro
277 must be called before any m17n functions are used.
279 If the initialization was successful, the external variable
280 #merror_code is set to 0. Otherwise it is set to -1. */
283 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë.
285 ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n ¤Î´Ø¿ô¤ò
286 ÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
288 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
296 @brief Finalize the m17n library.
298 The macro M17N_FINI () finalizes the m17n library. It frees all the
299 memory area used by the m17n library. Once this macro is
300 called, no m17n functions should be used until the
301 macro M17N_INIT () is called again. */
303 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë.
305 ¥Þ¥¯¥í M17N_FINI () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é¥ê
306 ¤¬»È¤Ã¤¿Á´¤Æ¤Î¥á¥â¥êÎΰè¤Ï²òÊü¤µ¤ì¤ë¡£°ìÅÙ¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤¿¤é¡¢
307 ¥Þ¥¯¥í M17N_INIT () ¤¬ºÆÅٸƤФì¤ë¤Þ¤Ç m17n ´Ø¿ô¤Ï»È¤¦¤Ù¤¤Ç¤Ê¤¤¡£
311 #endif /* FOR_DOXYGEN */
316 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
317 /*** @addtogroup m17nInternal
323 #include <sys/time.h>
324 #include <sys/resource.h>
327 #include "m17n-core.h"
328 #include "m17n-misc.h"
329 #include "internal.h"
331 static int core_initialized;
334 default_error_handler (enum MErrorCode err)
339 static struct timeval time_stack[16];
340 static int time_stack_index;
342 static int report_header_printed;
348 mdebug__report_object (char *name, M17NObjectArray *array)
350 if (! (mdebug__flag & MDEBUG_FINI))
352 if (! report_header_printed)
354 fprintf (stderr, "%16s %7s %7s %7s\n",
355 "object", "created", "freed", "alive");
356 fprintf (stderr, "%16s %7s %7s %7s\n",
357 "------", "-------", "-----", "-----");
358 report_header_printed = 1;
360 fprintf (stderr, "%16s %7d %7d %7d\n", name,
361 array->used, array->used - array->count, array->count);
364 free (array->objects);
365 array->count = array->used = 0;
370 void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
371 MSymbol tag3, MSymbol tag4);
372 void *(*mdatabase__loader) (void *);
381 gettimeofday (time_stack + time_stack_index++, &tz);
391 mdebug__print_time ()
397 gettimeofday (&tv, &tz);
398 diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
399 + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
400 fprintf (stderr, "%8ld ms.", diff);
401 time_stack[time_stack_index - 1] = tv;
404 #define SET_DEBUG_FLAG(env_name, mask) \
406 char *env_value = getenv (env_name); \
408 if (env_value && env_value[0] == '1') \
409 mdebug__flag |= (mask); \
414 mdebug__register_object (M17NObjectArray *array, void *object)
416 if (array->used == 0)
417 MLIST_INIT1 (array, objects, 256);
419 MLIST_APPEND1 (array, objects, object, MERROR_OBJECT);
423 mdebug__unregister_object (M17NObjectArray *array, void *object)
426 if (array->count >= 0)
430 while (i < array->used && array->objects[i] != object) i++;
432 array->objects[i] = NULL;
443 /* The following two are actually not exposed to a user but concealed
444 by the macro M17N_INIT (). */
447 m17n_init_core (void)
449 int mdebug_mask = MDEBUG_INIT;
451 if (core_initialized++)
454 merror_code = MERROR_NONE;
455 m17n_memory_full_handler = default_error_handler;
458 SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
459 SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
460 SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
461 SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
462 SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
463 SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT);
464 SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
465 SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
466 SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
470 if (msymbol__init () < 0)
472 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize symbol module."));
473 if (mplist__init () < 0)
475 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
476 if (mtext__init () < 0)
478 if (mtext__prop_init () < 0)
480 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
481 if (mchartable__init () < 0)
483 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
485 mdatabase__finder = NULL;
486 mdatabase__loader = NULL;
490 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
495 m17n_fini_core (void)
497 int mdebug_mask = MDEBUG_FINI;
499 if (core_initialized > 1)
503 core_initialized = 0;
506 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize chartable module."));
508 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize textprop module."));
510 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize mtext module."));
512 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize symbol module."));
514 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize plist module."));
517 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the core modules."));
520 report_header_printed = 0;
524 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
528 @addtogroup m17nObject
529 @brief Managed objects are objects managed by the reference count.
531 There are some types of m17n objects that are managed by their
532 reference count. Those objects are called @e managed @e objects.
533 When created, the reference count of a managed object is
534 initialized to one. The m17n_object_ref () function increments
535 the reference count of a managed object by one, and the
536 m17n_object_unref () function decrements by one. A managed
537 object is automatically freed when its reference count becomes
540 A property whose key is a managing key can have only a managed
541 object as its value. Such functions as msymbol_put () and
542 mplist_put () pay special attention to such a property.
544 In addition to the predefined managed object types, users can
545 define their own managed object types. See the documentation of
546 the m17n_object () for the details. */
548 @addtogroup m17nObject
549 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
551 m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
552 ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì
553 ¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï 0 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref ()
554 ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref ()
555 ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ
558 ¥¡¼¤¬´ÉÍý¥¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò
559 ¼è¤ë¡£´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£
562 ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§
563 ¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£¾ÜºÙ¤Ïm17n_object () ¤ÎÀâ
569 @brief Allocate a managed object.
571 The m17n_object () function allocates a new managed object of
572 $SIZE bytes and sets its reference count to 1. $FREER is the
573 function that is used to free the object when the reference count
574 becomes 0. If $FREER is NULL, the object is freed by the free ()
577 The heading bytes of the allocated object is occupied by
578 #M17NObjectHead. That area is reserved for the m17n library and
579 application programs should never touch it.
582 This function returns a newly allocated object.
585 This function never fails. */
588 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
590 ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤ê
591 Åö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò 1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î
592 ¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER ¤¬ NULL¤Ê
593 ¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
595 ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead ¤¬Àê¤á¤ë¡£
596 ¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é
597 ¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
600 ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
603 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
616 free (((MYStruct *) obj)->mem2);
621 my_func (MText *mt, MSymbol key, int num, char *str)
623 MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
626 st->mem2 = strdup (str);
627 /* KEY must be a managing key. */
628 mtext_put_prop (mt, 0, mtext_len (mt), key, st);
629 /* This sets the reference count of ST back to 1. */
630 m17n_object_unref (st);
635 m17n_object (int size, void (*freer) (void *))
637 M17NObject *obj = malloc (size);
640 obj->u.freer = freer;
647 @brief Increment the reference count of a managed object.
649 The m17n_object_ref () function increments the reference count of
650 the managed object pointed to by $OBJECT.
653 This function returns the resulting reference count if it fits in
654 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
658 This function never fails. */
660 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
662 ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î
666 ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
667 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
670 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
673 m17n_object_ref (void *object)
675 M17NObject *obj = (M17NObject *) object;
676 M17NObjectRecord *record;
679 if (! obj->ref_count_extended)
681 if (++obj->ref_count)
682 return (int) obj->ref_count;
683 MSTRUCT_MALLOC (record, MERROR_OBJECT);
684 record->freer = obj->u.freer;
685 MLIST_INIT1 (record, counts, 1);
686 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
687 obj->u.record = record;
688 obj->ref_count_extended = 1;
691 record = obj->u.record;
693 count = record->counts;
694 while (*count == 0xFFFFFFFF)
697 if (*count == 0xFFFFFFFF)
698 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
705 @brief Decrement the reference count of a managed object.
707 The m17n_object_unref () function decrements the reference count
708 of the managed object pointed to by $OBJECT. When the reference
709 count becomes zero, the object is freed by its freer function.
712 This function returns the resulting reference count if it fits in
713 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
714 returns -1. Thus, the return value zero means that $OBJECT is
718 This function never fails. */
720 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
722 ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È
723 ¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë
727 ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
728 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
729 ¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
732 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
734 m17n_object_unref (void *object)
736 M17NObject *obj = (M17NObject *) object;
737 M17NObjectRecord *record;
740 if (! obj->ref_count_extended)
742 if (! --obj->ref_count)
745 (obj->u.freer) (object);
750 return (int) obj->ref_count;
753 record = obj->u.record;
754 count = record->counts;
756 *(count++) = 0xFFFFFFFF;
758 if (! record->counts[0])
760 obj->ref_count_extended = 0;
762 obj->u.freer = record->freer;
763 MLIST_FREE1 (record, counts);
774 @addtogroup m17nError Error handling
775 @brief Error handling of the m17n library.
777 There are two types of errors that may happen in a function of
780 The first type is argument errors. When a library function is
781 called with invalid arguments, it returns a value that indicates
782 error and at the same time sets the external variable #merror_code
783 to a non-zero integer.
785 The second type is memory allocation errors. When the required
786 amount of memory is not available on the system, m17n library
787 functions call a function pointed to by the external variable @c
788 m17n_memory_full_handler. The default value of the variable is a
789 pointer to the default_error_handle () function, which just calls
790 <tt> exit ()</tt>. */
793 @addtogroup m17nError ¥¨¥é¡¼½èÍý
794 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý.
796 m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
798 °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë
799 ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô
800 #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
802 ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â
803 ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c
804 m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô
805 default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
814 @brief External variable to hold error code of the m17n library.
816 The external variable #merror_code holds an error code of the
817 m17n library. When a library function is called with an invalid
818 argument, it sets this variable to one of @c enum #MErrorCode.
820 This variable initially has the value 0. */
823 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô.
825 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
826 ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
827 @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
829 ¤³¤ÎÊÑ¿ô¤Î½é´üÃÍ¤Ï 0 ¤Ç¤¢¤ë¡£ */
831 enum MErrorCode merror_code;
836 @brief Memory allocation error handler.
838 The external variable #m17n_memory_full_handler holds a pointer
839 to the function to call when a library function failed to allocate
840 memory. $ERR is one of @c enum #MErrorCode indicating in which
841 function the error occurred.
843 This variable initially points a function that simply calls the
844 <tt>exit </tt>() function with $ERR as an argument.
846 An application program that needs a different error handling can
847 change this variable to point a proper function. */
850 @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é.
852 ÊÑ¿ô #m17n_memory_full_handler ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ
853 ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£$ERR ¤Ï @c enum
854 #MErrorCode ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿
859 ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ
860 ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
862 ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
863 ŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤¤ë¡£ */
865 void (*m17n_memory_full_handler) (enum MErrorCode err);
872 @addtogroup m17nDebug
873 @brief Support for m17n library users to debug their programs.
875 The m17n library provides the following facilities to support the
876 library users to debug their programs.
880 <li> Environment variables to control printing of various
885 <li> MDEBUG_INIT -- If set to 1, print information about the
886 library initialization on the call of M17N_INIT ().
888 <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
889 not yet freed on the call of M17N_FINI ().
891 <li> MDEBUG_CHARSET -- If set to 1, print information about
892 charsets being loaded from the m17n database.
894 <li> MDEBUG_CODING -- If set to 1, print information about coding
895 systems being loaded from the m17n database.
897 <li> MDEBUG_DATABASE -- If set to 1, print information about
898 data being loaded from the m17n database.
900 <li> MDEBUG_FONT -- If set to 1, print information about fonts
901 being selected and opened.
903 <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
904 command of Font Layout Table are being executed.
906 <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
907 feature of OpenType Layout Table are being executed.
909 <li> MDEBUG_INPUT -- If set to 1, print information about how an
910 input method is running.
912 <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
913 setting all the above variables to 1.
917 <li> Functions to print various objects in a human readable way.
918 See the documentation of mdebug_dump_XXXX () functions.
920 <li> The hook function called on an error. See the documentation
926 @addtogroup m17nDebug
927 @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È.
929 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á
930 ¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
934 <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶ÊÑ¿ô¡£
938 <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤
939 ¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
941 <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À
942 ²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
944 <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
945 ʸ»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
947 <li> MDEBUG_CODING -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
948 ¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
950 <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì
951 ¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
953 <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä
954 ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
956 <li> MDEBUG_FONT_FLT -- 1 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É¤Î¥³¥Þ¥ó¥É
957 ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
959 <li> MDEBUG_FONT_OTF -- 1 ¤Ê¤é¤Ð¡¢OpenType Layout Table ¤Î¤É¤Î°À
960 ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
962 <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ
963 ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
965 <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú
970 <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï
971 ´Ø¿ô mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
973 <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
983 @brief Hook function called on an error.
985 The mdebug_hook () function is called when an error happens. It
986 returns -1 without doing anything. It is useful to set a break
987 point on this function in a debugger. */
989 @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
991 ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1 ¤ò
992 ÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤