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