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