(load_category_table): If mflt_enable_new_feature is
[m17n/m17n-lib.git] / src / m17n-core.c
index cb87f7f..41bb939 100644 (file)
@@ -1,5 +1,5 @@
 /* m17n-core.c -- body of the CORE API.
-   Copyright (C) 2003, 2004
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
 
    You should have received a copy of the GNU Lesser General Public
    License along with the m17n library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    02111-1307, USA.  */
 
 /***en
     @addtogroup m17nIntro
-    @brief Introduction to the m17n library
+    @brief Introduction to the m17n library.
 
     <em>API LEVELS</em>
 
-    The API of the m17n library is divided into these four.
+    The API of the m17n library is divided into these five.
 
     <ol>
     <li> CORE API
 
-    It provides basic modules to handle M-texts.  They don't require
-    the m17n database.  To use this API, an application program must
-    include <m17n-core.h> and be linked by -lm17n-core.
+    It provides basic modules to handle M-texts.  To use this API, an
+    application program must include <m17n-core<EM></EM>.h> and be
+    linked with -lm17n-core.
 
     <li> SHELL API
 
-    It provides modules that utilize the m17n database.  They load
-    various kinds of data from the database on demand.  To use this
-    API, an application program must include <m17n.h> and be linked by
-    -lm17n-core -lm17n.  With that, CORE API is also available.
+    It provides modules for character properties, character set
+    handling, code conversion, etc.  They load various kinds of
+    data from the database on demand.  To use this API, an application
+    program must include <m17n<EM></EM>.h> and be linked with
+    -lm17n-core -lm17n.
+
+    When you use this API, CORE API is also available.
+
+    <li> FLT API
+
+    It provides modules for text shaping using @ref mdbFLT.  To use
+    this API, an application program must include <m17n<EM></EM>.h>
+    and be linked with -lm17n-core -lm17n-flt.
+
+    When you use this API, CORE API is also available.
 
     <li> GUI API
 
     It provides GUI modules such as drawing and inputting M-texts on a
-    window system.  The API itself is independent on a window system,
-    but the m17n library must be configured to use a specific window
-    system.  Currently, we support only the X Window System.  To use
-    this API, an application program must include <m17n-gui.h> and
-    <m17n-X.h>, and be linked by -lm17n-core -lm17n -lm17n-X.  With
-    that, CORE and SHELL APIs are also available.
+    graphic device.  This API itself is independent of graphic
+    devices, but most functions require an argument MFrame that is
+    created for a specific type of graphic devices.  The currently
+    supported graphic devices are null device, the X Window System,
+    and image data (gdImagePtr) of the GD library.
+
+    On a frame of a null device, you cannot draw text nor use input
+    methods.  However, functions like mdraw_glyph_list (), etc. are
+    available.
+
+    On a frame of the X Window System, you can use the whole GUI API.
+
+    On a frame of the GD library, you can use all drawing API but
+    cannot use input methods.
+
+    To use this API, an application program must include
+    <m17n-gui<EM></EM>.h> and be linked with -lm17n-core -lm17n
+    -lm17n-gui.
+
+    When you use this API, CORE, SHELL, and FLT APIs are also
+    available.
 
     <li> MISC API
 
     It provides miscellaneous functions to support error handling and
-    debugging.  This API can't be used by itself, but with one or more
-    APIs listed above.  To use the API, an application program must
-    include <m17n-misc.h> in addition to one of <m17n-core.h>,
-    <m17n.h>, and <m17n-gui.h>.
+    debugging.  This API cannot be used standalone; it must be used
+    with one or more APIs listed above.  To use this API, an
+    application program must include <m17n-misc<EM></EM>.h> in
+    addition to one of the header files described above.
 
     </ol>
 
     See also the section @ref m17n-config "m17n-config(1)".
 
-    <em>ENVIRONMENT VARIABLE</em>
+    <em>ENVIRONMENT VARIABLES</em>
 
-    The m17n library pays attention to these environment variables.
+    The m17n library pays attention to the following environment
+    variables.
 
     <ul>
     <li> @c M17NDIR
 
-    Name of a directory that contains data of the m17n database.  See
-    @ref m17nDatabase for the detail.
+    The name of the directory that contains data of the m17n database.
+    See @ref m17nDatabase for details.
 
-    <li> @c MDEBUG_XXXX
+    <li> @c MDEBUG_XXX
 
-    Environment variables whose name start by "MDEBUG_" controls
-    printing of debug information.  See @ref m17nDebug for the detail.
+    Environment variables whose names start with "MDEBUG_" control
+    debug information output.  See @ref m17nDebug for details.
 
     </ul>
 
     <em>API NAMING CONVENTION</em>
 
-    The library exports functions, variables, macros, and types.  All
-    of them start by the letter 'm' or 'M' followed by an object name
-    (e.g. "symbol" and "plist", but "mtext" object is given the name
-    "text" to avoid double 'm' at the head) or a module name
-    (e.g. draw, input).
-    
+    The m17n library exports functions, variables, macros, and types.
+    All of them start with the letter 'm' or 'M', and are followed by
+    an object name (e.g. "symbol", "plist") or a module name
+    (e.g. draw, input).  Note that the name of M-text objects start
+    with "mtext" and not with "mmtext".
+
     <ul>
 
     <li> functions -- mobject () or mobject_xxx ()
 
-    They start with 'm' followed by lower case object name.  For
-    example, msymbol (), mtext_ref_char (), mdraw_text ().
+    They start with 'm' and are followed by an object name in lower
+    case.  Words are separated by '_'.  For example, msymbol (),
+    mtext_ref_char (), mdraw_text ().
 
     <li> non-symbol variables -- mobject, or mobject_xxx
     
 
     <li> symbol variables -- Mname
 
-    Variables of type MSymbol start with 'M' followed by their names
-    (e.g. Mlanguage (name is "langauge"), Miso_2022 (name is
-    "iso-2022").
+    Variables of the type MSymbol start with 'M' and are followed by
+    their names.  Words are separated by '_'.  For example, Mlanguage
+    (the name is "language"), Miso_2022 (the name is "iso-2022").
 
-    <li> macross -- MOBJECT_XXX
+    <li> macros -- MOBJECT_XXX
 
-    They start by 'M' followed by upper case object names.
+    They start with 'M' and are followed by an object name in upper
+    case.  Words are separated by '_'.
 
     <li> types -- MObject or MObjectXxx
 
-    They start by 'M' followed by capitalized object names (e.g.
-    MConverter, MInputDriver).
+    They start with 'M' and are followed by capitalized object names.
+    Words are concatenated directly and no '_' are used.  For example,
+    MConverter, MInputDriver.
 
     </ul>
 
 
 /***ja
     @addtogroup m17nIntro
+    @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó.
+
+    @em API¤Î¥ì¥Ù¥ë
+
+    m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£
+
+    <ol>
+    <li> ¥³¥¢ API
+
+    M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£
+    ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
+    <m17n-core<EM></EM>.h> ¤ò include ¤·¡¢ -lm17n-core
+    ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    <li> ¥·¥§¥ë API
+
+    Ê¸»ú¥×¥í¥Ñ¥Æ¥£¡¢Ê¸»ú½¸¹çÁàºî¡¢¥³¡¼¥ÉÊÑ´¹Åù¤Î¤¿¤á¤Î¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£
+    ¤³¤ì¤é¤Î¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼¥¿¤ò¥í¡¼¥É¤¹¤ë¡£
+    ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
+    <m17n<EM></EM>.h> ¤ò include ¤·¡¢ -lm17n-core -lm17n
+    ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
+
+    <li> FLT API
+
+    Ê¸»úÎóɽ¼¨¤Ë @ref mdbFLT ¤òÍѤ¤¤ë¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API
+    ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï <m17n<EM></EM>.h> 
+    ¤ò include ¤·¡¢ -lm17n-core -lm17n-flt ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
+
+    <li> GUI API
+
+    ¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¾å¤Ç M-text ¤òɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤¿¤á¤Î
+    GUI ¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API
+    ¼«ÂΤϥ°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢
+    Â¿¤¯¤Î´Ø¿ô¤ÏÆÃÄê¤Î¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹ÍѤ˺îÀ®¤µ¤ì¤¿ 
+    MFrame ¤ò°ú¿ô¤Ë¼è¤ë¡£
+    ¸½»þÅÀ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤Ï¡¢¥Ì¥ë¥Ç¥Ð¥¤¥¹¡¢X
+    ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¡¢¤ª¤è¤Ó GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥Ç¡¼¥¿
+    (gdImagePtr) ¤Ç¤¢¤ë¡£
+
+    ¥Ì¥ë¥Ç¥Ð¥¤¥¹¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ïɽ¼¨¤âÆþÎϤâ¤Ç¤­¤Ê¤¤¡£¤¿¤À¤·
+    mdraw_glyph_list () ¤Ê¤É¤Î´Ø¿ô¤Ï»ÈÍѲÄǽ¤Ç¤¢¤ë¡£
+
+    X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¤¹¤Ù¤Æ¤Î GUI API ¤¬»ÈÍѤǤ­¤ë¡£
+
+    GD ¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¡¢ÉÁ²èÍѤΠAPI
+    ¤Ï¤¹¤Ù¤Æ»ÈÍѤǤ­¤ë¤¬¡¢ÆþÎϤϤǤ­¤Ê¤¤¡£
+
+    ¤³¤Î API ¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
+    <m17n-gui<EM></EM>.h> ¤ò include ¤·¡¢-lm17n-core -lm17n -lm17n-gui
+    ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API¡¢¥·¥§¥ë API¡¢¤ª¤è¤Ó FLT API
+    ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£
+
+    <li> ¤½¤Î¾¤Î API
+
+    ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API
+    ¤Ï¤½¤ì¤À¤±¤Ç¤Ï»ÈÍѤǤ­¤º¡¢¾åµ­¤Î¾¤Î API
+    ¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¾åµ­¤Î¤¤¤º¤ì¤«¤Îinclude
+    ¥Õ¥¡¥¤¥ë¤Ë²Ã¤¨¤Æ¡¢ <m17n-misc<EM></EM>.h> ¤òinclude
+    ¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    </ol>
+
+    @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£
+
+    @em ´Ä¶­ÊÑ¿ô
+
+    m17n ¥é¥¤¥Ö¥é¥ê¤Ï°Ê²¼¤Î´Ä¶­ÊÑ¿ô¤ò»²¾È¤¹¤ë¡£
+
+    <ul>
+    <li> @c M17NDIR
+
+    m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤ò³ÊǼ¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¡£¾ÜºÙ¤Ï @ref
+    m17nDatabase »²¾È¡£
+
+    <li> @c MDEBUG_XXX
+
+    "MDEBUG_" ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ä¶­ÊÑ¿ô¤Ï¥Ç¥Ð¥Ã¥°¾ðÊó¤Î½ÐÎϤòÀ©¸æ¤¹¤ë¡£
+    ¾ÜºÙ¤Ï @ref m17nDebug »²¾È¡£
+
+    </ul>
+
+    @em API @em ¤Î̿̾µ¬Â§
+
+    m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï 'm' 
+    ¤Þ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾ ("symbol"¡¢"plist" ¤Ê¤É)
+    ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾ (draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£
+    M-text ¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï "mmtext" ¤Ç¤Ï¤Ê¤¯¤Æ "mtext"
+    ¤Ç»Ï¤Þ¤ë¤³¤È¤ËÃí°Õ¡£
+    
+    <ul>
+
+    <li> ´Ø¿ô -- mobject () ¤Þ¤¿¤Ï mobject_xxx ()
+
+    'm' ¤Î¤¢¤È¤Ë¾®Ê¸»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_'
+    ¤Ç¶èÀÚ¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð¡¢msymbol (),
+     mtext_ref_char (), mdraw_text () ¤Ê¤É¡£
 
-    @e m17n¥é¥¤¥Ö¥é¥ê ¤Ï C ¸À¸ìÍÑ¿¸À¸ì¾ðÊó½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë¡£
-    ¤³¤Î¥é¥¤¥Ö¥é¥ê¤Ï¡¢Â¿¸À¸ìʸ½ñ¤ò°·¤¦¤¿¤á¤ËɬÍפʰʲ¼¤Î´ðËܵ¡Ç½¤ò¥¢¥×
-    ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÄ󶡤¹¤ë¡£
+    <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject,  ¤Þ¤¿¤Ï mobject_xxx
+    
+    ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£¤¿¤È¤¨¤Ð  mface_large ¤Ê¤É¡£
+
+    <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
 
-    @li Â¿¸À¸ì¥Æ¥­¥¹¥ÈÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¤Î¹½Â¤ÂΠ@e M-text
+    MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_'
+    ¤Ç¶èÀÚ¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï "language"), Miso_2022
+    (̾Á°¤Ï"iso-2022") ¤Ê¤É¡£
 
-    @li M-text ¤ò°·¤¦¤¿¤á¤Î¿¤¯¤Î´Ø¿ô¡¦¥Þ¥¯¥í·²
+    <li> ¥Þ¥¯¥í -- MOBJECT_XXX
 
-    @li ¼ï¡¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Æ¥­¥¹¥È¤È M-text ´Ö¤ÎÊÑ´¹
-    ¤ò¹Ô¤Ê¤¦¥Ç¥³¡¼¥À¡¿¥¨¥ó¥³¡¼¥À
+    'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_' ¤Ç¶èÀÚ¤é¤ì¤ë¡£
 
-    @li Unicode ¤ÎÁ´¤Æ¤Îʸ»ú¤Ë²Ã¤¨¡¢¤½¤ì¤ÈƱ¤¸¿ô¤ÎÈó Unicode Ê¸»ú¤ò°·
-    ¤¨¤ëµðÂç¤Êʸ»ú¶õ´Ö
+    <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
 
-    @li Ê¸»úËè¤Î¾ðÊó¤ò¸úΨÎɤ¯³ÊǼ¤¹¤ë¹½Â¤ÂΠ@e Ê¸»ú¥Æ¡¼¥Ö¥ë (CharTable)
+    'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤Þ¤ë¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì¤ÏϢ³¤·¤Æ½ñ¤«¤ì¡¢
+    '_' ¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£¤¿¤È¤¨¤Ð MConverter, MInputDriver ¤Ê¤É¡£
 
-    @li ¥ª¥×¥·¥ç¥ó¡§M-text¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Ç¤Îɽ¼¨¡¦ÆþÎÏ¥·¥¹¥Æ¥à¡£
-    ¡Ê¤³¤Î¤¿¤á¤Î API ¤Ï m17n-win.h ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡£¡Ë  */
+    </ul>
+    
+    */
 /*=*/
 /*** @{ */
 #ifdef FOR_DOXYGEN
 /***en
     The #M17NLIB_MAJOR_VERSION macro gives the major version number
     of the m17n library.  */
