/* m17n-core.c -- body of the CORE API.
- Copyright (C) 2003, 2004
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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) ¤Ç¤¢¤ë¡£
- @e m17n¥é¥¤¥Ö¥é¥ê ¤Ï C ¸À¸ìÍÑ¿¸À¸ì¾ðÊó½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë¡£
- ¤³¤Î¥é¥¤¥Ö¥é¥ê¤Ï¡¢Â¿¸À¸ìʸ½ñ¤ò°·¤¦¤¿¤á¤ËɬÍפʰʲ¼¤Î´ðËܵ¡Ç½¤ò¥¢¥×
- ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÄ󶡤¹¤ë¡£
+ ¥Ì¥ë¥Ç¥Ð¥¤¥¹¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ïɽ¼¨¤âÆþÎϤâ¤Ç¤¤Ê¤¤¡£¤¿¤À¤·
+ mdraw_glyph_list () ¤Ê¤É¤Î´Ø¿ô¤Ï»ÈÍѲÄǽ¤Ç¤¢¤ë¡£
- @li ¿¸À¸ì¥Æ¥¥¹¥ÈÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¤Î¹½Â¤ÂÎ @e M-text
+ X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¤¹¤Ù¤Æ¤Î GUI API ¤¬»ÈÍѤǤ¤ë¡£
- @li M-text ¤ò°·¤¦¤¿¤á¤Î¿¤¯¤Î´Ø¿ô¡¦¥Þ¥¯¥í·²
+ 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 () ¤Ê¤É¡£
+
+ <li> ¥·¥ó¥Ü¥ë¤Ç¤Ê¤¤ÊÑ¿ô -- mobject, ¤Þ¤¿¤Ï mobject_xxx
+
+ ´Ø¿ô¤ÈƱ¤¸Ì¿Ì¾µ¬Â§¤Ë½¾¤¦¡£¤¿¤È¤¨¤Ð mface_large ¤Ê¤É¡£
- @li ¼ï¡¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Æ¥¥¹¥È¤È M-text ´Ö¤ÎÊÑ´¹
- ¤ò¹Ô¤Ê¤¦¥Ç¥³¡¼¥À¡¿¥¨¥ó¥³¡¼¥À
+ <li> ¥·¥ó¥Ü¥ëÊÑ¿ô -- Mname
- @li Unicode ¤ÎÁ´¤Æ¤Îʸ»ú¤Ë²Ã¤¨¡¢¤½¤ì¤ÈƱ¤¸¿ô¤ÎÈó Unicode ʸ»ú¤ò°·
- ¤¨¤ëµðÂç¤Êʸ»ú¶õ´Ö
+ MSymbol ·¿ÊÑ¿ô¤Ï¡¢'M' ¤Î¸å¤Ë̾Á°¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_'
+ ¤Ç¶èÀÚ¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð Mlanguage (̾Á°¤Ï "language"), Miso_2022
+ (̾Á°¤Ï"iso-2022") ¤Ê¤É¡£
- @li ʸ»úËè¤Î¾ðÊó¤ò¸úΨÎɤ¯³ÊǼ¤¹¤ë¹½Â¤ÂÎ @e ʸ»ú¥Æ¡¼¥Ö¥ë (CharTable)
+ <li> ¥Þ¥¯¥í -- MOBJECT_XXX
- @li ¥ª¥×¥·¥ç¥ó¡§M-text¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Ç¤Îɽ¼¨¡¦ÆþÎÏ¥·¥¹¥Æ¥à¡£
- ¡Ê¤³¤Î¤¿¤á¤Î API ¤Ï m17n-win.h ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡£¡Ë */
+ 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì´Ö¤Ï '_' ¤Ç¶èÀÚ¤é¤ì¤ë¡£
+
+ <li> ¥¿¥¤¥× -- MObject ¤Þ¤¿¤Ï MObjectXxx
+
+ 'M' ¤Î¸å¤ËÂçʸ»ú¤Ç»Ï¤Þ¤ë¥ª¥Ö¥¸¥§¥¯¥È̾¤¬Â³¤¯¡£Ã±¸ì¤ÏϢ³¤·¤Æ½ñ¤«¤ì¡¢
+ '_' ¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£¤¿¤È¤¨¤Ð MConverter, MInputDriver ¤Ê¤É¡£
+
+ </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
/*=*/
/***en
+ The #M17NLIB_PATCH_LEVEL macro gives the patch level number
+ of the m17n library. */
+
+/***ja
+ ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n
+ ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤òÍ¿¤¨¤ë. */
+
+#define M17NLIB_PATCH_LEVEL
+
+/*=*/
+
+/***en
The #M17NLIB_VERSION_NAME macro gives the version name of the
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
+ #merror_code is set to 0. Otherwise it is set to -1.
- If the initialization was successful, the external variable @c
- 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_INIT () ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ò½é´ü²½¤¹¤ë¡£m17n
+ ¤Î´Ø¿ô¤òÍøÍѤ¹¤ëÁ°¤Ë¡¢¤³¤Î¥Þ¥¯¥í¤ò¤Þ¤º¸Æ¤Ð¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+ ¤³¤Î¥Þ¥¯¥í¤òÊ£¿ô²ó¸Æ¤ó¤Ç¤â°ÂÁ´¤Ç¤¢¤ë¤¬¡¢¤½¤Î¾ì¹ç¥á¥â¥ê¤ò²òÊü¤¹¤ë¤¿¤á¤Ë¥Þ¥¯¥í
+ M17N_FINI () ¤òƱ¤¸²ó¿ô¸Æ¤ÖɬÍפ¬¤¢¤ë¡£
+
+ ³°ÉôÊÑ¿ô #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)
static struct timeval time_stack[16];
static int time_stack_index;
-static int report_header_printed;
+static M17NObjectArray *object_array_root;
-\f
-/* Internal API */
-
-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 ()
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 */
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 = 0;
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") == 0)
+ mdebug__output = stdout;
+ else
+ mdebug__output = fopen (env_value, "a");
+ }
+ if (! mdebug__output)
+ mdebug__output = stderr;
+ }
MDEBUG_PUSH_TIME ();
MDEBUG_PUSH_TIME ();
if (mplist__init () < 0)
goto err;
MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize plist module."));
- if (mtext__init () < 0)
- goto err;
- if (mtext__prop_init () < 0)
+ if (mchar__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.
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 () ¤ÎÀâÌÀ¤ò»²¾È¡£ */
/*** @{ */
/*=*/
@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
{
M17NObject *obj = malloc (size);
obj->ref_count = 1;
+ obj->ref_count_extended = 0;
+ obj->flag = 0;
obj->u.freer = freer;
return obj;
}
@errors
This function never fails. */
+/***ja
+ @brief ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹.
+
+ ´Ø¿ô m17n_object_ref () ¤Ï $OBJECT
+ ¤Ç»Ø¤µ¤ì¤ë´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò 1 Áý¤ä¤¹¡£
+
+ @return
+ ¤³¤Î´Ø¿ô¤Ï¡¢Áý¤ä¤·¤¿»²¾È¿ô¤¬ 16 ¥Ó¥Ã¥È¤ÎÉä¹æ̵¤·À°¿ôÃÍ(¤¹¤Ê¤ï¤Á
+ 0x10000 ̤Ëþ)¤Ë¤ª¤µ¤Þ¤ì¤Ð¡¢¤½¤ì¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤¹¡£
+
+ @errors
+ ¤³¤Î´Ø¿ô¤Ï¼ºÇÔ¤·¤Ê¤¤¡£ */
int
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)
{
/*** @} */
/***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
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
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
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);
<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.
</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>
+*/
/*=*/
/*** @{ */
@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 ()