1 /* m17n-core.c -- body of the CORE API.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
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,
25 @brief Introduction to the m17n library.
29 The API of the m17n library is divided into these five.
34 It provides basic modules to handle M-texts. To use this API, an
35 application program must include <m17n-core<EM></EM>.h> and be
36 linked with -lm17n-core.
40 It provides modules for character properties, character set
41 handling, code conversion, etc. They load various kinds of
42 data from the database on demand. To use this API, an application
43 program must include <m17n<EM></EM>.h> and be linked with
46 When you use this API, CORE API is also available.
50 It provides modules for text shaping using @ref mdbFLT. To use
51 this API, an application program must include <m17n<EM></EM>.h>
52 and be linked with -lm17n-core -lm17n-flt.
54 When you use this API, CORE API is also available.
58 It provides GUI modules such as drawing and inputting M-texts on a
59 graphic device. This API itself is independent of graphic
60 devices, but most functions require an argument MFrame that is
61 created for a specific type of graphic devices. The currently
62 supported graphic devices are null device, the X Window System,
63 and image data (gdImagePtr) of the GD library.
65 On a frame of a null device, you cannot draw text nor use input
66 methods. However, functions like mdraw_glyph_list (), etc. are
69 On a frame of the X Window System, you can use the whole GUI API.
71 On a frame of the GD library, you can use all drawing API but
72 cannot use input methods.
74 To use this API, an application program must include
75 <m17n-gui<EM></EM>.h> and be linked with -lm17n-core -lm17n
78 When you use this API, CORE, SHELL, and FLT APIs are also
83 It provides miscellaneous functions to support error handling and
84 debugging. This API cannot be used standalone; it must be used
85 with one or more APIs listed above. To use this API, an
86 application program must include <m17n-misc<EM></EM>.h> in
87 addition to one of the header files described above.
91 See also the section @ref m17n-config "m17n-config(1)".
93 <em>ENVIRONMENT VARIABLES</em>
95 The m17n library pays attention to the following environment
101 The name of the directory that contains data of the m17n database.
102 See @ref m17nDatabase for details.
106 Environment variables whose names start with "MDEBUG_" control
107 debug information output. See @ref m17nDebug for details.
111 <em>API NAMING CONVENTION</em>
113 The m17n library exports functions, variables, macros, and types.
114 All of them start with the letter 'm' or 'M', and are followed by
115 an object name (e.g. "symbol", "plist") or a module name
116 (e.g. draw, input). Note that the name of M-text objects start
117 with "mtext" and not with "mmtext".
121 <li> functions -- mobject () or mobject_xxx ()
123 They start with 'm' and are followed by an object name in lower
124 case. Words are separated by '_'. For example, msymbol (),
125 mtext_ref_char (), mdraw_text ().
127 <li> non-symbol variables -- mobject, or mobject_xxx
129 The naming convention is the same as functions (e.g. mface_large).
131 <li> symbol variables -- Mname
133 Variables of the type MSymbol start with 'M' and are followed by
134 their names. Words are separated by '_'. For example, Mlanguage
135 (the name is "language"), Miso_2022 (the name is "iso-2022").
137 <li> macros -- MOBJECT_XXX
139 They start with 'M' and are followed by an object name in upper
140 case. Words are separated by '_'.
142 <li> types -- MObject or MObjectXxx
144 They start with 'M' and are followed by capitalized object names.
145 Words are concatenated directly and no '_' are used. For example,
146 MConverter, MInputDriver.
153 @addtogroup m17nIntro
154 @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó.
158 m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£
163 M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£
164 ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
165 <m17n-core<EM></EM>.h> ¤ò include ¤·¡¢ -lm17n-core
166 ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
170 ʸ»ú¥×¥í¥Ñ¥Æ¥£¡¢Ê¸»ú½¸¹çÁàºî¡¢¥³¡¼¥ÉÊÑ´¹Åù¤Î¤¿¤á¤Î¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£
171 ¤³¤ì¤é¤Î¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼¥¿¤ò¥í¡¼¥É¤¹¤ë¡£
172 ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
173 <m17n<EM></EM>.h> ¤ò include ¤·¡¢ -lm17n-core -lm17n
174 ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
176 ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
180 ʸ»úÎóɽ¼¨¤Ë @ref mdbFLT ¤òÍѤ¤¤ë¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API
181 ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï <m17n<EM></EM>.h>
182 ¤ò include ¤·¡¢ -lm17n-core -lm17n-flt ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
184 ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
188 ¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¾å¤Ç M-text ¤òɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤¿¤á¤Î
189 GUI ¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API
190 ¼«ÂΤϥ°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢
191 ¿¤¯¤Î´Ø¿ô¤ÏÆÃÄê¤Î¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹ÍѤ˺îÀ®¤µ¤ì¤¿
192 MFrame ¤ò°ú¿ô¤Ë¼è¤ë¡£
193 ¸½»þÅÀ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤Ï¡¢¥Ì¥ë¥Ç¥Ð¥¤¥¹¡¢X
194 ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¡¢¤ª¤è¤Ó GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥Ç¡¼¥¿
195 (gdImagePtr) ¤Ç¤¢¤ë¡£
197 ¥Ì¥ë¥Ç¥Ð¥¤¥¹¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ïɽ¼¨¤âÆþÎϤâ¤Ç¤¤Ê¤¤¡£¤¿¤À¤·
198 mdraw_glyph_list () ¤Ê¤É¤Î´Ø¿ô¤Ï»ÈÍѲÄǽ¤Ç¤¢¤ë¡£
200 X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¤¹¤Ù¤Æ¤Î GUI API ¤¬»ÈÍѤǤ¤ë¡£
202 GD ¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¡¢ÉÁ²èÍѤΠAPI
203 ¤Ï¤¹¤Ù¤Æ»ÈÍѤǤ¤ë¤¬¡¢ÆþÎϤϤǤ¤Ê¤¤¡£
205 ¤³¤Î API ¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
206 <m17n-gui<EM></EM>.h> ¤ò include ¤·¡¢-lm17n-core -lm17n -lm17n-gui
207 ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
209 ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API¡¢¥·¥§¥ë API¡¢¤ª¤è¤Ó FLT API
210 ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
214 ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API
215 ¤Ï¤½¤ì¤À¤±¤Ç¤Ï»ÈÍѤǤ¤º¡¢¾åµ¤Î¾¤Î API
216 ¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¾åµ¤Î¤¤¤º¤ì¤«¤Îinclude
217 ¥Õ¥¡¥¤¥ë¤Ë²Ã¤¨¤Æ¡¢ <m17n-misc<EM></EM>.h> ¤òinclude
222 @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£
226 m17n ¥é¥¤¥Ö¥é¥ê¤Ï°Ê²¼¤Î´Ä¶ÊÑ¿ô¤ò»²¾È¤¹¤ë¡£
231 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤ò³ÊǼ¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¡£¾ÜºÙ¤Ï @ref
236 "MDEBUG_" ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ä¶ÊÑ¿ô¤Ï¥Ç¥Ð¥Ã¥°¾ðÊó¤Î½ÐÎϤòÀ©¸æ¤¹¤ë¡£
237 ¾ÜºÙ¤Ï @ref m17nDebug »²¾È¡£
241 @em API @em ¤Î̿̾µ¬Â§
243 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï 'm'
244 ¤Þ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾ ("symbol"¡¢"plist" ¤Ê¤É)
245 ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾ (draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£
246 M-text ¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï "mmtext" ¤Ç¤Ï¤Ê¤¯¤Æ "mtext"
251 <li> ´Ø¿ô -- mobject () ¤Þ¤¿¤Ï mobject_xxx ()
253 'm' ¤Î¤¢¤È¤Ë¾®Ê¸»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_'
254 ¤Ç¶èÀÚ¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð¡¢msymbol (),
255 mtext_ref_char (), mdraw_text () ¤Ê¤É¡£
257 <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject, ¤Þ¤¿¤Ï mobject_xxx
259 ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£¤¿¤È¤¨¤Ð mface_large ¤Ê¤É¡£
261 <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
263 MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_'
264 ¤Ç¶èÀÚ¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï "language"), Miso_2022
265 (̾Á°¤Ï"iso-2022") ¤Ê¤É¡£
267 <li> ¥Þ¥¯¥í -- MOBJECT_XXX
269 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_' ¤Ç¶èÀÚ¤é¤ì¤ë¡£
271 <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
273 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤Þ¤ë¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì¤ÏϢ³¤·¤Æ½ñ¤«¤ì¡¢
274 '_' ¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£¤¿¤È¤¨¤Ð MConverter, MInputDriver ¤Ê¤É¡£
283 The #M17NLIB_MAJOR_VERSION macro gives the major version number
284 of the m17n library. */
286 ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n
287 ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÍ¿¤¨¤ë. */
289 #define M17NLIB_MAJOR_VERSION
294 The #M17NLIB_MINOR_VERSION macro gives the minor version number
295 of the m17n library. */
298 ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n
299 ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÍ¿¤¨¤ë. */
301 #define M17NLIB_MINOR_VERSION
306 The #M17NLIB_PATCH_LEVEL macro gives the patch level number
307 of the m17n library. */
310 ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n
311 ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤òÍ¿¤¨¤ë. */
313 #define M17NLIB_PATCH_LEVEL
318 The #M17NLIB_VERSION_NAME macro gives the version name of the
319 m17n library as a string. */
322 ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n
323 ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤òʸ»úÎó¤È¤·¤ÆÍ¿¤¨¤ë. */
325 #define M17NLIB_VERSION_NAME
330 @brief Initialize the m17n library.
332 The macro M17N_INIT () initializes the m17n library. This macro
333 must be called before any m17n functions are used.
335 It is safe to call this macro multiple times, but in that case,
336 the macro M17N_FINI () must be called the same times to free the
339 If the initialization was successful, the external variable
340 #merror_code is set to 0. Otherwise it is set to -1.
343 M17N_FINI (), m17n_status () */
346 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë.
348 ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n
349 ¤Î´Ø¿ô¤òÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
351 ¤³¤Î¥Þ¥¯¥í¤òÊ£¿ô²ó¸Æ¤ó¤Ç¤â°ÂÁ´¤Ç¤¢¤ë¤¬¡¢¤½¤Î¾ì¹ç¥á¥â¥ê¤ò²òÊü¤¹¤ë¤¿¤á¤Ë¥Þ¥¯¥í
352 M17N_FINI () ¤òƱ¤¸²ó¿ô¸Æ¤ÖɬÍפ¬¤¢¤ë¡£
354 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
358 M17N_FINI (), m17n_status () */
365 @brief Finalize the m17n library.
367 The macro M17N_FINI () finalizes the m17n library. It frees all the
368 memory area used by the m17n library. Once this macro is
369 called, no m17n functions should be used until the
370 macro M17N_INIT () is called again.
372 If the macro M17N_INIT () was called N times, the Nth call of this
373 macro actually free the memory.
376 M17N_INIT (), m17n_status () */
378 @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë.
380 ¥Þ¥¯¥í M17N_FINI () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë¡£m17n
381 ¥é¥¤¥Ö¥é¥ê¤¬»È¤Ã¤¿Á´¤Æ¤Î¥á¥â¥êÎΰè¤Ï²òÊü¤µ¤ì¤ë¡£°ìÅÙ¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤¿¤é¡¢¥Þ¥¯¥í
382 M17N_INIT () ¤¬ºÆÅٸƤФì¤ë¤Þ¤Ç m17n ´Ø¿ô¤Ï»È¤¦¤Ù¤¤Ç¤Ê¤¤¡£
384 ¥Þ¥¯¥í M17N_INIT () ¤¬ N ²ó¸Æ¤Ð¤ì¤Æ¤¤¤¿¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Þ¥¯¥í¤¬ N
385 ²ó¸Æ¤Ð¤ì¤Æ½é¤á¤Æ¥á¥â¥ê¤¬²òÊü¤µ¤ì¤ë¡£
388 M17N_INIT (), m17n_status () */
391 #endif /* FOR_DOXYGEN */
396 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
397 /*** @addtogroup m17nInternal
404 #include <sys/time.h>
405 #include <sys/resource.h>
408 #include "m17n-core.h"
409 #include "m17n-misc.h"
410 #include "internal.h"
414 default_error_handler (enum MErrorCode err)
419 static struct timeval time_stack[16];
420 static int time_stack_index;
422 static M17NObjectArray *object_array_root;
425 report_object_array ()
427 fprintf (mdebug__output, "%16s %7s %7s %7s\n",
428 "object", "created", "freed", "alive");
429 fprintf (mdebug__output, "%16s %7s %7s %7s\n",
430 "------", "-------", "-----", "-----");
431 for (; object_array_root; object_array_root = object_array_root->next)
433 M17NObjectArray *array = object_array_root;
435 fprintf (mdebug__output, "%16s %7d %7d %7d\n", array->name,
436 array->used, array->used - array->count, array->count);
437 if (array->count > 0)
440 for (i = 0; i < array->used && ! array->objects[i]; i++);
442 if (strcmp (array->name, "M-text") == 0)
444 MText *mt = (MText *) array->objects[i];
446 if (mt->format <= MTEXT_FORMAT_UTF_8)
447 fprintf (mdebug__output, "\t\"%s\"\n", (char *) mt->data);
449 else if (strcmp (array->name, "Plist") == 0)
451 MPlist *plist = (MPlist *) array->objects[i];
453 mdebug_dump_plist (plist, 8);
454 fprintf (mdebug__output, "\n");
460 free (array->objects);
461 array->count = array->used = 0;
470 int m17n__core_initialized;
471 int m17n__shell_initialized;
472 int m17n__gui_initialized;
474 int mdebug__flags[MDEBUG_MAX];
475 FILE *mdebug__output;
482 gettimeofday (time_stack + time_stack_index++, &tz);
492 mdebug__print_time ()
498 gettimeofday (&tv, &tz);
499 diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
500 + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
501 fprintf (mdebug__output, "%8ld ms.", diff);
502 time_stack[time_stack_index - 1] = tv;
506 SET_DEBUG_FLAG (char *env_name, enum MDebugFlag flag)
508 char *env_value = getenv (env_name);
512 int int_value = atoi (env_value);
514 if (flag == MDEBUG_ALL)
517 for (i = 0; i < MDEBUG_MAX; i++)
518 mdebug__flags[i] = int_value;
521 mdebug__flags[flag] = int_value;
526 mdebug__add_object_array (M17NObjectArray *array, char *name)
530 array->next = object_array_root;
531 object_array_root = array;
536 mdebug__register_object (M17NObjectArray *array, void *object)
538 if (array->used == 0)
539 MLIST_INIT1 (array, objects, 256);
541 MLIST_APPEND1 (array, objects, object, MERROR_OBJECT);
545 mdebug__unregister_object (M17NObjectArray *array, void *object)
548 if (array->count >= 0)
552 for (i = array->used - 1; i >= 0 && array->objects[i] != object; i--);
555 if (i == array->used - 1)
557 array->objects[i] = NULL;
569 /* The following two are actually not exposed to a user but concealed
570 by the macro M17N_INIT (). */
573 m17n_init_core (void)
575 int mdebug_flag = MDEBUG_INIT;
577 merror_code = MERROR_NONE;
578 if (m17n__core_initialized++)
581 m17n_memory_full_handler = default_error_handler;
583 SET_DEBUG_FLAG ("MDEBUG_ALL", MDEBUG_ALL);
584 SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
585 SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
586 SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
587 SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
588 SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
589 SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT);
590 SET_DEBUG_FLAG ("MDEBUG_FLT", MDEBUG_FLT);
591 SET_DEBUG_FLAG ("MDEBUG_FONTSET", MDEBUG_FONTSET);
592 SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
593 /* for backward compatibility... */
594 SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FLT);
595 SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FLT);
597 char *env_value = getenv ("MDEBUG_OUTPUT_FILE");
599 mdebug__output = NULL;
602 if (strcmp (env_value, "stdout") == 0)
603 mdebug__output = stdout;
605 mdebug__output = fopen (env_value, "a");
607 if (! mdebug__output)
608 mdebug__output = stderr;
613 if (msymbol__init () < 0)
615 MDEBUG_PRINT_TIME ("INIT", (mdebug__output, " to initialize symbol module."));
616 if (mplist__init () < 0)
618 MDEBUG_PRINT_TIME ("INIT", (mdebug__output, " to initialize plist module."));
619 if (mchar__init () < 0)
621 MDEBUG_PRINT_TIME ("INIT",
622 (mdebug__output, " to initialize character module."));
623 if (mchartable__init () < 0)
625 MDEBUG_PRINT_TIME ("INIT",
626 (mdebug__output, " to initialize chartable module."));
627 if (mtext__init () < 0 || mtext__prop_init () < 0)
629 MDEBUG_PRINT_TIME ("INIT", (mdebug__output, " to initialize mtext module."));
630 if (mdatabase__init () < 0)
632 MDEBUG_PRINT_TIME ("INIT",
633 (mdebug__output, " to initialize database module."));
636 bindtextdomain ("m17n-lib", GETTEXTDIR);
637 bindtextdomain ("m17n-db", GETTEXTDIR);
638 bindtextdomain ("m17n-contrib", GETTEXTDIR);
639 bind_textdomain_codeset ("m17n-lib", "UTF-8");
640 bind_textdomain_codeset ("m17n-db", "UTF-8");
641 bind_textdomain_codeset ("m17n-contrib", "UTF-8");
646 MDEBUG_PRINT_TIME ("INIT",
647 (mdebug__output, " to initialize the core modules."));
652 m17n_fini_core (void)
654 int mdebug_flag = MDEBUG_FINI;
656 if (m17n__core_initialized == 0
657 || --m17n__core_initialized > 0)
663 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize chartable module."));
665 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize mtext module."));
667 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize symbol module."));
669 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize plist module."));
670 /* We must call this after the aboves because it frees interval
673 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize textprop module."));
675 MDEBUG_PRINT_TIME ("FINI", (mdebug__output, " to finalize the core modules."));
677 if (mdebug__flags[MDEBUG_FINI])
678 report_object_array ();
679 msymbol__free_table ();
680 if (mdebug__output != stderr)
681 fclose (mdebug__output);
685 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
688 /*** @addtogroup m17nIntro */
694 @brief Report which part of the m17n library is initialized.
696 The m17n_status () function returns one of these values depending
697 on which part of the m17n library is initialized:
699 #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
700 #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED */
703 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«Êó¹ð¤¹¤ë.
705 ´Ø¿ô m17n_status () ¤Ï
706 m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«¤Ë±þ¤¸¤Æ¡¢°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤òÊÖ¤¹¡£
708 #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
709 #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED */
714 return (m17n__gui_initialized ? M17N_GUI_INITIALIZED
715 : m17n__shell_initialized ? M17N_SHELL_INITIALIZED
716 : m17n__core_initialized ? M17N_CORE_INITIALIZED
717 : M17N_NOT_INITIALIZED);
724 @addtogroup m17nObject
725 @brief Managed objects are objects managed by the reference count.
727 There are some types of m17n objects that are managed by their
728 reference count. Those objects are called @e managed @e objects.
729 When created, the reference count of a managed object is
730 initialized to one. The m17n_object_ref () function increments
731 the reference count of a managed object by one, and the
732 m17n_object_unref () function decrements by one. A managed
733 object is automatically freed when its reference count becomes
736 A property whose key is a managing key can have only a managed
737 object as its value. Some functions, for instance msymbol_put ()
738 and mplist_put (), pay special attention to such a property.
740 In addition to the predefined managed object types, users can
741 define their own managed object types. See the documentation of
742 the m17n_object () for more details. */
744 @addtogroup m17nObject
745 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
747 m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
748 ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï
749 1 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref () ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
750 1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref () ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬
751 0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ¤ì¤ë¡£
753 ¥¡¼¤¬´ÉÍý¥¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò¼è¤ë¡£
754 ´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£¤òÆÃÊÌ°·¤¤¤¹¤ë¡£
756 ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£¾ÜºÙ¤Ï
757 m17n_object () ¤ÎÀâÌÀ¤ò»²¾È¡£ */
762 @brief Allocate a managed object.
764 The m17n_object () function allocates a new managed object of
765 $SIZE bytes and sets its reference count to 1. $FREER is the
766 function that is used to free the object when the reference count
767 becomes 0. If $FREER is NULL, the object is freed by the free ()
770 The heading bytes of the allocated object is occupied by
771 #M17NObjectHead. That area is reserved for the m17n library and
772 application programs should never touch it.
775 This function returns a newly allocated object.
778 This function never fails. */
781 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
783 ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò
784 1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0
785 ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER
786 ¤¬ NULL¤Ê¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
788 ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead
789 ¤¬Àê¤á¤ë¡£¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
792 ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
795 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
808 free (((MYStruct *) obj)->mem2);
813 my_func (MText *mt, MSymbol key, int num, char *str)
815 MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
818 st->mem2 = strdup (str);
819 /* KEY must be a managing key. */
820 mtext_put_prop (mt, 0, mtext_len (mt), key, st);
821 /* This sets the reference count of ST back to 1. */
822 m17n_object_unref (st);
827 m17n_object (int size, void (*freer) (void *))
829 M17NObject *obj = malloc (size);
832 obj->ref_count_extended = 0;
834 obj->u.freer = freer;
841 @brief Increment the reference count of a managed object.
843 The m17n_object_ref () function increments the reference count of
844 the managed object pointed to by $OBJECT.
847 This function returns the resulting reference count if it fits in
848 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
852 This function never fails. */
854 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
856 ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT
857 ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹¡£
860 ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
861 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
864 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
867 m17n_object_ref (void *object)
869 M17NObject *obj = (M17NObject *) object;
870 M17NObjectRecord *record;
873 if (! obj->ref_count_extended)
875 if (++obj->ref_count)
876 return (int) obj->ref_count;
877 MSTRUCT_MALLOC (record, MERROR_OBJECT);
878 record->freer = obj->u.freer;
879 MLIST_INIT1 (record, counts, 1);
880 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
881 obj->u.record = record;
882 obj->ref_count_extended = 1;
885 record = obj->u.record;
887 count = record->counts;
888 while (*count == 0xFFFFFFFF)
891 if (*count == 0xFFFFFFFF)
892 MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
899 @brief Decrement the reference count of a managed object.
901 The m17n_object_unref () function decrements the reference count
902 of the managed object pointed to by $OBJECT. When the reference
903 count becomes zero, the object is freed by its freer function.
906 This function returns the resulting reference count if it fits in
907 a 16-bit unsigned integer (i.e. less than 0x10000). Otherwise, it
908 returns -1. Thus, the return value zero means that $OBJECT is
912 This function never fails. */
914 @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
916 ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
917 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
920 ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
921 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1
922 ¤òÊÖ¤¹¡£¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
925 ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
927 m17n_object_unref (void *object)
929 M17NObject *obj = (M17NObject *) object;
930 M17NObjectRecord *record;
933 if (! obj->ref_count_extended)
935 if (! --obj->ref_count)
938 (obj->u.freer) (object);
943 return (int) obj->ref_count;
946 record = obj->u.record;
947 count = record->counts;
949 *(count++) = 0xFFFFFFFF;
951 if (! record->counts[0])
953 obj->ref_count_extended = 0;
955 obj->u.freer = record->freer;
956 MLIST_FREE1 (record, counts);
967 @addtogroup m17nError Error Handling
968 @brief Error handling of the m17n library.
970 There are two types of errors that may happen in a function of
973 The first type is argument errors. When a library function is
974 called with invalid arguments, it returns a value that indicates
975 error and at the same time sets the external variable #merror_code
976 to a non-zero integer.
978 The second type is memory allocation errors. When the required
979 amount of memory is not available on the system, m17n library
980 functions call a function pointed to by the external variable @c
981 m17n_memory_full_handler. The default value of the variable is a
982 pointer to the default_error_handle () function, which just calls
983 <tt> exit ()</tt>. */
986 @addtogroup m17nError ¥¨¥é¡¼½èÍý
987 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý.
989 m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
991 °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£
992 ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô
993 #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
995 ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£
996 ¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô
997 @c m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô
998 default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
1007 @brief External variable to hold error code of the m17n library.
1009 The external variable #merror_code holds an error code of the
1010 m17n library. When a library function is called with an invalid
1011 argument, it sets this variable to one of @c enum #MErrorCode.
1013 This variable initially has the value 0. */
1016 @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô.
1018 ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
1019 ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
1020 @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
1022 ¤³¤ÎÊÑ¿ô¤Î½é´üÃÍ¤Ï 0 ¤Ç¤¢¤ë¡£ */
1029 @brief Memory allocation error handler.
1031 The external variable #m17n_memory_full_handler holds a pointer
1032 to the function to call when a library function failed to allocate
1033 memory. $ERR is one of @c enum #MErrorCode indicating in which
1034 function the error occurred.
1036 This variable initially points a function that simply calls the
1037 <tt>exit </tt>() function with $ERR as an argument.
1039 An application program that needs a different error handling can
1040 change this variable to point a proper function. */
1043 @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é.
1045 ÊÑ¿ô #m17n_memory_full_handler
1046 ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1047 $ERR ¤Ï @c enum #MErrorCode
1048 ¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿¤«¤ò¼¨¤¹¡£
1052 ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR
1053 ¤ò°ú¿ô¤È¤·¤Æ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
1055 ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤òŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤¤ë¡£ */
1057 void (*m17n_memory_full_handler) (enum MErrorCode err);
1064 @addtogroup m17nDebug
1065 @brief Support for m17n library users to debug their programs.
1067 The m17n library provides the following facilities to support the
1068 library users to debug their programs.
1072 <li> Environment variables to control printing of various
1073 information to stderr.
1077 <li> MDEBUG_INIT -- If set to 1, print information about the
1078 library initialization on the call of M17N_INIT ().
1080 <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
1081 not yet freed on the call of M17N_FINI ().
1083 <li> MDEBUG_CHARSET -- If set to 1, print information about
1084 charsets being loaded from the m17n database.
1086 <li> MDEBUG_CODING -- If set to 1, print information about coding
1087 systems being loaded from the m17n database.
1089 <li> MDEBUG_DATABASE -- If set to 1, print information about
1090 data being loaded from the m17n database.
1092 <li> MDEBUG_FONT -- If set to 1, print information about fonts
1093 being selected and opened.
1095 <li> MDEBUG_FLT -- If set to 1, 2, or 3, print information about
1096 which command of Font Layout Table are being executed. The bigger
1097 number prints the more detailed information.
1099 <li> MDEBUG_INPUT -- If set to 1, print information about how an
1100 input method is running.
1102 <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
1103 setting all the above variables to 1.
1105 <li> MDEBUG_OUTPUT_FILE -- If set to a file name, the above
1106 debugging information is appended to the file. If set to
1107 "stdout", the information is printed to stdout.
1111 <li> Functions to print various objects in a human readable way.
1112 See the documentation of mdebug_dump_XXXX () functions.
1114 <li> The hook function called on an error. See the documentation
1120 @addtogroup m17nDebug
1121 @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È.
1123 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
1127 <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Îɸ½à¥¨¥é¡¼½ÐÎϤؤΥץê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶ÊÑ¿ô¡£
1131 <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT ()
1132 ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1134 <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI ()
1135 ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1137 <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n
1138 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿Ê¸»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1140 <li> MDEBUG_CODING -- 1 ¤Ê¤é¤Ð¡¢m17n
1141 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1143 <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n
1144 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1146 <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä
1147 ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1149 <li> MDEBUG_FLT -- 1¡¢2¡¢¤â¤·¤¯¤Ï 3 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É
1150 ¤Î¥³¥Þ¥ó¥É¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£¤è¤êÂ礤ÊÃÍÄø¤è¤ê¾Ü
1151 ¤·¤¤¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1153 <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ¤Î
1154 ¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1156 <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1
1157 ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú²Ì¤ò»ý¤Ä¡£
1159 <li> MDEBUG_OUTPUT_FILE -- ¤â¤·¥Õ¥¡¥¤¥ë̾¤Ê¤é¡¢¾åµ¥Ç¥Ð¥Ã¥°¾ðÊó¤Ï¤½
1160 ¤Î¥Õ¥¡¥¤¥ë¤ËÄɲ䵤ì¤ë¡£¤â¤· "stdout" ¤Ê¤é¤½¤Î¾ðÊó¤Ïɸ½à½ÐÎϤ˽ÐÎÏ
1165 <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï´Ø¿ô
1166 mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
1168 <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
1178 @brief Hook function called on an error.
1180 The mdebug_hook () function is called when an error happens. It
1181 returns -1 without doing anything. It is useful to set a break
1182 point on this function in a debugger. */
1184 @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
1186 ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1
1187 ¤òÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¡£