-
 /***ja
-    ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
-    ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
+    ¥Þ¥¯¥í #M17NLIB_MAJOR_VERSION ¤Ï m17n 
+    ¥é¥¤¥Ö¥é¥ê¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÍ¿¤¨¤ë.  */
 
 #define M17NLIB_MAJOR_VERSION
 
     of the m17n library.  */
 
 /***ja
-    ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç
-    ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£  */
+    ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n 
+    ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÍ¿¤¨¤ë.  */
 
 #define M17NLIB_MINOR_VERSION
 
     of the m17n library.  */
 
 /***ja
-    ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò
-    Í¿¤¨¤ë¡£  */
+    ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n 
+    ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤òÍ¿¤¨¤ë.  */
 
 #define M17NLIB_PATCH_LEVEL
 
     m17n library as a string.  */
 
 /***ja
-    ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò
-    C-string ¤Î·Á¤ÇÍ¿¤¨¤ë¡£  */
+    ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n 
+    ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤òʸ»úÎó¤È¤·¤ÆÍ¿¤¨¤ë.  */
 
 #define M17NLIB_VERSION_NAME
 
 /***en
     @brief Initialize the m17n library.
 
-    The macro M17N_INIT () initializes the m17n library.  This
-    function must be called before any m17n functions are used.
+    The macro M17N_INIT () initializes the m17n library.  This macro
+    must be called before any m17n functions are used.
+
+    It is safe to call this macro multiple times, but in that case,
+    the macro M17N_FINI () must be called the same times to free the
+    memory.
 
-    If the initialization was successful, the external variable @c
-    merror_code is set to 0.  Otherwise it is set to -1.  */
+    If the initialization was successful, the external variable
+    #merror_code is set to 0.  Otherwise it is set to -1.
+
+    @seealso
+    M17N_FINI (), m17n_status ()  */
 
 /***ja
-    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë.
+
+    ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n 
+    ¤Î´Ø¿ô¤òÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    
+    ¤³¤Î¥Þ¥¯¥í¤òÊ£¿ô²ó¸Æ¤ó¤Ç¤â°ÂÁ´¤Ç¤¢¤ë¤¬¡¢¤½¤Î¾ì¹ç¥á¥â¥ê¤ò²òÊü¤¹¤ë¤¿¤á¤Ë¥Þ¥¯¥í
+    M17N_FINI () ¤òƱ¤¸²ó¿ô¸Æ¤ÖɬÍפ¬¤¢¤ë¡£
 
-    ¥Þ¥¯¥í M17N_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é
-    ¥ê¤ò»È¤¦¤È¤­¤Ï¡¢ºÇ½é¤Ë¤³¤Î´Ø¿ô¤ò¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð 
+    -1 ¤ËÀßÄꤵ¤ì¤ë¡£  
 
-    ÊÑ¿ô #merror_code ¤Ï¡¢½é´ü²½¤¬À®¸ù¤¹¤ì¤Ð 0 ¤Ë¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 
-    ¤ËÀßÄꤵ¤ì¤ë¡£  */
+    @seealso
+    M17N_FINI (), m17n_status ()  */
 
 #define M17N_INIT()
 
     @brief Finalize the m17n library.
 
     The macro M17N_FINI () finalizes the m17n library.  It frees all the
