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