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