-    memory area used by the m17n library.  Once this function is
+    memory area used by the m17n library.  Once this macro is
     called, no m17n functions should be used until the
-    macro M17N_INIT () is called again.  */
+    macro M17N_INIT () is called again.
 
+    If the macro M17N_INIT () was called N times, the Nth call of this
+    macro actually free the memory. 
+
+    @seealso
+    M17N_INIT (), m17n_status ()  */
 /***ja
-    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î½ªÎ»  */
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë. 
+
+    ¥Þ¥¯¥í M17N_FINI () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½ªÎ»¤¹¤ë¡£m17n 
+    ¥é¥¤¥Ö¥é¥ê¤¬»È¤Ã¤¿Á´¤Æ¤Î¥á¥â¥êÎΰè¤Ï²òÊü¤µ¤ì¤ë¡£°ìÅÙ¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤¿¤é¡¢¥Þ¥¯¥í
+    M17N_INIT () ¤¬ºÆÅٸƤФì¤ë¤Þ¤Ç m17n ´Ø¿ô¤Ï»È¤¦¤Ù¤­¤Ç¤Ê¤¤¡£
+
+    ¥Þ¥¯¥í M17N_INIT () ¤¬ N ²ó¸Æ¤Ð¤ì¤Æ¤¤¤¿¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Þ¥¯¥í¤¬ N 
+    ²ó¸Æ¤Ð¤ì¤Æ½é¤á¤Æ¥á¥â¥ê¤¬²òÊü¤µ¤ì¤ë¡£
+
+    @seealso
+    M17N_INIT (), m17n_status ()  */
 
 #define M17N_FINI()
 #endif /* FOR_DOXYGEN */
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <unistd.h>
 #include "m17n-core.h"
 #include "m17n-misc.h"
 #include "internal.h"
