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