(mfont__ft_init): Add oblique and boldoblique.
[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 don't 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.  They load
41     various kinds of data from the database on demand.  To use this
42     API, an application program must include <m17n.h> and be linked by
43     -lm17n-core -lm17n.  With that, CORE API is also available.
44
45     <li> GUI API
46
47     It provides GUI modules such as drawing and inputting M-texts on a
48     window system.  The API itself is independent on a window system,
49     but the m17n library must be configured to use a specific window
50     system.  Currently, we support only the X Window System.  To use
51     this API, an application program must include <m17n-gui.h> and
52     <m17n-X.h>, and be linked by -lm17n-core -lm17n -lm17n-X.  With
53     that, CORE and SHELL APIs are also available.
54
55     <li> MISC API
56
57     It provides miscellaneous functions to support error handling and
58     debugging.  This API can't be used by itself, but with one or more
59     APIs listed above.  To use the API, an application program must
60     include <m17n-misc.h> in addition to one of <m17n-core.h>,
61     <m17n.h>, and <m17n-gui.h>.
62
63     </ol>
64
65     See also the section @ref m17n-config "m17n-config(1)".
66
67     <em>ENVIRONMENT VARIABLE</em>
68
69     The m17n library pays attention to these environment variables.
70
71     <ul>
72     <li> @c M17NDIR
73
74     Name of a directory that contains data of the m17n database.  See
75     @ref m17nDatabase for the detail.
76
77     <li> @c MDEBUG_XXXX
78
79     Environment variables whose name start by "MDEBUG_" controls
80     printing of debug information.  See @ref m17nDebug for the detail.
81
82     </ul>
83
84     <em>API NAMING CONVENTION</em>
85
86     The library exports functions, variables, macros, and types.  All
87     of them start by the letter 'm' or 'M' followed by an object name
88     (e.g. "symbol" and "plist", but "mtext" object is given the name
89     "text" to avoid double 'm' at the head) or a module name
90     (e.g. draw, input).
91     
92     <ul>
93
94     <li> functions -- mobject () or mobject_xxx ()
95
96     They start with 'm' followed by lower case object name.  For
97     example, msymbol (), mtext_ref_char (), mdraw_text ().
98
99     <li> non-symbol variables -- mobject, or mobject_xxx
100     
101     The naming convention is the same as functions (e.g. mface_large).
102
103     <li> symbol variables -- Mname
104
105     Variables of type MSymbol start with 'M' followed by their names
106     (e.g. Mlanguage (name is "langauge"), Miso_2022 (name is
107     "iso-2022").
108
109     <li> macross -- MOBJECT_XXX
110
111     They start by 'M' followed by upper case object names.
112
113     <li> types -- MObject or MObjectXxx
114
115     They start by 'M' followed by capitalized object names (e.g.
116     MConverter, MInputDriver).
117
118     </ul>
119
120   */
121
122 /***ja
123     @addtogroup m17nIntro
124
125     @e m17n¥é¥¤¥Ö¥é¥ê ¤Ï C ¸À¸ìÍÑ¿¸À¸ì¾ðÊó½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë¡£
126     ¤³¤Î¥é¥¤¥Ö¥é¥ê¤Ï¡¢Â¿¸À¸ìʸ½ñ¤ò°·¤¦¤¿¤á¤ËɬÍפʰʲ¼¤Î´ðËܵ¡Ç½¤ò¥¢¥×
127     ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÄ󶡤¹¤ë¡£
128
129     @li Â¿¸À¸ì¥Æ¥­¥¹¥ÈÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¤Î¹½Â¤ÂΠ@e M-text
130
131     @li M-text ¤ò°·¤¦¤¿¤á¤Î¿¤¯¤Î´Ø¿ô¡¦¥Þ¥¯¥í·²
132
133     @li ¼ï¡¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Æ¥­¥¹¥È¤È M-text ´Ö¤ÎÊÑ´¹
134     ¤ò¹Ô¤Ê¤¦¥Ç¥³¡¼¥À¡¿¥¨¥ó¥³¡¼¥À
135
136     @li Unicode ¤ÎÁ´¤Æ¤Îʸ»ú¤Ë²Ã¤¨¡¢¤½¤ì¤ÈƱ¤¸¿ô¤ÎÈó Unicode Ê¸»ú¤ò°·
137     ¤¨¤ëµðÂç¤Êʸ»ú¶õ´Ö
138
139     @li Ê¸»úËè¤Î¾ðÊó¤ò¸úΨÎɤ¯³ÊǼ¤¹¤ë¹½Â¤ÂΠ@e Ê¸»ú¥Æ¡¼¥Ö¥ë (CharTable)
140
141     @li ¥ª¥×¥·¥ç¥ó¡§M-text¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Ç¤Îɽ¼¨¡¦ÆþÎÏ¥·¥¹¥Æ¥à¡£
142     ¡Ê¤³¤Î¤¿¤á¤Î API ¤Ï m17n-win.h ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡£¡Ë  */
143 /*=*/
144 /*** @{ */
145 #ifdef FOR_DOXYGEN
146 /***en
147     The #M17NLIB_MAJOR_VERSION macro gives the major version number
148     of the m17n library.  */
149
150 /***ja
151     ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
152     ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
153
154 #define M17NLIB_MAJOR_VERSION
155
156 /*=*/
157
158 /***en
159     The #M17NLIB_MINOR_VERSION macro gives the minor version number
160     of the m17n library.  */
161
162 /***ja
163     ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç
164     ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
165
166 #define M17NLIB_MINOR_VERSION
167
168 /*=*/
169
170 /***en
171     The #M17NLIB_PATCH_LEVEL macro gives the patch level number
172     of the m17n library.  */
173
174 /***ja
175     ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò
176     Í¿¤¨¤ë¡£  */
177
178 #define M17NLIB_PATCH_LEVEL
179
180 /*=*/
181
182 /***en
183     The #M17NLIB_VERSION_NAME macro gives the version name of the
184     m17n library as a string.  */
185
186 /***ja
187     ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò
188     C-string ¤Î·Á¤ÇÍ¿¤¨¤ë¡£  */
189
190 #define M17NLIB_VERSION_NAME
191
192 /*=*/
193
194 /***en
195     @brief Initialize the m17n library.
196
197     The macro M17N_INIT () initializes the m17n library.  This
198     function must be called before any m17n functions are used.
199
200     If the initialization was successful, the external variable @c
201     merror_code is set to 0.  Otherwise it is set to -1.  */
202
203 /***ja
204     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½
205
206     ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é
207     ¥ê¤ò»È¤¦¤È¤­¤Ï¡¢ºÇ½é¤Ë¤³¤Î´Ø¿ô¤ò¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
208
209     ÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 
210     ¤ËÀßÄꤵ¤ì¤ë¡£  */
211
212 #define M17N_INIT()
213
214 /*=*/
215
216 /***en
217     @brief Finalize the m17n library.
218
219     The macro M17N_FINI () finalizes the m17n library.  It frees all the
220     memory area used by the m17n library.  Once this function is
221     called, no m17n functions should be used until the
222     macro M17N_INIT () is called again.  */
223
224 /***ja
225     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î½ªÎ»  */
226
227 #define M17N_FINI()
228 #endif /* FOR_DOXYGEN */
229 /*=*/
230 /*** @} */ 
231 /*=*/
232
233 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
234 /*** @addtogroup m17nInternal
235      @{ */
236
237 #include <config.h>
238 #include <stdio.h>
239 #include <stdlib.h>
240 #include <sys/time.h>
241 #include <sys/resource.h>
242 #include <unistd.h>
243
244 #include "m17n-core.h"
245 #include "m17n-misc.h"
246 #include "internal.h"
247
248 static int core_initialized;
249
250 static void
251 default_error_handler (enum MErrorCode err)
252 {
253   exit (err);
254 }
255
256 static struct timeval time_stack[16];
257 static int time_stack_index;
258
259 static int report_header_printed;
260
261 \f
262 /* Internal API */
263
264 void
265 mdebug__report_object (char *name, M17NObjectArray *array)
266 {
267   if (! (mdebug__flag & MDEBUG_FINI))
268     return;
269   if (! report_header_printed)
270     {
271       fprintf (stderr, "%16s %7s %7s %7s\n",
272                "object", "created", "freed", "alive");
273       fprintf (stderr, "%16s %7s %7s %7s\n",
274                "------", "-------", "-----", "-----");
275       report_header_printed = 1;
276     }
277   fprintf (stderr, "%16s %7d %7d %7d\n", name,
278            array->used, array->used - array->count, array->count);
279 }
280
281
282 void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
283                            MSymbol tag3, MSymbol tag4);
284 void *(*mdatabase__loader) (void *);
285
286 int mdebug__flag;
287
288 void
289 mdebug__push_time ()
290 {
291   struct timezone tz;
292
293   gettimeofday (time_stack + time_stack_index++, &tz);
294 }
295
296 void
297 mdebug__pop_time ()
298 {
299   time_stack_index--;
300 }
301
302 void
303 mdebug__print_time ()
304 {
305   struct timeval tv;
306   struct timezone tz;
307   long diff;
308
309   gettimeofday (&tv, &tz);
310   diff = ((tv.tv_sec - time_stack[time_stack_index - 1].tv_sec) * 1000000
311           + (tv.tv_usec - time_stack[time_stack_index - 1].tv_usec));
312   fprintf (stderr, "%8ld ms.", diff);
313   time_stack[time_stack_index - 1] = tv;
314 }
315
316 #define SET_DEBUG_FLAG(env_name, mask)          \
317   do {                                          \
318     char *env_value = getenv (env_name);        \
319                                                 \
320     if (env_value && env_value[0] == '1')       \
321       mdebug__flag |= (mask);                   \
322   } while (0)
323
324
325 \f
326 /* External API */
327
328 /* The following two are actually not exposed to a user but concealed
329    by the macro M17N_INIT (). */
330
331 void
332 m17n_init_core (void)
333 {
334   int mdebug_mask = MDEBUG_INIT;
335
336   if (core_initialized)
337     return;
338
339   merror_code = 0;
340   m17n_memory_full_handler = default_error_handler;
341
342   mdebug__flag = 0;
343   SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
344   SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
345   SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
346   SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
347   SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
348   SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT); 
349   SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
350   SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
351   SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
352
353   MDEBUG_PUSH_TIME ();
354   MDEBUG_PUSH_TIME ();
355   if (msymbol__init () < 0)
356     goto err;
357   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize symbol module."));
358   if  (mplist__init () < 0)
359     goto err;
360   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
361   if (mtext__init () < 0)
362     goto err;
363   if (mtext__prop_init () < 0)
364     goto err;
365   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
366   if  (mchartable__init () < 0)
367     goto err;
368   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
369
370   mdatabase__finder = NULL;
371   mdatabase__loader = NULL;
372   core_initialized = 1;
373
374  err:
375   MDEBUG_POP_TIME ();
376   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
377   MDEBUG_POP_TIME ();
378
379   report_header_printed = 0;
380 }
381
382 void
383 m17n_fini_core (void)
384 {
385   int mdebug_mask = MDEBUG_FINI;
386
387   if (core_initialized)
388     {
389       MDEBUG_PUSH_TIME ();
390       MDEBUG_PUSH_TIME ();
391       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize chartable module."));
392       mchartable__fini ();
393       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize textprop module."));
394       mtext__prop_fini ();
395       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize mtext module."));
396       mtext__fini ();
397       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize symbol module."));
398       msymbol__fini ();
399       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize plist module."));
400       mplist__fini ();
401       core_initialized = 0;
402       MDEBUG_POP_TIME ();
403       MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize the core modules."));
404       MDEBUG_POP_TIME ();
405     }
406 }
407
408 /*** @} */
409 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
410 /*=*/
411
412 /***en
413     @addtogroup m17nObject
414     @brief Managed objects are objects managed by the reference count.
415
416     There are some types of m17n objects that are managed by their
417     reference count.  Those objects are called @e managed @e objects.
418     When created, the reference count of a managed object is
419     initialized to one.  The m17n_object_ref () function increments
420     the reference count of a managed object by one, and the
421     m17n_object_unref () function decrements by one.  A managed
422     object is automatically freed when its reference count becomes
423     zero.
424
425     A property whose key is a managing key can have only a managed
426     object as its value.  Such functions as msymbol_put () and
427     mplist_put () pay special attention to such a property.
428
429     In addition to the predefined managed object types, users can
430     define their own managed object types.  See the documentation of
431     the m17n_object () for the details.  */
432
433 /*** @{  */
434 /*=*/
435 /***en
436     @brief Allocate a managed object.
437
438     The m17n_object () function allocates a new managed object of
439     $SIZE bytes and sets its reference count to 1.  $FREER is the
440     function that is used to free the object when the reference count
441     becomes 0.  If $FREER is NULL, the object is freed by the free ()
442     function.
443
444     The heading bytes of the allocated object is occupied by
445     #M17NObjectHead.  That area is reserved for the m17n library and
446     application programs should never touch it.
447
448     @return
449     This function returns a newly allocated object.
450
451     @errors
452     This function never fails.  */
453
454 #if EXAMPLE_CODE
455 typedef struct
456 {
457   M17NObjectHead head;
458   int mem1;
459   char *mem2;
460 } MYStruct;
461
462 void
463 my_freer (void *obj)
464 {
465   free (((MYStruct *) obj)->mem2);
466   free (obj);
467 }
468
469 void
470 my_func (MText *mt, MSymbol key, int num, char *str)
471 {
472   MYStruct *st = m17n_object (sizeof (MYStruct), my_freer);
473
474   st->mem1 = num;
475   st->mem2 = strdup (str);
476   /* KEY must be a managing key.   */
477   mtext_put_prop (mt, 0, mtext_len (mt), key, st);
478   /* This sets the reference count of ST back to 1.  */
479   m17n_object_unref (st);
480 }
481 #endif
482
483 void *
484 m17n_object (int size, void (*freer) (void *))
485 {
486   M17NObject *obj = malloc (size);
487
488   obj->ref_count = 1;
489   obj->u.freer = freer;
490   return obj;
491 }
492
493 /*=*/
494
495 /***en
496     @brief Increment the reference count of a managed object.
497
498     The m17n_object_ref () function increments the reference count of
499     the managed object pointed to by $OBJECT.
500
501     @return
502     This function returns the resulting reference count if it fits in
503     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
504     return -1.
505
506     @errors
507     This function never fails.  */
508
509 int
510 m17n_object_ref (void *object)
511 {
512   M17NObject *obj = (M17NObject *) object;
513   M17NObjectRecord *record;
514   unsigned *count;
515
516   if (! obj->ref_count_extended)
517     {
518       if (++obj->ref_count)
519         return (int) obj->ref_count;
520       MSTRUCT_MALLOC (record, MERROR_OBJECT);
521       record->freer = obj->u.freer;
522       MLIST_INIT1 (record, counts, 1);
523       MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
524       obj->u.record = record;
525       obj->ref_count_extended = 1;
526     }
527   else
528     record = obj->u.record;
529
530   count = record->counts;
531   while (*count == 0xFFFFFFFF)
532     *(count++) = 0;
533   (*count)++;
534   if (*count == 0xFFFFFFFF)
535     MLIST_APPEND1 (record, counts, 0, MERROR_OBJECT);
536   return -1;
537 }
538
539 /*=*/
540
541 /***en
542     @brief Decrement the reference count of a managed object.
543
544     The m17n_object_unref () function decrements the reference count
545     of the managed object pointed to by $OBJECT.  When the reference
546     count becomes zero, the object is freed by its freer function.
547
548     @return
549     This function returns the resulting reference count if it fits in
550     a 16-bit unsigned integer (i.e. less than 0x10000).  Otherwise, it
551     returns -1.  Thus, the return value zero means that $OBJECT is
552     freed.
553
554     @errors
555     This function never fails.  */
556
557 int
558 m17n_object_unref (void *object)
559 {
560   M17NObject *obj = (M17NObject *) object;
561   M17NObjectRecord *record;
562   unsigned *count;
563
564   if (! obj->ref_count_extended)
565     {
566       if (! --obj->ref_count)
567         {
568           if (obj->u.freer)
569             (obj->u.freer) (object);
570           else
571             free (object);
572           return 0;
573         }
574       return (int) obj->ref_count;
575     }
576
577   record = obj->u.record;
578   count = record->counts;
579   while (! *count)
580     *(count++) = 0xFFFFFFFF;
581   (*count)--;
582   if (! record->counts[0])
583     {
584       obj->ref_count_extended = 0;
585       obj->ref_count--;
586       obj->u.freer = record->freer;
587       MLIST_FREE1 (record, counts);
588       free (record);
589     }
590   return -1;
591 }
592
593 /*=*/
594
595 /*** @} */
596
597 /***en
598     @addtogroup m17nError Error handling
599     @brief Error handling of the m17n library.
600
601     There are two types of errors that may happen in a function of
602     the m17n library.
603
604     The first type is argument errors.  When a library function is
605     called with invalid arguments, it returns a value that indicates
606     error and at the same time sets the external variable @e
607     merror_code to a non-zero integer.
608
609     The second type is memory allocation errors.  When the required
610     amount of memory is not available on the system, m17n library
611     functions call a function pointed to by the external variable @c
612     m17n_memory_full_handler.  The default value of the variable is a
613     pointer to the default_error_handle () function, which just calls
614     exit ().  */
615
616 /***ja
617     @addtogroup m17nError ¥¨¥é¡¼½èÍý
618     @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý
619
620     m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
621
622     °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë
623     ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô 
624     #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
625
626     ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â
627     ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c
628     m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±¤Ë
629     <tt>exit ()</tt> ¤ò¸Æ¤Ö¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
630 */
631
632 /*** @{ */
633
634 /*=*/
635
636 /***en @brief External variable to hold error code of the m17n library
637
638     The external variable #merror_code holds an error code of the
639     m17n library.  When a library function is called with an invalid
640     argument, it sets this variable to one of @c enum #MErrorCode.
641
642     This variable initially has the value 0.  */
643
644 /***ja @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô
645
646     ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
647     ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢
648     ¤³¤ÎÊÑ¿ô¤ò @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
649
650     ¤³¤ÎÊÑ¿ô¤Î½é´üÃͤϣ°¤Ç¤¢¤ë¡£  */
651
652 enum MErrorCode merror_code;
653
654 /*=*/
655
656 /***en @brief Memory allocation error handler
657
658     The external variable #m17n_memory_full_handler holds a pointer
659     to the function to call when a library function failed to allocate
660     memory.  $ERR is one of @c enum #MErrorCode indicating in which
661     function the error occurred.
662
663     This variable initially points a function that simply calls the
664     exit () function with $ERR as an argument.
665
666     An application program that needs a different error handling can
667     change this variable to point a proper function.  */
668
669 /***ja @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é
670
671     ÊÑ¿ô #m17n_memory_full_handler ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ
672     ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤­´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£$ERR ¤Ï @c enum
673     #MErrorCode ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿
674     ¤«¤ò¼¨¤¹¡£
675
676     @anchor test
677
678     ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ
679     ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
680
681     ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
682     Å¬Åö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£  */
683
684 void (*m17n_memory_full_handler) (enum MErrorCode err);
685
686 /*** @} */
687
688 /*=*/
689
690 /***en
691     @addtogroup m17nDebug
692     @brief Support for m17n library users to debug their programs.
693
694     The m17n library provides the following facilities to support the
695     library users to debug their programs.
696
697     <ul>
698
699     <li> Environment variables to control printing of various
700     information.
701
702     <ul>
703
704     <li> MDEBUG_INIT -- If set to 1, print information about the
705     library initialization on the call of M17N_INIT ().
706
707     <li> MDEBUG_FINI -- If set to 1, print counts of objects that are
708     not yet freed on the call of M17N_FINI ().
709
710     <li> MDEBUG_CHARSET -- If set to 1, print information about
711     charsets being loaded from the m17n database.
712
713     <li> MDEBUG_CODING -- If set to 1, print information about coding
714     systems being loaded from the m17n database.
715
716     <li> MDEBUG_DATABASE -- If set to 1, print information about
717     data being loaded from the m17n database.
718
719     <li> MDEBUG_FONT -- If set to 1, print information about fonts
720     being selected and opened.
721
722     <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
723     command of Font Layout Table are being executed.
724
725     <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
726     feature of OpenType Layout Table are being executed.
727
728     <li> MDEBUG_INPUT -- If set to 1, print information about how an
729     input method is running.
730
731     <li> MDEBUG_ALL -- Setting this variable to 1 is equivalent to
732     setting all the above variables to 1.
733
734     </ul>
735
736     <li> Functions to print various objects in a human readable way.
737     See the documentation of mdebug_dump_XXXX () functions.
738
739     <li> The hook function called on an error.  See the documentation
740     of mdebug_hook ().
741
742     </ul>
743 */
744
745 /*=*/
746 /*** @{ */
747 /*=*/
748
749 /***en
750     @brief Hook function called on an error.
751
752     The mdebug_hook () function is called when an error happens.  It
753     returns -1q without doing anything.  It is useful to set a break
754     point on this function in a debugger.  */ 
755
756 int
757 mdebug_hook ()
758 {
759   return -1;
760 }
761
762 /*=*/
763
764 /*** @} */ 
765
766 /*
767   Local Variables:
768   coding: euc-japan
769   End:
770 */