-
-static int core_initialized;
+#include "symbol.h"
 
 static void
 default_error_handler (enum MErrorCode err)
@@ -256,34 +419,60 @@ default_error_handler (enum MErrorCode err)
 static struct timeval time_stack[16];
 static int time_stack_index;
 
-static int report_header_printed;
-
-\f
-/* Internal API */
+static M17NObjectArray *object_array_root;
 
-void
-mdebug__report_object (char *name, M17NObjectArray *array)
+static void
+report_object_array ()
 {
-  if (! (mdebug__flag & MDEBUG_FINI))
-    return;
-  if (! report_header_printed)
+  fprintf (stderr, "%16s %7s %7s %7s\n",
+          "object", "created", "freed", "alive");
+  fprintf (stderr, "%16s %7s %7s %7s\n",
+          "------", "-------", "-----", "-----");
+  for (; object_array_root; object_array_root = object_array_root->next)
     {
-      fprintf (stderr, "%16s %7s %7s %7s\n",
-              "object", "created", "freed", "alive");
-      fprintf (stderr, "%16s %7s %7s %7s\n",
-              "------", "-------", "-----", "-----");
-      report_header_printed = 1;
+      M17NObjectArray *array = object_array_root;
+
+      fprintf (stderr, "%16s %7d %7d %7d\n", array->name,
+              array->used, array->used - array->count, array->count);
+      if (array->count > 0)
+       {
+         int i;
+         for (i = 0; i < array->used && ! array->objects[i]; i++);
+
+         if (strcmp (array->name, "M-text") == 0)
+           {
+             MText *mt = (MText *) array->objects[i];
+
+             if (mt->format <= MTEXT_FORMAT_UTF_8)
+               fprintf (stderr, "\t\"%s\"\n", (char *) mt->data);
+           }
+         else if (strcmp (array->name, "Plist") == 0)
+           {
+             MPlist *plist = (MPlist *) array->objects[i];
+
+             mdebug_dump_plist (plist, 8);
+             fprintf (stderr, "\n");
+           }
+       }
+
+      if (array->used > 0)
+       {
+         free (array->objects);
+         array->count = array->used = 0;
+       }
     }
-  fprintf (stderr, "%16s %7d %7d %7d\n", name,
-          array->used, array->used - array->count, array->count);
 }
 
 
