(reset_ic): Set key_unhandled to 0.
[m17n/m17n-lib.git] / src / m17n-core.c
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
5
6    This file is part of the m17n library.
7
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.
12
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.
17
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
21    02111-1307, USA.  */
22
23 /***en
24     @addtogroup m17nIntro
25     @brief Introduction to the m17n library.
26
27     <em>API LEVELS</em>
28
29     The API of the m17n library is divided into these four.
30
31     <ol>
32     <li> CORE API
33
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.
37
38     <li> SHELL API
39
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-core -lm17n.
44
45     When you use this API, CORE API is also available.
46
47     <li> GUI API
48
49     It provides GUI modules such as drawing and inputting M-texts on a
50     graphic device.  The API itself is independent on a graphic device
51     but most functions require an argument MFrame which is created for
52     a specific type of graphic device.  Currently, a null device, X
53     Window System, and an image date (gdImagePtr) of GD library are
54     supported as a graphic device.
55
56     On a frame of the null device, you can't draw text nor use an
57     input method (but, for instance, the funciton mdraw_glyph_list ()
58     is available).
59
60     On a frame of the X Window System, you can use the whole GUI API.
61
62     On a frame of GD library, you can use all drawing API but can't
63     use input method.
64
65     To use this device, an application program must include
66     <m17n-gui.h> and be linked by -lm17n-core -lm17n -lm17n-gui.
67
68     When you use this API, CORE and SHELL API are also available.
69
70     <li> MISC API
71
72     It provides miscellaneous functions to support error handling and
73     debugging.  This API cannot be used by itself, but with one or
74     more APIs listed above.  To use the API, an application program
75     must include <m17n-misc.h> in addition to one of a header file
76     described above.
77
78     </ol>
79
80     See also the section @ref m17n-config "m17n-config(1)".
81
82     <em>ENVIRONMENT VARIABLE</em>
83
84     The m17n library pays attention to these environment variables.
85
86     <ul>
87     <li> @c M17NDIR
88
89     Name of a directory that contains data of the m17n database.  See
90     @ref m17nDatabase for more details.
91
92     <li> @c MDEBUG_XXXX
93
94     Environment variables whose name start by "MDEBUG_" controls
95     printing of debug information.  See @ref m17nDebug for more
96     details.
97
98     </ul>
99
100     <em>API NAMING CONVENTION</em>
101
102     The library exports functions, variables, macros, and types.  All
103     of them start by the letter 'm' or 'M' followed by an object name
104     (e.g. "symbol" and "plist", but "mtext" object is given the name
105     "text" to avoid double 'm' at the head) or a module name
106     (e.g. draw, input).
107     
108     <ul>
109
110     <li> functions -- mobject () or mobject_xxx ()
111
112     They start with 'm' followed by lower case object name.  For
113     example, msymbol (), mtext_ref_char (), mdraw_text ().
114
115     <li> non-symbol variables -- mobject, or mobject_xxx
116     
117     The naming convention is the same as functions (e.g. mface_large).
118
119     <li> symbol variables -- Mname
120
121     Variables of type MSymbol start with 'M' followed by their names
122     (e.g. Mlanguage (name is "language"), Miso_2022 (name is
123     "iso-2022").
124
125     <li> macros -- MOBJECT_XXX
126
127     They start by 'M' followed by upper case object names.
128
129     <li> types -- MObject or MObjectXxx
130
131     They start by 'M' followed by capitalized object names (e.g.
132     MConverter, MInputDriver).
133
134     </ul>
135
136   */
137
138 /***ja
139     @addtogroup m17nIntro
140     @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó.
141
142     @em API¤Î¥ì¥Ù¥ë
143
144     m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£
145
146     <ol>
147     <li> ¥³¥¢ API
148
149     M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤ÎʬÎà¤Î API ¤Ï
150     m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òɬÍפȤ·¤Ê¤¤¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç
151     ¥ó¥×¥í¥°¥é¥à¤Ï<m17n-core.h> ¤ò include ¤·¡¢ -lm17n-core ¤Ç¥ê¥ó¥¯¤µ
152     ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
153
154     <li> ¥·¥§¥ë API
155
156     m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÍøÍѤ¹¤ë¥â¥¸¥å¡¼¥ë¡Ê¥³¡¼¥ÉÊÑ´¹¡¢Ê¸»ú¥×¥í¥Ñ¥Æ¥£
157     Åù¡Ë¤òÄ󶡤¹¤ë¡£¥â¥¸¥å¡¼¥ë¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼
158     ¥¿¤ò¥í¡¼¥É¤¹¤ë¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
159     <m17n.h> ¤ò include ¤·¡¢ -lm17n-core -lm17n ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê
160     ¤é¤Ê¤¤¡£
161
162     ¤³¤Î API ¤ò»ÈÍѤ¹¤ëºÝ¤Ë¤Ï¥³¥¢ API ¤â»ÈÍѤǤ­¤ë¡£
163
164     <li> GUI API
165
166     M-texts ¤ò¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¾å¤Çɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤È¤¤¤Ã¤¿¡¢
167     ¥°¥é¥Õ¥£¥Ã¥¯¥æ¡¼¥¶¥¤¥ó¥¿¥Õ¥§¡¼¥¹¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£API ¼«ÂΤϥ°
168     ¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢Â¿¤¯¤Î´Ø¿ô¤ÏÆÃÄê¤Î¥°¥é¥Õ¥£¥Ã¥¯
169     ¥Ç¥Ð¥¤¥¹¾å¤ËºîÀ®¤µ¤ì¤¿ MFrame ¤ò°ú¿ô¤Ë¼è¤ë¡£¸½»þÅÀ¤Ç¤Ï¡¢¥Ì¥ë¥Ç¥Ð¥¤
170     ¥¹¡¢X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¡¢GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¡ÊgdImagePtr¡Ë¡¢¤¬
171     ¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤È¤·¤Æ¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡£
172
173     ¥Ì¥ë¥Ç¥Ð¥¤¥¹¾å¤Ç¤Ïɽ¼¨¤âÆþÎϤâ¤Ç¤­¤Ê¤¤¡Ê¤¿¤À¤·¤¿¤È¤¨¤Ð
174     mdraw_glyph_list () ¤Ê¤É¤Î´Ø¿ô¤Ï»ÈÍѲÄǽ¡Ë¡£
175
176     X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Ç¤Ï¤¹¤Ù¤Æ¤Î GUI API ¤¬»È¤¨¤ë¡£
177
178     GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¾å¤Ç¤Ï¡¢ÉÁ²èÍѤΠAPI ¤Ï¤¹¤Ù¤Æ»È¤¨¤ë¤¬ÆþÎϤÏ
179     ¤Ç¤­¤Ê¤¤¡£
180
181     ¤³¤Î¥Ç¥Ð¥¤¥¹¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
182     <m17n-gui.h> ¤ò include ¤·¡¢-lm17n-core -lm17n -lm17n-gui ¤Ç¥ê¥ó¥¯
183     ¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
184
185     ¤³¤Î API ¤ò»ÈÍѤ¹¤ëºÝ¤Ë¤Ï¡¢¥³¥¢ API ¤È¥·¥§¥ë API ¤â»ÈÍѤǤ­¤ë¡£
186
187     <li> ¤½¤Î¾¤Î API
188
189     ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API ¤Ï¤½¤ì¤À¤±
190     ¤Ç¤Ï»ÈÍѤǤ­¤º¡¢¾åµ­¤Î¾¤Î¤â¤Î¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¾åµ­¤Î
191     ¤¤¤º¤ì¤«¤Î include ¥Õ¥¡¥¤¥ë¤Ë²Ã¤¨¤Æ¡¢ <m17n-misc.h> ¤ò include ¤·¤Ê
192     ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
193
194     </ol>
195
196     @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£
197
198     @em ´Ä¶­ÊÑ¿ô
199
200     m17n ¥é¥¤¥Ö¥é¥ê¤Ï¼¡¤Î´Ä¶­ÊÑ¿ô¤ò¹Íθ¤¹¤ë¡£
201
202     <ul>
203     <li> @c M17NDIR
204
205     m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¡£¾ÜºÙ¤Ï@ref
206     m17nDatabase »²¾È¡£
207
208     <li> @c MDEBUG_XXXX
209
210     "MDEBUG_" ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ä¶­ÊÑ¿ô¤Ï¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ©¸æ¤¹¤ë¡£¾ÜºÙ
211     ¤Ï@ref m17nDebug »²¾È¡£
212
213     </ul>
214
215     @em API @em ¤Î̿̾µ¬Â§ ¥³¥Þ¥ó¥É
216
217     ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï'm' ¤Þ
218     ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾("symbol" ¤ä "plist" ¤Ê¤É¡£¤¿¤À¤· 
219     "mtext" ¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤Ï¤¸¤á¤Î 'm' ¤Î½ÅÊ£¤òÈò¤±¤ë¤¿¤á "text" ¤òÍÑ
220     ¤¤¤ë¡£) ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾(draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£
221     
222     <ul>
223
224     <li> ´Ø¿ô -- mobject () ¤Þ¤¿¤Ï mobject_xxx ()
225
226     'm' ¤Î¤¢¤È¤Ë¾®Ê¸»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð¡¢msymbol (),
227      mtext_ref_char (), mdraw_text () ¤Ê¤É¡£
228
229     <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject,  ¤Þ¤¿¤Ï mobject_xxx
230     
231     ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£(¤¿¤È¤¨¤Ð  mface_large)
232
233     <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
234
235     MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï 
236     "language"), Miso_2022 (̾Á°¤Ï"iso-2022")¤Ê¤É¡£
237
238     <li> ¥Þ¥¯¥í -- MOBJECT_XXX
239
240     'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£
241
242     <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
243
244     'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤á¤Æ¥ª¥Ö¥¸¥§¥¯¥È̾¤ò¤¬Â³¤¯¡£ (¤¿¤È¤¨¤Ð
245     MConverter, MInputDriver)
246
247     </ul>
248     
249     */
250 /*=*/
251 /*** @{ */
252 #ifdef FOR_DOXYGEN
253 /***en
254     The #M17NLIB_MAJOR_VERSION macro gives the major version number
255     of the m17n library.  */
256
257 /***ja
258     ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
259     ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
260
261 #define M17NLIB_MAJOR_VERSION
262
263 /*=*/
264
265 /***en
266     The #M17NLIB_MINOR_VERSION macro gives the minor version number
267     of the m17n library.  */
268
269 /***ja
270     ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç
271     ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
272
273 #define M17NLIB_MINOR_VERSION
274
275 /*=*/
276
277 /***en
278     The #M17NLIB_PATCH_LEVEL macro gives the patch level number
279     of the m17n library.  */
280
281 /***ja
282     ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò
283     Í¿¤¨¤ë¡£  */
284
285 #define M17NLIB_PATCH_LEVEL
286
287 /*=*/
288
289 /***en
290     The #M17NLIB_VERSION_NAME macro gives the version name of the
291     m17n library as a string.  */
292
293 /***ja
294     ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò
295     Ê¸»úÎó¤È¤·¤ÆÍ¿¤¨¤ë¡£  */
296
297 #define M17NLIB_VERSION_NAME
298
299 /*=*/
300
301 /***en
302     @brief Initialize the m17n library.
303
304     The macro M17N_INIT () initializes the m17n library.  This macro
305     must be called before any m17n functions are used.
306
307     It is safe to call this macro multiple times, but in that case,
308     the macro M17N_FINI () must be called the same times to free the
309     memory.
310
311     If the initialization was successful, the external variable
312     #merror_code is set to 0.  Otherwise it is set to -1.
313
314     @seealso
315     M17N_FINI (), m17n_status ()  */
316
317 /***ja
318     @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë.
319
320     ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n ¤Î´Ø¿ô¤ò
321     ÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
322     
323     ¤³¤Î¥Þ¥¯¥í¤òÊ£¿ô²ó¸Æ¤ó¤Ç¤â°ÂÁ´¤Ç¤¢¤ë¤¬¡¢¤½¤Î¾ì¹ç¥á¥â¥ê¤ò²òÊü¤¹¤ë¤¿
324     ¤á¤Ë¥Þ¥¯¥í M17N_FINI () ¤òƱ¤¸²ó¿ô¸Æ¤ÖɬÍפ¬¤¢¤ë¡£
325
326     ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð 
327     -1 ¤ËÀßÄꤵ¤ì¤ë¡£  
328
329     @seealso
330     M17N_FINI (), m17n_status ()  */
331
332 #define M17N_INIT()
333
334 /*=*/
335
336 /***en
337     @brief Finalize the m17n library.
338
339     The macro M17N_FINI () finalizes the m17n library.  It frees all the
340     memory area used by the m17n library.  Once this macro is
341     called, no m17n functions should be used until the
342     macro M17N_INIT () is called again.
343
344     If the macro M17N_INIT () was called N times, the Nth call of this
345     macro actually free the memory. 
346
347     @seealso
348     M17N_INIT (), m17n_status ()  */
349 /***ja
350     @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë. 
351
352     ¥Þ¥¯¥í M17N_FINI () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é¥ê
353     ¤¬»È¤Ã¤¿Á´¤Æ¤Î¥á¥â¥êÎΰè¤Ï²òÊü¤µ¤ì¤ë¡£°ìÅÙ¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤¿¤é¡¢
354     ¥Þ¥¯¥í M17N_INIT () ¤¬ºÆÅٸƤФì¤ë¤Þ¤Ç m17n ´Ø¿ô¤Ï»È¤¦¤Ù¤­¤Ç¤Ê¤¤¡£
355
356     ¥Þ¥¯¥í M17N_INIT () ¤¬ N ²ó¸Æ¤Ð¤ì¤Æ¤¤¤¿¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Þ¥¯¥í¤¬ N ²ó
357     ¸Æ¤Ð¤ì¤Æ½é¤á¤Æ¥á¥â¥ê¤¬²òÊü¤µ¤ì¤ë¡£
358
359     @seealso
360     M17N_INIT (), m17n_status ()  */
361
362 #define M17N_FINI()
363 #endif /* FOR_DOXYGEN */
364 /*=*/
365 /*** @} */ 
366 /*=*/
367
368 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
369 /*** @addtogroup m17nInternal
370      @{ */
371
372 #include <config.h>
373 #include <stdio.h>
374 #include <stdlib.h>
375 #include <sys/time.h>
376 #include <sys/resource.h>
377 #include <unistd.h>
378
379 #include "m17n-core.h"
380 #include "m17n-misc.h"
381 #include "internal.h"
382
383 static void
384 default_error_handler (enum MErrorCode err)
385 {
386   exit (err);
387 }
388
389 static struct timeval time_stack[16];
390 static int time_stack_index;
391
392 static int report_header_printed;
393
394 \f
395 /* Internal API */
396
397 int m17n__core_initialized;
398 int m17n__shell_initialized;
399 int m17n__gui_initialized;
400
401 void
402 mdebug__report_object (char *name, M17NObjectArray *array)
403 {
404   if (! (mdebug__flag & MDEBUG_FINI))
405     return;
406   if (! report_header_printed)
407     {
408       fprintf (stderr, "%16s %7s %7s %7s\n",
409                "object", "created", "freed", "alive");
410       fprintf (stderr, "%16s %7s %7s %7s\n",
411                "------", "-------", "-----", "-----");
412       report_header_printed = 1;
413     }
414   fprintf (stderr, "%16s %7d %7d %7d\n", name,
415            array->used, array->used - array->count, array->count);
416   if (array->used > 0)
417     {
418       free (array->objects);
419       array->count = array->used = 0;
420     }
421 }
422
423
424 void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
425                            MSymbol tag3, MSymbol tag4);
426 void *(*mdatabase__loader) (void *);
427
428 int mdebug__flag;
429
430 void
431 mdebug__push_time ()
432 {
433   struct timezone tz;
434
435   gettimeofday (time_stack + time_stack_index++, &tz);
436 }
437
438 void
439 mdebug__pop_time ()
440 {
441   time_stack_index--;
442 }
443
444 void
445 mdebug__print_time ()
446 {
447   struct timeval tv;
448   struct timezone tz;
449   long diff;
450
451   gettimeofday (&tv, &tz);
452   diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
453           + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
454   fprintf (stderr, "%8ld ms.", diff);
455   time_stack[time_stack_index - 1] = tv;
456 }
457
458 #define SET_DEBUG_FLAG(env_name, mask)          \
459   do {                                          \
460     char *env_value = getenv (env_name);        \
461                                                 \
462     if (env_value && env_value[0] == '1')       \
463       mdebug__flag |= (mask);                   \
464   } while (0)
465
466
467 void
468 mdebug__register_object (M17NObjectArray *array, void *object)
469 {
470   if (array->used == 0)
471     MLIST_INIT1 (array, objects, 256);
472   array->count++;
473   MLIST_APPEND1 (array, objects, object, MERROR_OBJECT);
474 }
475
476 void
477 mdebug__unregister_object (M17NObjectArray *array, void *object)
478 {
479   array->count--;
480   if (array->count >= 0)
481     {
482       int i = 0;
483
484       while (i < array->used && array->objects[i] != object) i++;
485       if (i < array->used)
486         array->objects[i] = NULL;
487       else
488         mdebug_hook ();
489     }
490   else                                                                  \
491     mdebug_hook ();
492 }
493
494 \f
495 /* External API */
496
497 /* The following two are actually not exposed to a user but concealed
498    by the macro M17N_INIT (). */
499
500 void
501 m17n_init_core (void)
502 {
503   int mdebug_mask = MDEBUG_INIT;
504
505   if (m17n__core_initialized++)
506     return;
507
508   merror_code = MERROR_NONE;
509   m17n_memory_full_handler = default_error_handler;
510
511   mdebug__flag = 0;
512   SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
513   SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
514   SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
515   SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
516   SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
517   SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT); 
518   SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
519   SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
520   SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
521
522   MDEBUG_PUSH_TIME ();
523   MDEBUG_PUSH_TIME ();
524   if (msymbol__init () < 0)
525     goto err;
526   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize symbol module."));
527   if  (mplist__init () < 0)
528     goto err;
529   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
530   if (mtext__init () < 0)
531     goto err;
532   if (mtext__prop_init () < 0)
533     goto err;
534   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
535   if  (mchartable__init () < 0)
536     goto err;
537   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
538
539   mdatabase__finder = NULL;
540   mdatabase__loader = NULL;
541
542  err:
543   MDEBUG_POP_TIME ();
544   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
545   MDEBUG_POP_TIME ();
546 }
547
548 void
549 m17n_fini_core (void)
550 {
551   int mdebug_mask = MDEBUG_FINI;
552
553   if (m17n__core_initialized == 0
554       || --m17n__core_initialized > 0)
555     return;
556
557   MDEBUG_PUSH_TIME ();
558   MDEBUG_PUSH_TIME ();
559   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize chartable module."));
560   mchartable__fini ();
561   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize textprop module."));
562   mtext__prop_fini ();
563   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize mtext module."));
564   mtext__fini ();
565   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize symbol module."));
566   msymbol__fini ();
567   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize plist module."));
568   mplist__fini ();
569   MDEBUG_POP_TIME ();
570   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the core modules."));
571   MDEBUG_POP_TIME ();
572   report_header_printed = 0;
573 }
574
575 /*** @} */
576 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
577 /*=*/
578
579 /*** @addtogroup m17nIntro */
580
581 /*** @{  */
582 /*=*/
583
584 /***en
585     @brief Report which part of the m17n library is initialized.
586
587     The m17n_status () function returns one of these values depending
588     on which part of the m17n library is initialized:
589
590         #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
591         #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
592
593 /***ja
594     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«Êó¹ð¤¹¤ë.
595
596     ´Ø¿ô m17n_status () ¤Ïm17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«¤Ë
597     ±þ¤¸¤Æ¡¢°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤òÊÖ¤¹¡£
598
599         #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
600         #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
601
602 enum M17NStatus
603 m17n_status (void)
604 {
605   return (m17n__gui_initialized ? M17N_GUI_INITIALIZED
606           : m17n__shell_initialized ? M17N_SHELL_INITIALIZED
607           : m17n__core_initialized ? M17N_CORE_INITIALIZED
608           : M17N_NOT_INITIALIZED);
609 }
610
611 /*** @} */
612
613 /*=*/
614 /***en
615     @addtogroup m17nObject
616     @brief Managed objects are objects managed by the reference count.
617
618     There are some types of m17n objects that are managed by their
619     reference count.  Those objects are called @e managed @e objects.
620     When created, the reference count of a managed object is
621     initialized to one.  The m17n_object_ref () function increments
622     the reference count of a managed object by one, and the
623     m17n_object_unref () function decrements by one.  A managed
624     object is automatically freed when its reference count becomes
625     zero.
626
627     A property whose key is a managing key can have only a managed
628     object as its value.  Such functions as msymbol_put () and
629     mplist_put () pay special attention to such a property.
630
631     In addition to the predefined managed object types, users can
632     define their own managed object types.  See the documentation of
633     the m17n_object () for more details.  */
634 /***ja
635     @addtogroup m17nObject
636     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
637
638     m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
639     ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì
640     ¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï 0 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref () 
641     ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref () 
642     ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ
643     ¤ì¤ë¡£
644
645     ¥­¡¼¤¬´ÉÍý¥­¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò
646     ¼è¤ë¡£´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£
647     ¤òÆÃÊÌ°·¤¤¤¹¤ë¡£
648
649     ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§
650     ¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£¾ÜºÙ¤Ïm17n_object () ¤ÎÀâ
651     ÌÀ¤ò»²¾È¡£  */
652
653 /*** @{  */
654 /*=*/
655 /***en
656     @brief Allocate a managed object.
657
658     The m17n_object () function allocates a new managed object of
659     $SIZE bytes and sets its reference count to 1.  $FREER is the
660     function that is used to free the object when the reference count
661     becomes 0.  If $FREER is NULL, the object is freed by the free ()
662     function.
663
664     The heading bytes of the allocated object is occupied by
665     #M17NObjectHead.  That area is reserved for the m17n library and
666     application programs should never touch it.
667
668     @return
669     This function returns a newly allocated object.
670
671     @errors
672     This function never fails.  */
673
674 /***ja
675     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
676
677     ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤ê
678     Åö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò 1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î
679     ¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER ¤¬ NULL¤Ê
680     ¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
681
682     ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead ¤¬Àê¤á¤ë¡£ 
683     ¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é
684     ¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
685
686     @return
687     ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
688
689     @errors
690     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
691
692 #if EXAMPLE_CODE
693 typedef struct
694 {
695   M17NObjectHead head;
696   int mem1;
697   char *mem2;
698 } MYStruct;
699
700 void
701 my_freer (void *obj)
702 {
703   free (((MYStruct *) obj)->mem2);
704   free (obj);
705 }
706
707 void
708 my_func (MText *mt, MSymbol key, int num, char *str)
709 {
710   MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
711
712   st->mem1 = num;
713   st->mem2 = strdup (str);
714   /* KEY must be a managing key.   */
715   mtext_put_prop (mt, 0, mtext_len (mt), key, st);
716   /* This sets the reference count of ST back to 1.  */
717   m17n_object_unref (st);
718 }
719 #endif
720
721 void *
722 m17n_object (int size, void (*freer) (void *))
723 {
724   M17NObject *obj = malloc (size);
725
726   obj->ref_count = 1;
727   obj->u.freer = freer;
728   return obj;
729 }
730
731 /*=*/
732
733 /***en
734     @brief Increment the reference count of a managed object.
735
736     The m17n_object_ref () function increments the reference count of
737     the managed object pointed to by $OBJECT.
738
739     @return
740     This function returns the resulting reference count if it fits in
741     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
742     return -1.
743
744     @errors
745     This function never fails.  */
746 /***ja
747     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
748
749     ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î
750     »²¾È¿ô¤ò 1 Áý¤ä¤¹¡£
751
752     @return 
753     ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
754     0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
755
756     @errors
757     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
758
759 int
760 m17n_object_ref (void *object)
761 {
762   M17NObject *obj = (M17NObject *) object;
763   M17NObjectRecord *record;
764   unsigned *count;
765
766   if (! obj->ref_count_extended)
767     {
768       if (++obj->ref_count)
769         return (int) obj->ref_count;
770       MSTRUCT_MALLOC (record, MERROR_OBJECT);
771       record->freer = obj->u.freer;
772       MLIST_INIT1 (record, counts, 1);
773       MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
774       obj->u.record = record;
775       obj->ref_count_extended = 1;
776     }
777   else
778     record = obj->u.record;
779
780   count = record->counts;
781   while (*count == 0xFFFFFFFF)
782     *(count++) = 0;
783   (*count)++;
784   if (*count == 0xFFFFFFFF)
785     MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
786   return -1;
787 }
788
789 /*=*/
790
791 /***en
792     @brief Decrement the reference count of a managed object.
793
794     The m17n_object_unref () function decrements the reference count
795     of the managed object pointed to by $OBJECT.  When the reference
796     count becomes zero, the object is freed by its freer function.
797
798     @return
799     This function returns the resulting reference count if it fits in
800     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
801     returns -1.  Thus, the return value zero means that $OBJECT is
802     freed.
803
804     @errors
805     This function never fails.  */
806 /***ja
807     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
808
809     ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È
810     ¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë
811     ¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
812
813     @return 
814     ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
815     0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
816     ¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
817
818     @errors
819     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
820 int
821 m17n_object_unref (void *object)
822 {
823   M17NObject *obj = (M17NObject *) object;
824   M17NObjectRecord *record;
825   unsigned *count;
826
827   if (! obj->ref_count_extended)
828     {
829       if (! --obj->ref_count)
830         {
831           if (obj->u.freer)
832             (obj->u.freer) (object);
833           else
834             free (object);
835           return 0;
836         }
837       return (int) obj->ref_count;
838     }
839
840   record = obj->u.record;
841   count = record->counts;
842   while (! *count)
843     *(count++) = 0xFFFFFFFF;
844   (*count)--;
845   if (! record->counts[0])
846     {
847       obj->ref_count_extended = 0;
848       obj->ref_count--;
849       obj->u.freer = record->freer;
850       MLIST_FREE1 (record, counts);
851       free (record);
852     }
853   return -1;
854 }
855
856 /*=*/
857
858 /*** @} */
859
860 /***en
861     @addtogroup m17nError Error handling
862     @brief Error handling of the m17n library.
863
864     There are two types of errors that may happen in a function of
865     the m17n library.
866
867     The first type is argument errors.  When a library function is
868     called with invalid arguments, it returns a value that indicates
869     error and at the same time sets the external variable #merror_code
870     to a non-zero integer.
871
872     The second type is memory allocation errors.  When the required
873     amount of memory is not available on the system, m17n library
874     functions call a function pointed to by the external variable @c
875     m17n_memory_full_handler.  The default value of the variable is a
876     pointer to the default_error_handle () function, which just calls
877     <tt> exit ()</tt>.  */
878
879 /***ja
880     @addtogroup m17nError ¥¨¥é¡¼½èÍý
881     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý.
882
883     m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
884
885     °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë
886     ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô 
887     #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
888
889     ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â
890     ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c
891     m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô 
892     default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
893     ()</tt> ¤ò¸Æ¤Ö¡£
894 */
895
896 /*** @{ */
897
898 /*=*/
899
900 /***en 
901     @brief External variable to hold error code of the m17n library.
902
903     The external variable #merror_code holds an error code of the
904     m17n library.  When a library function is called with an invalid
905     argument, it sets this variable to one of @c enum #MErrorCode.
906
907     This variable initially has the value 0.  */
908
909 /***ja 
910     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô.
911
912     ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
913     ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò 
914     @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
915
916     ¤³¤ÎÊÑ¿ô¤Î½é´üÃͤϠ0 ¤Ç¤¢¤ë¡£  */
917
918 int merror_code;
919
920 /*=*/
921
922 /***en 
923     @brief Memory allocation error handler.
924
925     The external variable #m17n_memory_full_handler holds a pointer
926     to the function to call when a library function failed to allocate
927     memory.  $ERR is one of @c enum #MErrorCode indicating in which
928     function the error occurred.
929
930     This variable initially points a function that simply calls the
931     <tt>exit </tt>() function with $ERR as an argument.
932
933     An application program that needs a different error handling can
934     change this variable to point a proper function.  */
935
936 /***ja 
937     @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é.
938
939     ÊÑ¿ô #m17n_memory_full_handler ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ
940     ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤­´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£$ERR ¤Ï @c enum
941     #MErrorCode ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿
942     ¤«¤ò¼¨¤¹¡£
943
944     @anchor test
945
946     ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ
947     ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
948
949     ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
950     Å¬Åö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£  */
951
952 void (*m17n_memory_full_handler) (enum MErrorCode err);
953
954 /*** @} */
955
956 /*=*/
957
958 /***en
959     @addtogroup m17nDebug
960     @brief Support for m17n library users to debug their programs.
961
962     The m17n library provides the following facilities to support the
963     library users to debug their programs.
964
965     <ul>
966
967     <li> Environment variables to control printing of various
968     information.
969
970     <ul>
971
972     <li> MDEBUG_INIT -- If set to 1, print information about the
973     library initialization on the call of M17N_INIT ().
974
975     <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
976     not yet freed on the call of M17N_FINI ().
977
978     <li> MDEBUG_CHARSET -- If set to 1, print information about
979     charsets being loaded from the m17n database.
980
981     <li> MDEBUG_CODING -- If set to 1, print information about coding
982     systems being loaded from the m17n database.
983
984     <li> MDEBUG_DATABASE -- If set to 1, print information about
985     data being loaded from the m17n database.
986
987     <li> MDEBUG_FONT -- If set to 1, print information about fonts
988     being selected and opened.
989
990     <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
991     command of Font Layout Table are being executed.
992
993     <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
994     feature of OpenType Layout Table are being executed.
995
996     <li> MDEBUG_INPUT -- If set to 1, print information about how an
997     input method is running.
998
999     <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
1000     setting all the above variables to 1.
1001
1002     </ul>
1003
1004     <li> Functions to print various objects in a human readable way.
1005     See the documentation of mdebug_dump_XXXX () functions.
1006
1007     <li> The hook function called on an error.  See the documentation
1008     of mdebug_hook ().
1009
1010     </ul>
1011 */
1012 /***ja
1013     @addtogroup m17nDebug
1014     @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È.
1015
1016     m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á
1017     ¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
1018
1019     <ul>
1020
1021     <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶­ÊÑ¿ô¡£
1022
1023     <ul>
1024
1025     <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤
1026     ¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1027
1028     <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À
1029     ²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1030
1031     <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
1032     Ê¸»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1033
1034     <li> MDEBUG_CODING --  1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿
1035     ¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1036
1037     <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì
1038     ¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1039
1040     <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä
1041     ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1042
1043     <li> MDEBUG_FONT_FLT -- 1 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É¤Î¥³¥Þ¥ó¥É
1044     ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1045
1046     <li> MDEBUG_FONT_OTF -- 1 ¤Ê¤é¤Ð¡¢OpenType Layout Table ¤Î¤É¤Î°À­
1047     ¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1048
1049     <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ
1050     ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1051
1052     <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ­¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú
1053     ²Ì¤ò»ý¤Ä¡£
1054
1055     </ul>
1056
1057     <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï
1058     ´Ø¿ô mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
1059
1060     <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
1061
1062     </ul>
1063 */
1064
1065 /*=*/
1066 /*** @{ */
1067 /*=*/
1068
1069 /***en
1070     @brief Hook function called on an error.
1071
1072     The mdebug_hook () function is called when an error happens.  It
1073     returns -1 without doing anything.  It is useful to set a break
1074     point on this function in a debugger.  */ 
1075 /***ja
1076     @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
1077
1078     ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1 ¤ò
1079     ÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤­
1080     ¤ë¡£
1081     */ 
1082
1083 int
1084 mdebug_hook ()
1085 {
1086   return -1;
1087 }
1088
1089 /*=*/
1090
1091 /*** @} */ 
1092
1093 /*
1094   Local Variables:
1095   coding: euc-japan
1096   End:
1097 */