b6e60e82b8330e174ff31c63e8d5c70aa7a090a7
[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 #include "symbol.h"
377
378 static void
379 default_error_handler (enum MErrorCode err)
380 {
381   exit (err);
382 }
383
384 static struct timeval time_stack[16];
385 static int time_stack_index;
386
387 static M17NObjectArray *object_array_root;
388
389 static void
390 report_object_array ()
391 {
392   fprintf (stderr, "%16s %7s %7s %7s\n",
393            "object", "created", "freed", "alive");
394   fprintf (stderr, "%16s %7s %7s %7s\n",
395            "------", "-------", "-----", "-----");
396   for (; object_array_root; object_array_root = object_array_root->next)
397     {
398       M17NObjectArray *array = object_array_root;
399
400       fprintf (stderr, "%16s %7d %7d %7d\n", array->name,
401                array->used, array->used - array->count, array->count);
402       if (array->used > 0)
403         {
404           free (array->objects);
405           array->count = array->used = 0;
406         }
407     }
408 }
409
410
411 \f
412 /* Internal API */
413
414 int m17n__core_initialized;
415 int m17n__shell_initialized;
416 int m17n__gui_initialized;
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 FILE *mdebug__output;
424
425 void
426 mdebug__push_time ()
427 {
428   struct timezone tz;
429
430   gettimeofday (time_stack + time_stack_index++, &tz);
431 }
432
433 void
434 mdebug__pop_time ()
435 {
436   time_stack_index--;
437 }
438
439 void
440 mdebug__print_time ()
441 {
442   struct timeval tv;
443   struct timezone tz;
444   long diff;
445
446   gettimeofday (&tv, &tz);
447   diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
448           + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
449   fprintf (stderr, "%8ld ms.", diff);
450   time_stack[time_stack_index - 1] = tv;
451 }
452
453 #define SET_DEBUG_FLAG(env_name, mask)          \
454   do {                                          \
455     char *env_value = getenv (env_name);        \
456                                                 \
457     if (env_value)                              \
458       {                                         \
459         if (env_value[0] == '1')                \
460           mdebug__flag |= (mask);               \
461         else if (env_value[0] == '0')           \
462           mdebug__flag &= ~(mask);              \
463       }                                         \
464   } while (0)
465
466
467 void
468 mdebug__add_object_array (M17NObjectArray *array, char *name)
469 {
470   array->name = name;
471   array->count = 0;
472   array->next = object_array_root;
473   object_array_root = array;
474 }
475
476
477 void
478 mdebug__register_object (M17NObjectArray *array, void *object)
479 {
480   if (array->used == 0)
481     MLIST_INIT1 (array, objects, 256);
482   array->count++;
483   MLIST_APPEND1 (array, objects, object, MERROR_OBJECT);
484 }
485
486 void
487 mdebug__unregister_object (M17NObjectArray *array, void *object)
488 {
489   array->count--;
490   if (array->count >= 0)
491     {
492       int i = 0;
493
494       while (i < array->used && array->objects[i] != object) i++;
495       if (i < array->used)
496         array->objects[i] = NULL;
497       else
498         mdebug_hook ();
499     }
500   else                                                                  \
501     mdebug_hook ();
502 }
503
504 \f
505 /* External API */
506
507 /* The following two are actually not exposed to a user but concealed
508    by the macro M17N_INIT (). */
509
510 void
511 m17n_init_core (void)
512 {
513   int mdebug_mask = MDEBUG_INIT;
514
515   merror_code = MERROR_NONE;
516   if (m17n__core_initialized++)
517     return;
518
519   m17n_memory_full_handler = default_error_handler;
520
521   mdebug__flag = 0;
522   SET_DEBUG_FLAG ("MDEBUG_ALL", MDEBUG_ALL);
523   SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
524   SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
525   SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
526   SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
527   SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
528   SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT); 
529   SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
530   SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
531   SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
532   {
533     char *env_value = getenv ("MDEBUG_OUTPUT_FILE");
534
535     mdebug__output = NULL;
536     if (env_value)
537       mdebug__output = fopen (env_value, "a");
538     if (! mdebug__output)
539       mdebug__output = stderr;
540   }
541
542   MDEBUG_PUSH_TIME ();
543   MDEBUG_PUSH_TIME ();
544   if (msymbol__init () < 0)
545     goto err;
546   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize symbol module."));
547   if  (mplist__init () < 0)
548     goto err;
549   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
550   if  (mchartable__init () < 0)
551     goto err;
552   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
553   if (mtext__init () < 0)
554     goto err;
555   if (mtext__prop_init () < 0)
556     goto err;
557   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
558
559   mdatabase__finder = NULL;
560   mdatabase__loader = NULL;
561
562  err:
563   MDEBUG_POP_TIME ();
564   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
565   MDEBUG_POP_TIME ();
566 }
567
568 void
569 m17n_fini_core (void)
570 {
571   int mdebug_mask = MDEBUG_FINI;
572
573   if (m17n__core_initialized == 0
574       || --m17n__core_initialized > 0)
575     return;
576
577   MDEBUG_PUSH_TIME ();
578   MDEBUG_PUSH_TIME ();
579   mchartable__fini ();
580   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize chartable module."));
581   mtext__fini ();
582   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize mtext module."));
583   msymbol__fini ();
584   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize symbol module."));
585   mplist__fini ();
586   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize plist module."));
587   /* We must call this after the aboves because it frees interval
588      pools.  */
589   mtext__prop_fini ();
590   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize textprop module."));
591   MDEBUG_POP_TIME ();
592   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the core modules."));
593   MDEBUG_POP_TIME ();
594   if (mdebug__flag & MDEBUG_FINI)
595     report_object_array ();
596   msymbol__free_table ();
597   if (mdebug__output != stderr)
598     fclose (mdebug__output);
599 }
600
601 /*** @} */
602 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
603 /*=*/
604
605 /*** @addtogroup m17nIntro */
606
607 /*** @{  */
608 /*=*/
609
610 /***en
611     @brief Report which part of the m17n library is initialized.
612
613     The m17n_status () function returns one of these values depending
614     on which part of the m17n library is initialized:
615
616         #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
617         #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
618
619 /***ja
620     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«Êó¹ð¤¹¤ë.
621
622     ´Ø¿ô m17n_status () ¤Ï 
623     m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«¤Ë±þ¤¸¤Æ¡¢°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤òÊÖ¤¹¡£
624
625         #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
626         #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
627
628 enum M17NStatus
629 m17n_status (void)
630 {
631   return (m17n__gui_initialized ? M17N_GUI_INITIALIZED
632           : m17n__shell_initialized ? M17N_SHELL_INITIALIZED
633           : m17n__core_initialized ? M17N_CORE_INITIALIZED
634           : M17N_NOT_INITIALIZED);
635 }
636
637 /*** @} */
638
639 /*=*/
640 /***en
641     @addtogroup m17nObject
642     @brief Managed objects are objects managed by the reference count.
643
644     There are some types of m17n objects that are managed by their
645     reference count.  Those objects are called @e managed @e objects.
646     When created, the reference count of a managed object is
647     initialized to one.  The m17n_object_ref () function increments
648     the reference count of a managed object by one, and the
649     m17n_object_unref () function decrements by one.  A managed
650     object is automatically freed when its reference count becomes
651     zero.
652
653     A property whose key is a managing key can have only a managed
654     object as its value.  Some functions, for instance msymbol_put ()
655     and mplist_put (), pay special attention to such a property.
656
657     In addition to the predefined managed object types, users can
658     define their own managed object types.  See the documentation of
659     the m17n_object () for more details.  */
660 /***ja
661     @addtogroup m17nObject
662     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
663
664     m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
665     ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï
666     1 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref () ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
667     1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref () ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬
668     0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ¤ì¤ë¡£
669
670     ¥­¡¼¤¬´ÉÍý¥­¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò¼è¤ë¡£
671     ´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£¤òÆÃÊÌ°·¤¤¤¹¤ë¡£
672
673     ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£¾ÜºÙ¤Ï
674     m17n_object () ¤ÎÀâÌÀ¤ò»²¾È¡£  */
675
676 /*** @{  */
677 /*=*/
678 /***en
679     @brief Allocate a managed object.
680
681     The m17n_object () function allocates a new managed object of
682     $SIZE bytes and sets its reference count to 1.  $FREER is the
683     function that is used to free the object when the reference count
684     becomes 0.  If $FREER is NULL, the object is freed by the free ()
685     function.
686
687     The heading bytes of the allocated object is occupied by
688     #M17NObjectHead.  That area is reserved for the m17n library and
689     application programs should never touch it.
690
691     @return
692     This function returns a newly allocated object.
693
694     @errors
695     This function never fails.  */
696
697 /***ja
698     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
699
700     ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò
701     1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0 
702     ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER
703     ¤¬ NULL¤Ê¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
704
705     ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead 
706     ¤¬Àê¤á¤ë¡£¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
707
708     @return
709     ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
710
711     @errors
712     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
713
714 #if EXAMPLE_CODE
715 typedef struct
716 {
717   M17NObjectHead head;
718   int mem1;
719   char *mem2;
720 } MYStruct;
721
722 void
723 my_freer (void *obj)
724 {
725   free (((MYStruct *) obj)->mem2);
726   free (obj);
727 }
728
729 void
730 my_func (MText *mt, MSymbol key, int num, char *str)
731 {
732   MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
733
734   st->mem1 = num;
735   st->mem2 = strdup (str);
736   /* KEY must be a managing key.   */
737   mtext_put_prop (mt, 0, mtext_len (mt), key, st);
738   /* This sets the reference count of ST back to 1.  */
739   m17n_object_unref (st);
740 }
741 #endif
742
743 void *
744 m17n_object (int size, void (*freer) (void *))
745 {
746   M17NObject *obj = malloc (size);
747
748   obj->ref_count = 1;
749   obj->ref_count_extended = 0;
750   obj->flag = 0;
751   obj->u.freer = freer;
752   return obj;
753 }
754
755 /*=*/
756
757 /***en
758     @brief Increment the reference count of a managed object.
759
760     The m17n_object_ref () function increments the reference count of
761     the managed object pointed to by $OBJECT.
762
763     @return
764     This function returns the resulting reference count if it fits in
765     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
766     return -1.
767
768     @errors
769     This function never fails.  */
770 /***ja
771     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
772
773     ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT 
774     ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹¡£
775
776     @return 
777     ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
778     0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
779
780     @errors
781     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
782
783 int
784 m17n_object_ref (void *object)
785 {
786   M17NObject *obj = (M17NObject *) object;
787   M17NObjectRecord *record;
788   unsigned *count;
789
790   if (! obj->ref_count_extended)
791     {
792       if (++obj->ref_count)
793         return (int) obj->ref_count;
794       MSTRUCT_MALLOC (record, MERROR_OBJECT);
795       record->freer = obj->u.freer;
796       MLIST_INIT1 (record, counts, 1);
797       MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
798       obj->u.record = record;
799       obj->ref_count_extended = 1;
800     }
801   else
802     record = obj->u.record;
803
804   count = record->counts;
805   while (*count == 0xFFFFFFFF)
806     *(count++) = 0;
807   (*count)++;
808   if (*count == 0xFFFFFFFF)
809     MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
810   return -1;
811 }
812
813 /*=*/
814
815 /***en
816     @brief Decrement the reference count of a managed object.
817
818     The m17n_object_unref () function decrements the reference count
819     of the managed object pointed to by $OBJECT.  When the reference
820     count becomes zero, the object is freed by its freer function.
821
822     @return
823     This function returns the resulting reference count if it fits in
824     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
825     returns -1.  Thus, the return value zero means that $OBJECT is
826     freed.
827
828     @errors
829     This function never fails.  */
830 /***ja
831     @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
832
833     ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
834     1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
835
836     @return 
837     ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
838     0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 
839     ¤òÊÖ¤¹¡£¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
840
841     @errors
842     ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
843 int
844 m17n_object_unref (void *object)
845 {
846   M17NObject *obj = (M17NObject *) object;
847   M17NObjectRecord *record;
848   unsigned *count;
849
850   if (! obj->ref_count_extended)
851     {
852       if (! --obj->ref_count)
853         {
854           if (obj->u.freer)
855             (obj->u.freer) (object);
856           else
857             free (object);
858           return 0;
859         }
860       return (int) obj->ref_count;
861     }
862
863   record = obj->u.record;
864   count = record->counts;
865   while (! *count)
866     *(count++) = 0xFFFFFFFF;
867   (*count)--;
868   if (! record->counts[0])
869     {
870       obj->ref_count_extended = 0;
871       obj->ref_count--;
872       obj->u.freer = record->freer;
873       MLIST_FREE1 (record, counts);
874       free (record);
875     }
876   return -1;
877 }
878
879 /*=*/
880
881 /*** @} */
882
883 /***en
884     @addtogroup m17nError Error handling
885     @brief Error handling of the m17n library.
886
887     There are two types of errors that may happen in a function of
888     the m17n library.
889
890     The first type is argument errors.  When a library function is
891     called with invalid arguments, it returns a value that indicates
892     error and at the same time sets the external variable #merror_code
893     to a non-zero integer.
894
895     The second type is memory allocation errors.  When the required
896     amount of memory is not available on the system, m17n library
897     functions call a function pointed to by the external variable @c
898     m17n_memory_full_handler.  The default value of the variable is a
899     pointer to the default_error_handle () function, which just calls
900     <tt> exit ()</tt>.  */
901
902 /***ja
903     @addtogroup m17nError ¥¨¥é¡¼½èÍý
904     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý.
905
906     m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
907
908     °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£
909     ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô 
910     #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
911
912     ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£
913     ¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô 
914     @c m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô 
915     default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
916     ()</tt> ¤ò¸Æ¤Ö¡£
917 */
918
919 /*** @{ */
920
921 /*=*/
922
923 /***en 
924     @brief External variable to hold error code of the m17n library.
925
926     The external variable #merror_code holds an error code of the
927     m17n library.  When a library function is called with an invalid
928     argument, it sets this variable to one of @c enum #MErrorCode.
929
930     This variable initially has the value 0.  */
931
932 /***ja 
933     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô.
934
935     ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
936     ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò 
937     @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
938
939     ¤³¤ÎÊÑ¿ô¤Î½é´üÃͤϠ0 ¤Ç¤¢¤ë¡£  */
940
941 int merror_code;
942
943 /*=*/
944
945 /***en 
946     @brief Memory allocation error handler.
947
948     The external variable #m17n_memory_full_handler holds a pointer
949     to the function to call when a library function failed to allocate
950     memory.  $ERR is one of @c enum #MErrorCode indicating in which
951     function the error occurred.
952
953     This variable initially points a function that simply calls the
954     <tt>exit </tt>() function with $ERR as an argument.
955
956     An application program that needs a different error handling can
957     change this variable to point a proper function.  */
958
959 /***ja 
960     @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é.
961
962     ÊÑ¿ô #m17n_memory_full_handler 
963     ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤­´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
964     $ERR ¤Ï @c enum #MErrorCode 
965     ¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿¤«¤ò¼¨¤¹¡£
966
967     @anchor test
968
969     ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR 
970     ¤ò°ú¿ô¤È¤·¤Æ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
971
972     ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤òŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£  */
973
974 void (*m17n_memory_full_handler) (enum MErrorCode err);
975
976 /*** @} */
977
978 /*=*/
979
980 /***en
981     @addtogroup m17nDebug
982     @brief Support for m17n library users to debug their programs.
983
984     The m17n library provides the following facilities to support the
985     library users to debug their programs.
986
987     <ul>
988
989     <li> Environment variables to control printing of various
990     information.
991
992     <ul>
993
994     <li> MDEBUG_INIT -- If set to 1, print information about the
995     library initialization on the call of M17N_INIT ().
996
997     <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
998     not yet freed on the call of M17N_FINI ().
999
1000     <li> MDEBUG_CHARSET -- If set to 1, print information about
1001     charsets being loaded from the m17n database.
1002
1003     <li> MDEBUG_CODING -- If set to 1, print information about coding
1004     systems being loaded from the m17n database.
1005
1006     <li> MDEBUG_DATABASE -- If set to 1, print information about
1007     data being loaded from the m17n database.
1008
1009     <li> MDEBUG_FONT -- If set to 1, print information about fonts
1010     being selected and opened.
1011
1012     <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
1013     command of Font Layout Table are being executed.
1014
1015     <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
1016     feature of OpenType Layout Table are being executed.
1017
1018     <li> MDEBUG_INPUT -- If set to 1, print information about how an
1019     input method is running.
1020
1021     <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
1022     setting all the above variables to 1.
1023
1024     </ul>
1025
1026     <li> Functions to print various objects in a human readable way.
1027     See the documentation of mdebug_dump_XXXX () functions.
1028
1029     <li> The hook function called on an error.  See the documentation
1030     of mdebug_hook ().
1031
1032     </ul>
1033 */
1034 /***ja
1035     @addtogroup m17nDebug
1036     @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È.
1037
1038     m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
1039
1040     <ul>
1041
1042     <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶­ÊÑ¿ô¡£
1043
1044     <ul>
1045
1046     <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () 
1047     ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1048
1049     <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () 
1050     ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1051
1052     <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n
1053     ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿Ê¸»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1054
1055     <li> MDEBUG_CODING --  1 ¤Ê¤é¤Ð¡¢m17n 
1056     ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1057
1058     <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n
1059     ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1060
1061     <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1062
1063     <li> MDEBUG_FONT_FLT -- 1 ¤Ê¤é¤Ð¡¢Font Layout Table 
1064     ¤Î¤É¤Î¥³¥Þ¥ó¥É¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1065
1066     <li> MDEBUG_FONT_OTF -- 1 ¤Ê¤é¤Ð¡¢OpenType Layout Table 
1067     ¤Î¤É¤Î°À­¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1068
1069     <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
1070
1071     <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ­¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 
1072     ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú²Ì¤ò»ý¤Ä¡£
1073
1074     </ul>
1075
1076     <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï´Ø¿ô
1077     mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
1078
1079     <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
1080
1081     </ul>
1082 */
1083
1084 /*=*/
1085 /*** @{ */
1086 /*=*/
1087
1088 /***en
1089     @brief Hook function called on an error.
1090
1091     The mdebug_hook () function is called when an error happens.  It
1092     returns -1 without doing anything.  It is useful to set a break
1093     point on this function in a debugger.  */ 
1094 /***ja
1095     @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
1096
1097     ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1 
1098     ¤òÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
1099     */ 
1100
1101 int
1102 mdebug_hook ()
1103 {
1104   return -1;
1105 }
1106
1107 /*=*/
1108
1109 /*** @} */ 
1110
1111 /*
1112   Local Variables:
1113   coding: euc-japan
1114   End:
1115 */