-void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
-                          MSymbol tag3, MSymbol tag4);
-void *(*mdatabase__loader) (void *);
+\f
+/* Internal API */
+
+int m17n__core_initialized;
+int m17n__shell_initialized;
+int m17n__gui_initialized;
 
-int mdebug__flag;
+int mdebug__flags[MDEBUG_MAX];
+FILE *mdebug__output;
 
 void
 mdebug__push_time ()
@@ -313,15 +502,67 @@ mdebug__print_time ()
   time_stack[time_stack_index - 1] = tv;
 }
 
-#define SET_DEBUG_FLAG(env_name, mask)         \
-  do {                                         \
-    char *env_value = getenv (env_name);       \
-                                               \
-    if (env_value && env_value[0] == '1')      \
-      mdebug__flag |= (mask);                  \
-  } while (0)
+static void
+SET_DEBUG_FLAG (char *env_name, enum MDebugFlag flag)
+{
+  char *env_value = getenv (env_name);
+
+  if (env_value)
+    {
+      int int_value = atoi (env_value);
+
+      if (flag == MDEBUG_ALL)
+       {
+         int i;
+         for (i = 0; i < MDEBUG_MAX; i++)
+           mdebug__flags[i] = int_value;
+       }
+      else
+       mdebug__flags[flag] = int_value;
+    }
+}
+
+void
+mdebug__add_object_array (M17NObjectArray *array, char *name)
+{
+  array->name = name;
+  array->count = 0;
+  array->next = object_array_root;
+  object_array_root = array;
+}
 
 
+void
+mdebug__register_object (M17NObjectArray *array, void *object)
+{
+  if (array->used == 0)
+    MLIST_INIT1 (array, objects, 256);
+  array->count++;
+  MLIST_APPEND1 (array, objects, object, MERROR_OBJECT);
+}
+
+void
+mdebug__unregister_object (M17NObjectArray *array, void *object)
+{
+  array->count--;
+  if (array->count >= 0)
+    {
+      int i;
+
+      for (i = array->used - 1; i >= 0 && array->objects[i] != object; i--);
+      if (i >= 0)
+       {
+         if (i == array->used - 1)
+           array->used--;
+         array->objects[i] = NULL;
+       }
+      else
+       mdebug_hook ();
+    }
+  else                                                                 \
+    mdebug_hook ();
+}
+
 \f
 /* External API */
 
@@ -331,24 +572,41 @@ mdebug__print_time ()
 void
 m17n_init_core (void)
 {
-  int mdebug_mask = MDEBUG_INIT;
+  int mdebug_flag = MDEBUG_INIT;
 
-  if (core_initialized)
+  merror_code = MERROR_NONE;
+  if (m17n__core_initialized++)
     return;
 
-  merror_code = MERROR_NONE;
   m17n_memory_full_handler = default_error_handler;
 
-  mdebug__flag = 0;
+  SET_DEBUG_FLAG ("MDEBUG_ALL", MDEBUG_ALL);
   SET_DEBUG_FLAG ("MDEBUG_INIT", MDEBUG_INIT);
   SET_DEBUG_FLAG ("MDEBUG_FINI", MDEBUG_FINI);
   SET_DEBUG_FLAG ("MDEBUG_CHARSET", MDEBUG_CHARSET);
   SET_DEBUG_FLAG ("MDEBUG_CODING", MDEBUG_CODING);
   SET_DEBUG_FLAG ("MDEBUG_DATABASE", MDEBUG_DATABASE);
   SET_DEBUG_FLAG ("MDEBUG_FONT", MDEBUG_FONT); 
-  SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FONT_FLT);
-  SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FONT_OTF);
+  SET_DEBUG_FLAG ("MDEBUG_FLT", MDEBUG_FLT);
+  SET_DEBUG_FLAG ("MDEBUG_FONTSET", MDEBUG_FONTSET);
   SET_DEBUG_FLAG ("MDEBUG_INPUT", MDEBUG_INPUT);
+  /* for backward compatibility... */
+  SET_DEBUG_FLAG ("MDEBUG_FONT_FLT", MDEBUG_FLT);
+  SET_DEBUG_FLAG ("MDEBUG_FONT_OTF", MDEBUG_FLT);
+  {
+    char *env_value = getenv ("MDEBUG_OUTPUT_FILE");
+
+    mdebug__output = NULL;
+    if (env_value)
+      {
+       if (strcmp (env_value, "stdout"))
+         mdebug__output = stdout;
+       else
+         mdebug__output = fopen (env_value, "a");
+      }
+    if (! mdebug__output)
+      mdebug__output = stderr;
+  }
 
   MDEBUG_PUSH_TIME ();
   MDEBUG_PUSH_TIME ();
