X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fm17n-core.c;h=f3ab2220d154e505fde47235157892c0412d27bd;hb=f853f44b40ad4a71ba13a6489e91bca1218a2f02;hp=cb87f7fb9a6785d2ab6579ec819be4a1f43525f1;hpb=25d9f1dfd0fdebcc86adcb06aa1101c9b8a65061;p=m17n%2Fm17n-lib.git diff --git a/src/m17n-core.c b/src/m17n-core.c index cb87f7f..f3ab222 100644 --- a/src/m17n-core.c +++ b/src/m17n-core.c @@ -1,5 +1,5 @@ /* m17n-core.c -- body of the CORE API. - Copyright (C) 2003, 2004 + Copyright (C) 2003, 2004, 2005, 2006, 2007 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H15PRO112 @@ -17,84 +17,112 @@ 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. API LEVELS - The API of the m17n library is divided into these four. + The API of the m17n library is divided into these five.
  1. 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 and be linked by -lm17n-core. + It provides basic modules to handle M-texts. To use this API, an + application program must include .h> and be + linked with -lm17n-core.
  2. 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 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 .h> and be linked with + -lm17n-core -lm17n. + + When you use this API, CORE API is also available. + +
  3. FLT API + + It provides modules for text shaping using @ref mdbFLT. To use + this API, an application program must include .h> + and be linked with -lm17n-core -lm17n-flt. + + When you use this API, CORE API is also available.
  4. 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 and - , 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 + .h> and be linked with -lm17n-core -lm17n + -lm17n-gui. + + When you use this API, CORE, SHELL, and FLT APIs are also + available.
  5. 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 in addition to one of , - , and . + 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 .h> in + addition to one of the header files described above.
See also the section @ref m17n-config "m17n-config(1)". - ENVIRONMENT VARIABLE + ENVIRONMENT VARIABLES - The m17n library pays attention to these environment variables. + The m17n library pays attention to the following environment + variables. API NAMING CONVENTION - 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". + @@ -121,35 +151,140 @@ /***ja @addtogroup m17nIntro + @brief m17n ¥é¥¤¥Ö¥é¥ê ¥¤¥ó¥È¥í¥À¥¯¥·¥ç¥ó. + + @em API¤Î¥ì¥Ù¥ë + + m17n ¥é¥¤¥Ö¥é¥ê¤Î API ¤Ï°Ê²¼¤Î£´¼ï¤ËʬÎव¤ì¤Æ¤¤¤ë¡£ + +
    +
  1. ¥³¥¢ API + + M-text ¤ò°·¤¦¤¿¤á¤Î´ðËÜŪ¤Ê¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£ + ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï + .h> ¤ò include ¤·¡¢ -lm17n-core + ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + +
  2. ¥·¥§¥ë API + + ʸ»ú¥×¥í¥Ñ¥Æ¥£¡¢Ê¸»ú½¸¹çÁàºî¡¢¥³¡¼¥ÉÊÑ´¹Åù¤Î¤¿¤á¤Î¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£ + ¤³¤ì¤é¤Î¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éɬÍפ˱þ¤¸¤Æ¿Íͤʥǡ¼¥¿¤ò¥í¡¼¥É¤¹¤ë¡£ + ¤³¤Î API ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï + .h> ¤ò include ¤·¡¢ -lm17n-core -lm17n + ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + + ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£ + +
  3. FLT API + + ʸ»úÎóɽ¼¨¤Ë @ref mdbFLT ¤òÍѤ¤¤ë¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API + ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï .h> + ¤ò include ¤·¡¢ -lm17n-core -lm17n-flt ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + + ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£ + +
  4. GUI API + + ¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¾å¤Ç M-text ¤òɽ¼¨¤·¤¿¤êÆþÎϤ·¤¿¤ê¤¹¤ë¤¿¤á¤Î + GUI ¥â¥¸¥å¡¼¥ë¤òÄ󶡤¹¤ë¡£¤³¤Î API + ¼«ÂΤϥ°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤È¤ÏÆÈΩ¤Ç¤¢¤ë¤¬¡¢ + ¿¤¯¤Î´Ø¿ô¤ÏÆÃÄê¤Î¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹ÍѤ˺îÀ®¤µ¤ì¤¿ + MFrame ¤ò°ú¿ô¤Ë¼è¤ë¡£ + ¸½»þÅÀ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤Ï¡¢¥Ì¥ë¥Ç¥Ð¥¤¥¹¡¢X + ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¡¢¤ª¤è¤Ó GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥Ç¡¼¥¿ + (gdImagePtr) ¤Ç¤¢¤ë¡£ + + ¥Ì¥ë¥Ç¥Ð¥¤¥¹¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ïɽ¼¨¤âÆþÎϤâ¤Ç¤­¤Ê¤¤¡£¤¿¤À¤· + mdraw_glyph_list () ¤Ê¤É¤Î´Ø¿ô¤Ï»ÈÍѲÄǽ¤Ç¤¢¤ë¡£ + + X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¤¹¤Ù¤Æ¤Î GUI API ¤¬»ÈÍѤǤ­¤ë¡£ + + GD ¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ì¡¼¥à¾å¤Ç¤Ï¡¢ÉÁ²èÍѤΠAPI + ¤Ï¤¹¤Ù¤Æ»ÈÍѤǤ­¤ë¤¬¡¢ÆþÎϤϤǤ­¤Ê¤¤¡£ + + ¤³¤Î API ¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï + .h> ¤ò include ¤·¡¢-lm17n-core -lm17n -lm17n-gui + ¤Ç¥ê¥ó¥¯¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + + ¤³¤Î API ¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥¢ API¡¢¥·¥§¥ë API¡¢¤ª¤è¤Ó FLT API + ¤â¼«Æ°Åª¤Ë»ÈÍѲÄǽ¤È¤Ê¤ë¡£ + +
  5. ¤½¤Î¾¤Î API + + ¥¨¥é¡¼½èÍý¡¢¥Ç¥Ð¥Ã¥°ÍѤΤ½¤Î¾¤Î´Ø¿ô¤òÄ󶡤¹¤ë¡£¤³¤Î API + ¤Ï¤½¤ì¤À¤±¤Ç¤Ï»ÈÍѤǤ­¤º¡¢¾åµ­¤Î¾¤Î API + ¤È¶¦¤Ë»È¤¦¡£ÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¾åµ­¤Î¤¤¤º¤ì¤«¤Îinclude + ¥Õ¥¡¥¤¥ë¤Ë²Ã¤¨¤Æ¡¢ .h> ¤òinclude + ¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + +
+ + @ref m17n-config "m17n-config(1)" Àá¤â»²¾È¡£ + + @em ´Ä¶­ÊÑ¿ô + + m17n ¥é¥¤¥Ö¥é¥ê¤Ï°Ê²¼¤Î´Ä¶­ÊÑ¿ô¤ò»²¾È¤¹¤ë¡£ + + + + @em API @em ¤Î̿̾µ¬Â§ + + m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢·¿¤ò export ¤¹¤ë¡£¤½¤ì¤é¤Ï 'm' + ¤Þ¤¿¤Ï 'M' ¤Î¤¢¤È¤Ë¥ª¥Ö¥¸¥§¥¯¥È̾ ("symbol"¡¢"plist" ¤Ê¤É) + ¤Þ¤¿¤Ï¥â¥¸¥å¡¼¥ë̾ (draw, input ¤Ê¤É) ¤ò³¤±¤¿¤â¤Î¤Ç¤¢¤ë¡£ + M-text ¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï "mmtext" ¤Ç¤Ï¤Ê¤¯¤Æ "mtext" + ¤Ç»Ï¤Þ¤ë¤³¤È¤ËÃí°Õ¡£ + + + + */ /*=*/ /*** @{ */ #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 @@ -160,8 +295,8 @@ of the m17n library. */ /***ja - ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç - ¥óÈÖ¹æ¤òÍ¿¤¨¤ë¡£ */ + ¥Þ¥¯¥í #M17NLIB_MINOR_VERSION ¤Ï m17n + ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÍ¿¤¨¤ë. */ #define M17NLIB_MINOR_VERSION @@ -172,8 +307,8 @@ of the m17n library. */ /***ja - ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤ò - Í¿¤¨¤ë¡£ */ + ¥Þ¥¯¥í #M17NLIB_PATCH_LEVEL ¤Ï m17n + ¥é¥¤¥Ö¥é¥ê¤Î¥Ñ¥Ã¥Á¥ì¥Ù¥ëÈÖ¹æ¤òÍ¿¤¨¤ë. */ #define M17NLIB_PATCH_LEVEL @@ -184,8 +319,8 @@ m17n library as a string. */ /***ja - ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤ò - C-string ¤Î·Á¤ÇÍ¿¤¨¤ë¡£ */ + ¥Þ¥¯¥í #M17NLIB_VERSION_NAME ¤Ï m17n + ¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó̾¤òʸ»úÎó¤È¤·¤ÆÍ¿¤¨¤ë. */ #define M17NLIB_VERSION_NAME @@ -194,20 +329,33 @@ /***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. - If the initialization was successful, the external variable @c - merror_code is set to 0. Otherwise it is set to -1. */ + 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. + + @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() @@ -217,12 +365,27 @@ @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 */ @@ -237,6 +400,7 @@ #include #include #include +#include #include #include #include @@ -244,8 +408,7 @@ #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,39 @@ 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; - -/* 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->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 *); + +/* 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,14 +481,66 @@ 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 (); +} /* External API */ @@ -331,24 +551,40 @@ 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_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 +594,106 @@ m17n_init_core (void) 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. @@ -423,12 +708,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 +751,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 +803,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 +824,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 +884,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) { @@ -603,37 +946,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 (). */ + exit (). */ /***ja @addtogroup m17nError ¥¨¥é¡¼½èÍý - @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý + @brief m17n ¥é¥¤¥Ö¥é¥ê¤Î¥¨¥é¡¼½èÍý. m17n ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤Ç¤Ï¡¢£²¤Ä¤Î¼ïÎà¤Î¥¨¥é¡¼¤¬µ¯¤³¤êÆÀ¤ë¡£ - °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë - ¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô + °ì¤Ä¤Ï°ú¿ô¤Î¥¨¥é¡¼¤Ç¤¢¤ë¡£ + ¥é¥¤¥Ö¥é¥ê¤Î´Ø¿ô¤¬ÂÅÅö¤Ç¤Ê¤¤°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¡¢¤½¤Î´Ø¿ô¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤¹¤ëÃͤòÊÖ¤·¡¢Æ±»þ¤Ë³°ÉôÊÑ¿ô #merror_code ¤Ë¥¼¥í¤Ç¤Ê¤¤À°¿ô¤ò¥»¥Ã¥È¤¹¤ë¡£ - ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â - ¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô @c - m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±¤Ë - exit () ¤ò¸Æ¤Ö¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£ + ¤â¤¦°ì¤Ä¤Î¼ïÎà¤Ï¥á¥â¥ê³äÅö¤Æ¥¨¥é¡¼¤Ç¤¢¤ë¡£ + ¥·¥¹¥Æ¥à¤¬É¬ÍפÊÎ̤Υá¥â¥ê¤ò³äÅö¤Æ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤Ï³°ÉôÊÑ¿ô + @c m17n_memory_full_handler ¤¬»Ø¤¹´Ø¿ô¤ò¸Æ¤Ö¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Ø¿ô + default_error_handle () ¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤³¤Î´Ø¿ô¤Ïñ¤Ë exit + () ¤ò¸Æ¤Ö¡£ */ /*** @{ */ /*=*/ -/***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 +986,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 +1008,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. + exit () 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 - ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë exit () ¤ò $ERR ¤ò°ú¿ô¤È¤·¤Æ - ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£ + ½é´üÀßÄê¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ïñ¤Ë exit () ¤ò $ERR + ¤ò°ú¿ô¤È¤·¤Æ¸Æ¤Ö´Ø¿ô¤ò»Ø¤·¤Æ¤¤¤ë¡£ - ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤ò - ŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£ */ + ¤³¤ì¤È¤Ï°Û¤Ê¤ë¥¨¥é¡¼½èÍý¤òɬÍפȤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊÑ¿ô¤òŬÅö¤Ê´Ø¿ô¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢ÌÜŪ¤òãÀ®¤Ç¤­¤ë¡£ */ void (*m17n_memory_full_handler) (enum MErrorCode err); @@ -719,11 +1066,9 @@ void (*m17n_memory_full_handler) (enum MErrorCode err);
  • MDEBUG_FONT -- If set to 1, print information about fonts being selected and opened. -
  • MDEBUG_FONT_FLT -- If set to 1, print information about which - command of Font Layout Table are being executed. - -
  • MDEBUG_FONT_OTF -- If set to 1, print information about which - feature of OpenType Layout Table are being executed. +
  • 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.
  • MDEBUG_INPUT -- If set to 1, print information about how an input method is running. @@ -741,6 +1086,55 @@ void (*m17n_memory_full_handler) (enum MErrorCode err); */ +/***ja + @addtogroup m17nDebug + @brief m17n ¥é¥¤¥Ö¥é¥ê¥æ¡¼¥¶¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à¥Ç¥Ð¥Ã¥°¥µ¥Ý¡¼¥È. + + m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢¤½¤Î¥æ¡¼¥¶¤¬¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á¤Ë¡¢°Ê²¼¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£ + +
      + +
    • ¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤Î¥×¥ê¥ó¥È¤òÀ©¸æ¤¹¤ë´Ä¶­ÊÑ¿ô¡£ + +
        + +
      • MDEBUG_INIT -- 1 ¤Ê¤é¤Ð¡¢M17N_INIT () + ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¥é¥¤¥Ö¥é¥ê¤Î½é´ü²½¤Ë´Ø¤¹¤ë¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_FINI -- 1 ¤Ê¤é¤Ð¡¢M17N_FINI () + ¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¡¢¤Þ¤À²òÊü¤µ¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_CHARSET -- 1 ¤Ê¤é¤Ð¡¢m17n + ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿Ê¸»ú¥»¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_CODING -- 1 ¤Ê¤é¤Ð¡¢m17n + ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥³¡¼¥É·Ï¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_DATABASE -- 1 ¤Ê¤é¤Ð¡¢m17n + ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¥í¡¼¥É¤µ¤ì¤¿¥Ç¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_FONT -- 1 ¤Ê¤é¤Ð¡¢ÁªÂò¤µ¤ì¤Æ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ä + ¤¤¤Æ¤Î¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_FLT -- 1¡¢2¡¢¤â¤·¤¯¤Ï 3 ¤Ê¤é¤Ð¡¢Font Layout Table ¤Î¤É + ¤Î¥³¥Þ¥ó¥É¤¬¼Â¹ÔÃ椫¤Ë¤Ä¤¤¤Æ¤Î¤ò¥×¥ê¥ó¥È¤¹¤ë¡£¤è¤êÂ礭¤ÊÃÍÄø¤è¤ê¾Ü + ¤·¤¤¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_INPUT -- 1 ¤Ê¤é¤Ð¡¢¼Â¹ÔÃæ¤ÎÆþÎϥ᥽¥Ã¥É¤Î¾õÂÖ¤ËÉÕ¤¤¤Æ¤Î + ¾ðÊó¤ò¥×¥ê¥ó¥È¤¹¤ë¡£ + +
      • MDEBUG_ALL -- 1 ¤Ê¤é¤Ð¡¢¾åµ­¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤ò 1 + ¤Ë¤·¤¿¤Î¤ÈƱ¤¸¸ú²Ì¤ò»ý¤Ä¡£ + +
      + +
    • ¼ï¡¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç¥×¥ê¥ó¥È¤¹¤ë´Ø¿ô¡£¾ÜºÙ¤Ï´Ø¿ô + mdebug_dump_XXXX () ¤ÎÀâÌÀ»²¾È¡£ + +
    • ¥¨¥é¡¼È¯À¸»þ¤Ë¸Æ¤Ð¤ì¤ë¥Õ¥Ã¥¯´Ø¿ô¡£mdebug_hook () ¤ÎÀâÌÀ»²¾È¡£ + +
    +*/ /*=*/ /*** @{ */ @@ -750,8 +1144,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 ()