@@ -358,57 +616,106 @@ m17n_init_core (void)
   if  (mplist__init () < 0)
     goto err;
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
-  if (mtext__init () < 0)
+  if (mchar__init () < 0)
     goto err;
-  if (mtext__prop_init () < 0)
-    goto err;
-  MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
+  MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize character module."));
   if  (mchartable__init () < 0)
     goto err;
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize chartable module."));
-
-  mdatabase__finder = NULL;
-  mdatabase__loader = NULL;
-  core_initialized = 1;
+  if (mtext__init () < 0 || mtext__prop_init () < 0)
+    goto err;
+  MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize mtext module."));
+  if (mdatabase__init () < 0)
+    goto err;
+  MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize database module."));
+
+#if ENABLE_NLS
+  bindtextdomain ("m17n-lib", GETTEXTDIR);
+  bindtextdomain ("m17n-db", GETTEXTDIR);
+  bindtextdomain ("m17n-contrib", GETTEXTDIR);
+  bind_textdomain_codeset ("m17n-lib", "UTF-8");
+  bind_textdomain_codeset ("m17n-db", "UTF-8");
+  bind_textdomain_codeset ("m17n-contrib", "UTF-8");
+#endif
 
  err:
   MDEBUG_POP_TIME ();
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the core modules."));
   MDEBUG_POP_TIME ();
-
-  report_header_printed = 0;
 }
 
 void
 m17n_fini_core (void)
 {
-  int mdebug_mask = MDEBUG_FINI;
+  int mdebug_flag = MDEBUG_FINI;
 
-  if (core_initialized)
-    {
-      MDEBUG_PUSH_TIME ();
-      MDEBUG_PUSH_TIME ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize chartable module."));
-      mchartable__fini ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize textprop module."));
-      mtext__prop_fini ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize mtext module."));
-      mtext__fini ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize symbol module."));
-      msymbol__fini ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize plist module."));
-      mplist__fini ();
-      core_initialized = 0;
-      MDEBUG_POP_TIME ();
-      MDEBUG_PRINT_TIME ("INIT", (stderr, " to finalize the core modules."));
-      MDEBUG_POP_TIME ();
-    }
+  if (m17n__core_initialized == 0
+      || --m17n__core_initialized > 0)
+    return;
+
+  MDEBUG_PUSH_TIME ();
+  MDEBUG_PUSH_TIME ();
+  mchartable__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize chartable module."));
+  mtext__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize mtext module."));
+  msymbol__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize symbol module."));
+  mplist__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize plist module."));
+  /* We must call this after the aboves because it frees interval
+     pools.  */
+  mtext__prop_fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize textprop module."));
+  MDEBUG_POP_TIME ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the core modules."));
+  MDEBUG_POP_TIME ();
+  if (mdebug__flags[MDEBUG_FINI])
+    report_object_array ();
+  msymbol__free_table ();
+  if (mdebug__output != stderr)
+    fclose (mdebug__output);
 }
 
 /*** @} */
 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
 /*=*/
 
+/*** @addtogroup m17nIntro */
+
+/*** @{  */
+/*=*/
+
+/***en
+    @brief Report which part of the m17n library is initialized.
+
+    The m17n_status () function returns one of these values depending
+    on which part of the m17n library is initialized:
+
+       #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
+       #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
+
+/***ja
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«Êó¹ð¤¹¤ë.
+
+    ´Ø¿ô m17n_status () ¤Ï 
+    m17n ¥é¥¤¥Ö¥é¥ê¤Î¤É¤ÎÉôʬ¤¬½é´ü²½¤µ¤ì¤¿¤«¤Ë±þ¤¸¤Æ¡¢°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤òÊÖ¤¹¡£
+
+       #M17N_NOT_INITIALIZED, #M17N_CORE_INITIALIZED,
+       #M17N_SHELL_INITIALIZED, #M17N_GUI_INITIALIZED  */
+
+enum M17NStatus
+m17n_status (void)
+{
+  return (m17n__gui_initialized ? M17N_GUI_INITIALIZED
+         : m17n__shell_initialized ? M17N_SHELL_INITIALIZED
+         : m17n__core_initialized ? M17N_CORE_INITIALIZED
+         : M17N_NOT_INITIALIZED);
+}
+
+/*** @} */
+
+/*=*/
 /***en
     @addtogroup m17nObject
     @brief Managed objects are objects managed by the reference count.
@@ -423,12 +730,27 @@ m17n_fini_core (void)
     zero.
 
     A property whose key is a managing key can have only a managed
-    object as its value.  Such functions as msymbol_put () and
-    mplist_put () pay special attention to such a property.
+    object as its value.  Some functions, for instance msymbol_put ()
+    and mplist_put (), pay special attention to such a property.
 
     In addition to the predefined managed object types, users can
     define their own managed object types.  See the documentation of
-    the m17n_object () for the details.  */
+    the m17n_object () for more details.  */
+/***ja
+    @addtogroup m17nObject
+    @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
+
+    m17n ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤¢¤ë·¿¤Î¤â¤Î¤Ï¡¢»²¾È¿ô¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë¡£
+    ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï @e ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È ¤È¸Æ¤Ð¤ì¤ë¡£À¸À®¤µ¤ì¤¿»þÅÀ¤Ç¤Î»²¾È¿ô¤Ï
+    1 ¤Ë½é´ü²½¤µ¤ì¤Æ¤¤¤ë¡£´Ø¿ô m17n_object_ref () ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
+    1 Áý¤ä¤·¡¢´Ø¿ôm17n_object_unref () ¤Ï 1 ¸º¤é¤¹¡£»²¾È¿ô¤¬
+    0 ¤Ë¤Ê¤Ã¤¿´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤Ë²òÊü¤µ¤ì¤ë¡£
+
+    ¥­¡¼¤¬´ÉÍý¥­¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃͤȤ·¤Æ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤À¤±¤ò¼è¤ë¡£
+    ´Ø¿ô msymbol_put () ¤ä mplist_put () ¤Ê¤É¤Ï¤½¤ì¤é¤Î¥×¥í¥Ñ¥Æ¥£¤òÆÃÊÌ°·¤¤¤¹¤ë¡£
+
+    ÄêµÁºÑ¤ß´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤Î¾¤Ë¡¢¥æ¡¼¥¶¤ÏɬÍפʴÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¥¿¥¤¥×¤ò¼«Ê¬¤ÇÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£¾ÜºÙ¤Ï
+    m17n_object () ¤ÎÀâÌÀ¤ò»²¾È¡£  */
 
 /*** @{  */
 /*=*/
@@ -451,6 +773,23 @@ m17n_fini_core (void)
     @errors
     This function never fails.  */
 
+/***ja
+    @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤ë.
+
+    ´Ø¿ô m17n_object () ¤Ï$SIZE ¥Ð¥¤¥È¤Î¿·¤·¤¤´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¡¢¤½¤Î»²¾È¿ô¤ò
+    1 ¤È¤¹¤ë¡£ $FREER ¤Ï»²¾È¿ô¤¬ 0 
+    ¤Ë¤Ê¤Ã¤¿ºÝ¤Ë¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£$FREER
+    ¤¬ NULL¤Ê¤é¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô free () ¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
+
+    ³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥ÈËÁƬ¤Î¥Ð¥¤¥È¤Ï¡¢#M17NObjectHead 
+    ¤¬Àê¤á¤ë¡£¤³¤ÎÎΰè¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѤ¹¤ë¤Î¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¿¨¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+    @return
+    ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
+
+    @errors
+    ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
+
 #if EXAMPLE_CODE
 typedef struct
 {
@@ -486,6 +825,8 @@ m17n_object (int size, void (*freer) (void *))
   M17NObject *obj = malloc (size);
 
   obj->ref_count = 1;
+  obj->ref_count_extended = 0;
+  obj->flag = 0;
   obj->u.freer = freer;
   return obj;
 }
@@ -505,6 +846,18 @@ m17n_object (int size, void (*freer) (void *))
 
     @errors
     This function never fails.  */
+/***ja
+    @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
+
+    ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT 
+    ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹¡£
+
+    @return 
+    ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
+    0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
+
+    @errors
+    ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
 
 int
 m17n_object_ref (void *object)
@@ -553,7 +906,19 @@ m17n_object_ref (void *object)
 
     @errors
     This function never fails.  */
+/***ja
+    @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 ¸º¤é¤¹.
+
+    ´Ø¿ô m17n_object_unref () ¤Ï $OBJECT ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò
+    1 ¸º¤é¤¹¡£»²¾È¿ô¤¬ 0 ¤Ë¤Ê¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï²òÊü´Ø¿ô¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤ë¡£
 
+    @return 
+    ¤³¤Î´Ø¿ô¤Ï¡¢¸º¤é¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á 
+    0x10000 Ì¤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 
+    ¤òÊÖ¤¹¡£¤Ä¤Þ¤ê¡¢0 ¤¬Ê֤äÆÍ褿¾ì¹ç¤Ï$OBJECT ¤Ï²òÊü¤µ¤ì¤Æ¤¤¤ë¡£
+
+    @errors
+    ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£    */
 int
 m17n_object_unref (void *object)
 {
@@ -595,7 +960,7 @@ m17n_object_unref (void *object)
 /*** @} */
 
 /***en
-    @addtogroup m17nError Error handling
+    @addtogroup m17nError Error Handling
     @brief Error handling of the m17n library.
 
     There are two types of errors that may happen in a function of
@@ -603,37 +968,39 @@ m17n_object_unref (void *object)
 
     The first type is argument errors.  When a library function is
     called with invalid arguments, it returns a value that indicates
-    error and at the same time sets the external variable @e
-    merror_code to a non-zero integer.
+    error and at the same time sets the external variable #merror_code
+    to a non-zero integer.
 
     The second type is memory allocation errors.  When the required
     amount of memory is not available on the system, m17n library
     functions call a function pointed to by the external variable @c
     m17n_memory_full_handler.  The default value of the variable is a
     pointer to the default_error_handle () function, which just calls
-    exit ().  */
+    <tt> exit ()</tt>.  */
 
 /***ja
     @addtogroup m17nError ¥¨¥é¡¼½èÍý
-    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý.
 
     m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£
 
-    °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë
-    ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô 
+    °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£
+    ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô 
     #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£
 
-    ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â
-    ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c
-    m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±¤Ë
-    <tt>exit ()</tt> ¤ò¸Æ¤Ö¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
+    ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£
+    ¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô 
+    @c m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô 
+    default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë <tt>exit
+    ()</tt> ¤ò¸Æ¤Ö¡£
 */
 
 /*** @{ */
 
 /*=*/
 
-/***en @brief External variable to hold error code of the m17n library
+/***en 
+    @brief External variable to hold error code of the m17n library.
 
     The external variable #merror_code holds an error code of the
     m17n library.  When a library function is called with an invalid
@@ -641,19 +1008,21 @@ m17n_object_unref (void *object)
 
     This variable initially has the value 0.  */
 
-/***ja @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô
+/***ja 
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë³°ÉôÊÑ¿ô.
 
     ³°ÉôÊÑ¿ô #merror_code ¤Ï¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼¥³¡¼¥É¤òÊÝ»ý¤¹¤ë¡£
-    ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢
-    ¤³¤ÎÊÑ¿ô¤ò @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
+    ¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò 
+    @c enum #MErrorCode ¤Î°ì¤Ä¤Ë¥»¥Ã¥È¤¹¤ë¡£
 
-    ¤³¤ÎÊÑ¿ô¤Î½é´üÃͤϣ°¤Ç¤¢¤ë¡£  */
+    ¤³¤ÎÊÑ¿ô¤Î½é´üÃͤϠ0 ¤Ç¤¢¤ë¡£  */
 
-enum MErrorCode merror_code;
+int merror_code;
 
 /*=*/
 
-/***en @brief Memory allocation error handler
+/***en 
+    @brief Memory allocation error handler.
 
     The external variable #m17n_memory_full_handler holds a pointer
     to the function to call when a library function failed to allocate
@@ -661,25 +1030,25 @@ enum MErrorCode merror_code;
     function the error occurred.
 
     This variable initially points a function that simply calls the
-    exit () function with $ERR as an argument.
+    <tt>exit </tt>() function with $ERR as an argument.
 
     An application program that needs a different error handling can
     change this variable to point a proper function.  */
 
-/***ja @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é
+/***ja 
+    @brief ¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é.
 
-    ÊÑ¿ô #m17n_memory_full_handler ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ
-    ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤­´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£$ERR ¤Ï @c enum
-    #MErrorCode ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿
-    ¤«¤ò¼¨¤¹¡£
+    ÊÑ¿ô #m17n_memory_full_handler 
+    ¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤¬¥á¥â¥ê³äÅö¤Æ¤Ë¼ºÇÔ¤·¤¿ºÝ¤Ë¸Æ¤Ö¤Ù¤­´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
+    $ERR ¤Ï @c enum #MErrorCode 
+    ¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢¤É¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ç¥¨¥é¡¼¤¬µ¯¤Ã¤¿¤«¤ò¼¨¤¹¡£
 
     @anchor test
 
-    ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ
-    ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
+    ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë <tt>exit ()</tt> ¤ò $ERR 
+    ¤ò°ú¿ô¤È¤·¤Æ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£
 
-    ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò
-    Å¬Åö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£  */
+    ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤òŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£  */
 
 void (*m17n_memory_full_handler) (enum MErrorCode err);
 
@@ -719,11 +1088,9 @@ void (*m17n_memory_full_handler) (enum MErrorCode err);
     <li> MDEBUG_FONT -- If set to 1, print information about fonts
     being selected and opened.
 
-    <li> MDEBUG_FONT_FLT -- If set to 1, print information about which
-    command of Font Layout Table are being executed.
-
-    <li> MDEBUG_FONT_OTF -- If set to 1, print information about which
-    feature of OpenType Layout Table are being executed.
+    <li> MDEBUG_FLT -- If set to 1, 2, or 3, print information about
+    which command of Font Layout Table are being executed.  The bigger
+    number prints the more detailed information.
 
     <li> MDEBUG_INPUT -- If set to 1, print information about how an
     input method is running.
@@ -741,6 +1108,55 @@ void (*m17n_memory_full_handler) (enum MErrorCode err);
 
     </ul>
 */
+/***ja
+    @addtogroup m17nDebug
+    @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È.
+
+    m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
+
+    <ul>
+
+    <li> ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶­ÊÑ¿ô¡£
+
+    <ul>
+
+    <li> MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () 
+    ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () 
+    ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n
+    ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿Ê¸»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_CODING --  1 ¤Ê¤é¤Ð¡¢m17n 
+    ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n
+    ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä
+    ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_FLT -- 1¡¢2¡¢¤â¤·¤¯¤Ï 3 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É
+    ¤Î¥³¥Þ¥ó¥É¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£¤è¤êÂ礭¤ÊÃÍÄø¤è¤ê¾Ü
+    ¤·¤¤¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ¤Î
+    ¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£
+
+    <li> MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ­¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 
+    ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú²Ì¤ò»ý¤Ä¡£
+
+    </ul>
+
+    <li> ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï´Ø¿ô
+    mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£
+
+    <li> ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£
+
+    </ul>
+*/
 
 /*=*/
 /*** @{ */
@@ -750,8 +1166,14 @@ void (*m17n_memory_full_handler) (enum MErrorCode err);
     @brief Hook function called on an error.
 
     The mdebug_hook () function is called when an error happens.  It
-    returns -1q without doing anything.  It is useful to set a break
+    returns -1 without doing anything.  It is useful to set a break
     point on this function in a debugger.  */ 
+/***ja
+    @brief ¥¨¥é¡¼¤ÎºÝ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô.
+
+    ´Ø¿ô mdebug_hook () ¤Ï¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿ºÝ¤Ë¸Æ¤Ð¤ì¡¢²¿¤â¤»¤º¤Ë-1 
+    ¤òÊÖ¤¹¡£¥Ç¥Ð¥Ã¥¬Æâ¤Ç¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤹ¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
+    */ 
 
 int
 mdebug_hook ()