*** empty log message ***
[m17n/m17n-lib.git] / src / textprop.c
index a077d68..4a39e9b 100644 (file)
@@ -1,5 +1,5 @@
 /* textprop.c -- text property module.
-   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
 
@@ -17,7 +17,7 @@
 
    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
     application programs can be simple.
 
     A text property consists of a @e key and @e values, where key is a
-    symbol and values are anything that can be cast to <tt>(void
-    *)</tt>.  Unlike other types of properties, a text property can
+    symbol and values are anything that can be cast to <tt>(void *)
+    </tt>.  Unlike other types of properties, a text property can
     have multiple values.  "The text property whose key is K" may be
     shortened to "K property".  */
 
-/***oldja
+/***ja
     @addtogroup m17nTextProperty
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÁàºî¤¹¤ë¤¿¤á¤Î´Ø¿ô
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÁàºî¤¹¤ë¤¿¤á¤Î´Ø¿ô.
 
     M-text Æâ¤Î³Æʸ»ú¤Ï¡¢@e ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ ¤È¸Æ¤Ð¤ì¤ë¥×¥í¥Ñ¥Æ¥£¤ò
-    »ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ë¤è¤Ã¤Æ¡¢¥Æ¥­¥¹¥È¤Î³ÆÉô°Ì¤Ë´Ø
-    ¤¹¤ëÍÍ¡¹¤Ê¾ðÊó¤ò M-text Æâ¤ËÊÝ»ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£¤½¤Î¤¿¤á¡¢¤½¤ì¤é
-    ¤Î¾ðÊó¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥àÆâ¤ÇÅý°ìŪ¤Ë°·¤¦¤³¤È¤¬¤Ç¤­¤ë¡£¤Þ
-    ¤¿¡¢M-text ¼«ÂΤ¬Ë­É٤ʾðÊó¤ò»ý¤Ä¤¿¤á¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à
-    Ãæ¤Î³Æ´Ø¿ô¤ò´ÊÁDz½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
+    »ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¡¢M-text ¤Î³ÆÉô°Ì¤ËÉղ䵤ì
+    ¤¿¤µ¤Þ¤¶¤Þ¤Ê¾ðÊó¤òÊÝ»ý¤·¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¤½¤ì¤é
+    ¤Î¾ðÊó¤òÅý°ìŪ¤Ë°·¤¦¤³¤È¤¬¤Ç¤­¤ë¡£M-text ¼«ÂΤ¬Ë­É٤ʾðÊó¤ò»ý¤Ä¤¿
+    ¤á¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥àÃæ¤Î´Ø¿ô¤ò´ÊÁDz½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
 
     ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï @e ¥­¡¼ ¤È @e ÃÍ ¤«¤é¤Ê¤ë¡£¥­¡¼¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢
     ¤ê¡¢ÃͤϠ<tt>(void *)</tt> ·¿¤Ë¥­¥ã¥¹¥È¤Ç¤­¤ë¤â¤Î¤Ê¤é²¿¤Ç¤â¤è¤¤¡£
-    Â¾¤Î¥¿¥¤¥×¤Î¥×¥í¥Ñ¥Æ¥£¤È°Û¤Ê¤ê¡¢Æ±°ì¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ÏÊ£¿ô¤ÎÃÍ
-    ¤ò»ý¤Ä¤³¤È¤¬µö¤µ¤ì¤ë¡£¡Ö@c Mxxx ¤È¤¤¤¦¥­¡¼¤ò»ý¤Ä¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¡×
-    ¤Î¤³¤È¤ò´Êñ¤Ë¡Öxxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£  */
+    Â¾¤Î¥¿¥¤¥×¤Î¥×¥í¥Ñ¥Æ¥£¤È°Û¤Ê¤ê¡¢°ì¤Ä¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬Ê£¿ô¤ÎÃÍ
+    ¤ò»ý¤Ä¤³¤È¤¬µö¤µ¤ì¤ë¡£¡Ö¥­¡¼¤¬ K ¤Ç¤¢¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¡×¤Î¤³¤È
+    ¤ò´Êñ¤Ë¡ÖK ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£  */
 
 /*=*/
 
@@ -501,7 +500,7 @@ maybe_merge_interval (MTextPlist *plist, MInterval *interval)
 }
 
 
-/*** Adjust start and end positions of intervals between HEAD and TAIL
+/** Adjust start and end positions of intervals between HEAD and TAIL
      (both inclusive) by diff.  Adjust also start and end positions
      of text properties belonging to those intervals.  */
 
@@ -513,7 +512,7 @@ adjust_intervals (MInterval *head, MInterval *tail, int diff)
 
   if (diff < 0)
     {
-      /* Adjust end poistions of properties starting before HEAD.  */
+      /* Adjust end positions of properties starting before HEAD.  */
       for (i = 0; i < head->nprops; i++)
        {
          prop = head->stack[i];
@@ -1022,20 +1021,19 @@ pop_all_properties (MTextPlist *plist, int from, int to)
 }
 
 
-/* Delete volatile text properties between FROM and TO.  If KEY is
-   Mnil, we are going to delete text, thus both strongly and weakly
-   volatile properties must be deleted.  Otherwise we are going to
-   modify a text property KEY, thus only strongly volatile properties
-   whose key is not KEY must be deleted.  */
+/* Delete volatile text properties between FROM and TO.  If DELETING
+   is nonzero, we are going to delete text, thus both strongly and
+   weakly volatile properties must be deleted.  Otherwise we are going
+   to modify a text property KEY, thus only strongly volatile
+   properties whose key is not KEY must be deleted.  */
 
 static void
-prepare_to_modify (MText *mt, int from, int to, MSymbol key)
+prepare_to_modify (MText *mt, int from, int to, MSymbol key, int deleting)
 {
   MTextPlist *plist = mt->plist, *prev = NULL;
   int mask_bits = MTEXTPROP_VOLATILE_STRONG;
-  int deleting = (key == Mnil) && (from < to);
 
-  if (key == Mnil)
+  if (deleting)
     mask_bits |= MTEXTPROP_VOLATILE_WEAK;
   while (plist)
     {
@@ -1129,16 +1127,16 @@ dump_interval (MInterval *interval, int indent)
   memset (prefix, 32, indent);
   prefix[indent] = 0;
 
-  fprintf (stderr, "(interval %d-%d (%d)", interval->start, interval->end,
-          interval->nprops);
+  fprintf (mdebug__output, "(interval %d-%d (%d)",
+          interval->start, interval->end, interval->nprops);
   for (i = 0; i < interval->nprops; i++)
-    fprintf (stderr, "\n%s (%d %d/%d %d-%d 0x%x)",
+    fprintf (mdebug__output, "\n%s (%d %d/%d %d-%d 0x%x)",
             prefix, i,
             interval->stack[i]->control.ref_count,
             interval->stack[i]->attach_count,
             interval->stack[i]->start, interval->stack[i]->end,
             (unsigned) interval->stack[i]->val);
-  fprintf (stderr, ")");
+  fprintf (mdebug__output, ")");
 }
 
 void
@@ -1149,31 +1147,33 @@ dump_textplist (MTextPlist *plist, int indent)
   memset (prefix, 32, indent);
   prefix[indent] = 0;
 
-  fprintf (stderr, "(properties");
+  fprintf (mdebug__output, "(properties");
   if (! plist)
-    fprintf (stderr, ")\n");
+    fprintf (mdebug__output, ")\n");
   else
     {
-      fprintf (stderr, "\n");
+      fprintf (mdebug__output, "\n");
       while (plist)
        {
          MInterval *interval = plist->head;
 
-         fprintf (stderr, "%s (%s", prefix, msymbol_name (plist->key));
+         fprintf (mdebug__output, "%s (%s", prefix, msymbol_name (plist->key));
          while (interval)
            {
-             fprintf (stderr, " (%d %d", interval->start, interval->end);
+             fprintf (mdebug__output, " (%d %d",
+                      interval->start, interval->end);
              if (interval->nprops > 0)
                {
                  int i;
 
                  for (i = 0; i < interval->nprops; i++)
-                   fprintf (stderr, " 0x%x", (int) interval->stack[i]->val);
+                   fprintf (mdebug__output, " 0x%x",
+                            (int) interval->stack[i]->val);
                }
-             fprintf (stderr, ")");
+             fprintf (mdebug__output, ")");
              interval = interval->next;
            }
-         fprintf (stderr, ")\n");
+         fprintf (mdebug__output, ")\n");
          xassert (check_plist (plist, 0) == 0);
          plist = plist->next;
        }
@@ -1186,7 +1186,7 @@ dump_textplist (MTextPlist *plist, int indent)
 int
 mtext__prop_init ()
 {
-  text_property_table.count = 0;
+  M17N_OBJECT_ADD_ARRAY (text_property_table, "Text property");
   Mtext_prop_serializer = msymbol ("text-prop-serializer");
   Mtext_prop_deserializer = msymbol ("text-prop-deserializer");
   return 0;
@@ -1204,7 +1204,6 @@ mtext__prop_fini ()
       pool = next;
     }
   interval_pool_root.next = NULL;  
-  mdebug__report_object ("Text property", &text_property_table);
 }
 
 
@@ -1261,7 +1260,7 @@ mtext__adjust_plist_for_delete (MText *mt, int pos, int len)
     }      
 
   to = pos + len;
-  prepare_to_modify (mt, pos, to, Mnil);
+  prepare_to_modify (mt, pos, to, Mnil, 1);
   for (plist = mt->plist; plist; plist = plist->next)
     {
       MInterval *interval = pop_all_properties (plist, pos, to);
@@ -1301,7 +1300,7 @@ mtext__adjust_plist_for_insert (MText *mt, int pos, int nchars,
       return;
     }
   if (pos > 0 && pos < mtext_nchars (mt))
-    prepare_to_modify (mt, pos, pos, Mnil);
+    prepare_to_modify (mt, pos, pos, Mnil, 0);
 
   for (pl_last = NULL, pl = mt->plist; pl; pl_last = pl, pl = pl->next)
     {
@@ -1430,6 +1429,56 @@ mtext__adjust_plist_for_insert (MText *mt, int pos, int nchars,
     }
 }
 
+/* len1 > 0 && len2 > 0 */
+
+void
+mtext__adjust_plist_for_change (MText *mt, int pos, int len1, int len2)
+{
+  int pos2 = pos + len1;
+
+  prepare_to_modify (mt, pos, pos2, Mnil, 0);
+
+  if (len1 < len2)
+    {
+      int diff = len2 - len1;
+      MTextPlist *plist;
+
+      for (plist = mt->plist; plist; plist = plist->next)
+       {
+         MInterval *head = find_interval (plist, pos2);
+         MInterval *tail = plist->tail;
+         MTextProperty *prop;
+         int i;
+
+         if (head)
+           {
+             if (head->start == pos2)
+               head = head->prev;
+             while (tail != head)
+               {
+                 for (i = 0; i < tail->nprops; i++)
+                   {
+                     prop = tail->stack[i];
+                     if (prop->start == tail->start)
+                       prop->start += diff, prop->end += diff;
+                   }
+                 tail->start += diff;
+                 tail->end += diff;
+                 tail = tail->prev;
+               }
+           }
+         for (i = 0; i < tail->nprops; i++)
+           tail->stack[i]->end += diff;
+         tail->end += diff;
+       }
+    }
+  else if (len1 > len2)
+    {
+      mtext__adjust_plist_for_delete (mt, pos + len2, len1 - len2);
+    }
+}
+
+
 /*** @} */
 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
 
@@ -1465,29 +1514,28 @@ mtext__adjust_plist_for_insert (MText *mt, int pos, int nchars,
     If you need to distinguish these two cases, use the
     mtext_get_prop_values () function instead.  */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î°ìÈÖ¾å¤ÎÃͤòÆÀ¤ë
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î°ìÈÖ¾å¤ÎÃͤòÆÀ¤ë.
 
-    ´Ø¿ô mtext_get_prop () ¤Ï¡¢M-text $MT Æâ¤Ç $POS ¤È¤¤¤¦°ÌÃ֤ˤ¢¤ëʸ
-    »ú¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤òõ¤¹¡£
+    ´Ø¿ô mtext_get_prop () ¤Ï¡¢M-text $MT Æâ¤Î°ÌÃÖ $POS ¤Ë¤¢¤ëʸ»ú¤Î¥Æ
+    ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤òõ¤¹¡£
 
     @return
-    ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ñ¥Æ¥£¤¬Â¸ºß¤¹¤ë¤Ê¤é¡¢mtext_get_prop () ¤Ï¤½¤ÎÃͤòÊÖ
-    ¤¹¡£Ãͤ¬Ê£¿ô¸ºß¤¹¤ë¤È¤­¤Ï¡¢°ìÈÖ¾å¤ÎÃͤòÊÖ¤¹¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð³°Éô
-    ÊÑ¿ô #merror_code ¤òÊѹ¹¤¹¤ë¤³¤È¤Ê¤¯ @c NULL ¤òÊÖ¤¹¡£
+    ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬¤ß¤Ä¤«¤ì¤Ð¡¢mtext_get_prop () ¤Ï¤½¤Î¥×¥í¥Ñ¥Æ¥£
+    ¤ÎÃͤòÊÖ¤¹¡£Ãͤ¬Ê£¿ô¸ºß¤¹¤ë¤È¤­¤Ï¡¢°ìÈÖ¾å¤ÎÃͤòÊÖ¤¹¡£¸«¤Ä¤«¤é¤Ê¤±
+    ¤ì¤Ð³°ÉôÊÑ¿ô #merror_code ¤òÊѹ¹¤¹¤ë¤³¤È¤Ê¤¯ @c NULL ¤òÊÖ¤¹¡£
 
-    ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï @c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë
-    ¥¨¥é¡¼ ¥³¡¼¥É¤òÀßÄꤹ¤ë¡£
+    ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç mtext_get_prop () ¤Ï @c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ
+    ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£
 
     @note ¥¨¥é¡¼¤Ê¤·¤Ç @c NULL ¤¬ÊÖ¤µ¤ì¤¿¾ì¹ç¤Ë¤ÏÆó¤Ä¤Î²ÄǽÀ­¤¬¤¢¤ë¡£
 
     @li $POS ¤Î°ÌÃÖ¤Îʸ»ú¤Ï $KEY ¤ò¥­¡¼¤È¤¹¤ë¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¡£
 
-    @li ¤½¤Îʸ»ú¤Ï $KEY ¤ò¥­¡¼¤È¤¹¤ë¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¤¬¡¢¤½¤ÎÃͤ¬ @c
-        NULL ¤Ç¤¢¤ë¡£
+    @li ¤½¤Îʸ»ú¤Ï¤½¤Î¤è¤¦¤Ê¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Á¡¢¤½¤ÎÃͤ¬ @c NULL ¤Ç¤¢¤ë¡£
 
     ¤³¤ÎÆó¤Ä¤ò¶èÊ̤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢´Ø¿ô mtext_get_prop_values ()
-    ¤ò»ÈÍѤ¹¤ë¤³¤È¡£
+    ¤òÂå¤ï¤ê¤Ë»ÈÍѤ¹¤ë¤³¤È¡£
 
      @latexonly \IPAlabel{mtext_get_prop} @endlatexonly  */
 
@@ -1521,7 +1569,7 @@ mtext_get_prop (MText *mt, int pos, MSymbol key)
 /*=*/
 
 /***en
-    @brief Get multiple values of a text property
+    @brief Get multiple values of a text property.
 
     The mtext_get_prop_values () function searches the character at
     $POS in M-text $MT for the property whose key is $KEY.  If such
@@ -1536,19 +1584,19 @@ mtext_get_prop (MText *mt, int pos, MSymbol key)
     0. If an error is detected, mtext_get_prop_values () returns -1 and
     assigns an error code to the external variable #merror_code.  */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊ£¿ôÆÀ¤ë
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊ£¿ô¸ÄÆÀ¤ë.
 
     ´Ø¿ô mtext_get_prop_values () ¤Ï¡¢M-text $MT Æâ¤Ç $POS ¤È¤¤¤¦°ÌÃÖ
     ¤Ë¤¢¤ëʸ»ú¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤òõ¤¹¡£¤â¤·¤½
-    ¤Î¤è¤¦¤Ê¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ì¤¬»ý¤ÄÃÍ(Ê£¿ô²Ä)¤ò $VALUES ¤Î
-    »Ø¤¹¥á¥â¥êÎΰè¤Ë³ÊǼ¤¹¤ë¡£$NUM ¤Ï³ÊǼ¤¹¤ëÃͤοô¤Î¾å¸Â¤Ç¤¢¤ë¡£
+    ¤Î¤è¤¦¤Ê¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ì¤¬»ý¤ÄÃÍ (Ê£¿ô²Ä) ¤ò $VALUES 
+    ¤Î»Ø¤¹¥á¥â¥êÎΰè¤Ë³ÊǼ¤¹¤ë¡£$NUM ¤Ï³ÊǼ¤¹¤ëÃͤοô¤Î¾å¸Â¤Ç¤¢¤ë¡£
 
     @return
     ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¡¢mtext_get_prop_values () ¤Ï¼ÂºÝ¤Ë¥á¥â¥ê¤Ë³ÊǼ¤µ
     ¤ì¤¿Ãͤοô¤òÊÖ¤¹¡£$POS ¤Î°ÌÃÖ¤Îʸ»ú¤¬ $KEY ¤ò¥­¡¼¤È¤¹¤ë¥×¥í¥Ñ¥Æ¥£
-    ¤ò»ý¤¿¤Ê¤±¤ì¤Ð 0 ¤òÊÖ¤¹¡£¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô 
-    #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£
+    ¤ò»ý¤¿¤Ê¤±¤ì¤Ð 0 ¤òÊÖ¤¹¡£¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï -1 ¤òÊÖ¤·¡¢³°Éô
+    ÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£
 
     @latexonly \IPAlabel{mtext_get_prop_values} @endlatexonly  */
 
@@ -1599,7 +1647,7 @@ mtext_get_prop_values (MText *mt, int pos, MSymbol key,
 /*=*/
 
 /***en
-    @brief Get list of text property keys at a position of an M-text.
+    @brief Get a list of text property keys at a position of an M-text.
 
     The mtext_get_prop_keys () function creates an array whose
     elements are the keys of text properties found at position $POS in
@@ -1608,20 +1656,19 @@ mtext_get_prop_values (MText *mt, int pos, MSymbol key,
     the array.
 
     @returns
-
     If the operation was successful, mtext_get_prop_keys () returns
     the length of the key list.  Otherwise it returns -1 and assigns
     an error code to the external variable #merror_code.
 
 */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Î¥ê¥¹¥È¤òÆÀ¤ë
+/***ja
+    @brief M-text ¤Î»ØÄꤷ¤¿°ÌÃ֤Υƥ­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Î¥ê¥¹¥È¤òÆÀ¤ë.
 
     ´Ø¿ô mtext_get_prop_keys () ¤Ï¡¢M-text $MT Æâ¤Ç $POS ¤Î°ÌÃ֤ˤ¢¤ë
-    Ê¸»ú¤¬»ý¤Ã¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤«¤é¤Ê¤ëÇÛÎó¤òºî¤ê¡¢
-    ¤½¤ÎÇÛÎó¤Î¥¢¥É¥ì¥¹¤ò *$KEYS ¤Ë¥»¥Ã¥È¤¹¤ë¡£¤³¤ÎÇÛÎó¤Î¤¿¤á¤Ë³ÎÊݤµ¤ì
-    ¤¿¥á¥â¥ê¤ò²òÊü¤¹¤ë¤Î¤Ï¥æ¡¼¥¶¤ÎÀÕǤ¤Ç¤¢¤ë¡£
+    ¤¹¤Ù¤Æ¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤òÍ×ÁǤȤ¹¤ëÇÛÎó¤òºî¤ê¡¢¤½¤ÎÇÛÎó¤Î
+    ¥¢¥É¥ì¥¹¤ò *$KEYS ¤ËÀßÄꤹ¤ë¡£¤³¤ÎÇÛÎó¤Î¤¿¤á¤Ë³ÎÊݤµ¤ì¤¿¥á¥â¥ê¤ò²ò
+    Êü¤¹¤ë¤Î¤Ï¥æ¡¼¥¶¤ÎÀÕǤ¤Ç¤¢¤ë¡£
 
     @return
     ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mtext_get_prop_keys () ¤ÏÆÀ¤é¤ì¤¿¥ê¥¹¥È¤ÎŤµ¤òÊÖ
@@ -1664,12 +1711,12 @@ mtext_get_prop_keys (MText *mt, int pos, MSymbol **keys)
 /*=*/
 
 /***en
-    @brief Set a text property
+    @brief Set a text property.
 
     The mtext_put_prop () function sets a text property to the
     characters between $FROM (inclusive) and $TO (exclusive) in M-text
     $MT.  $KEY and $VAL specify the key and the value of the text
-    property.
+    property.  With this function,
 
 @verbatim
                      FROM                   TO
@@ -1690,12 +1737,12 @@ PROP  :  <-- OLD_VAL-><-------- VAL -------><-- OLD_VAL-->
     Otherwise it returns -1 and assigns an error code to the external
     variable #merror_code.  */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ¤ë
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ¤ë.
 
     ´Ø¿ô mtext_put_prop () ¤Ï¡¢M-text $MT ¤Î $FROM ¡Ê´Þ¤Þ¤ì¤ë¡Ë¤«¤é 
     $TO ¡Ê´Þ¤Þ¤ì¤Ê¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤Ë¡¢¥­¡¼¤¬ $KEY ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¤è
-    ¤¦¤Ê¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥»¥Ã¥È¤¹¤ë¡£
+    ¤¦¤Ê¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ¤ë¡£¤³¤Î´Ø¿ô¤Ë¤è¤Ã¤Æ
 
 
 @verbatim
@@ -1736,7 +1783,7 @@ mtext_put_prop (MText *mt, int from, int to, MSymbol key, void *val)
 
   M_CHECK_RANGE (mt, from, to, -1, 0);
 
-  prepare_to_modify (mt, from, to, key);
+  prepare_to_modify (mt, from, to, key, 0);
   plist = get_plist_create (mt, key, 1);
   interval = pop_all_properties (plist, from, to);
   prop = new_text_property (mt, from, to, key, val, 0);
@@ -1753,7 +1800,7 @@ mtext_put_prop (MText *mt, int from, int to, MSymbol key, void *val)
 /*=*/
 
 /***en
-    @brief Set multiple text properties with the same key
+    @brief Set multiple text properties with the same key.
 
     The mtext_put_prop_values () function sets a text property to the
     characters between $FROM (inclusive) and $TO (exclusive) in M-text
@@ -1765,12 +1812,12 @@ mtext_put_prop (MText *mt, int from, int to, MSymbol key, void *val)
     0.  Otherwise it returns -1 and assigns an error code to the
     external variable #merror_code.  */
 
-/***oldja
-    @brief Æ±¤¸¥­¡¼¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÊ£¿ôÀßÄꤹ¤ë
+/***ja
+    @brief Æ±¤¸¥­¡¼¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÊ£¿ôÀßÄꤹ¤ë.
 
     ´Ø¿ô mtext_put_prop_values () ¤Ï¡¢M-Text $MT ¤Î$FROM ¡Ê´Þ¤Þ¤ì¤ë¡Ë
-    ¤«¤é $TO ¡Ê´Þ¤Þ¤ì¤Ê¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤Ë¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥»¥Ã¥È
-    ¤¹¤ë¡£¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ï$KEY¤Ë¤è¤Ã¤Æ¡¢ÃÍ(Ê£¿ô²Ä)¤Ï$VALUES 
+    ¤«¤é $TO ¡Ê´Þ¤Þ¤ì¤Ê¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤Ë¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ
+    ¤ë¡£¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ï $KEY ¤Ë¤è¤Ã¤Æ¡¢ÃÍ(Ê£¿ô²Ä)¤Ï $VALUES 
     ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë¡£$NUM ¤ÏÀßÄꤵ¤ì¤ëÃͤθĿô¤Ç¤¢¤ë¡£
 
     @return
@@ -1797,7 +1844,7 @@ mtext_put_prop_values (MText *mt, int from, int to,
 
   M_CHECK_RANGE (mt, from, to, -1, 0);
 
-  prepare_to_modify (mt, from, to, key);
+  prepare_to_modify (mt, from, to, key, 0);
   plist = get_plist_create (mt, key, 1);
   interval = pop_all_properties (plist, from, to);
   if (num > 0)
@@ -1822,11 +1869,12 @@ mtext_put_prop_values (MText *mt, int from, int to,
 /*=*/
 
 /***en
-    @brief Push a text property
+    @brief Push a text property.
 
     The mtext_push_prop () function pushes a text property whose key
     is $KEY and value is $VAL to the characters between $FROM
-    (inclusive) and $TO (exclusive) in $MT.
+    (inclusive) and $TO (exclusive) in M-text $MT.  With this
+    function,
 
 @verbatim
                     FROM                    TO
@@ -1848,12 +1896,12 @@ PROP  :               <-------- VAL ------->
     Otherwise it returns -1 and assigns an error code to the external
     variable #merror_code.  */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥×¥Ã¥·¥å¤¹¤ë
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥×¥Ã¥·¥å¤¹¤ë.
 
     ´Ø¿ô mtext_push_prop () ¤Ï¡¢¥­¡¼¤¬ $KEY ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¥Æ¥­¥¹¥È
     ¥×¥í¥Ñ¥Æ¥£¤ò¡¢M-text $MT Ãæ¤Î $FROM ¡Ê´Þ¤Þ¤ì¤ë¡Ë¤«¤é $TO ¡Ê´Þ¤Þ¤ì¤Ê
-    ¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤Ë¥×¥Ã¥·¥å¤¹¤ë¡£
+    ¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤Ë¥×¥Ã¥·¥å¤¹¤ë¡£¤³¤Î´Ø¿ô¤Ë¤è¤Ã¤Æ
 
 @verbatim
                     FROM                    TO
@@ -1894,7 +1942,7 @@ mtext_push_prop (MText *mt, int from, int to,
 
   M_CHECK_RANGE (mt, from, to, -1, 0);
 
-  prepare_to_modify (mt, from, to, key);
+  prepare_to_modify (mt, from, to, key, 0);
   plist = get_plist_create (mt, key, 1);
 
   /* Find an interval that covers the position FROM.  */
@@ -1973,14 +2021,14 @@ mtext_push_prop (MText *mt, int from, int to,
 /*=*/
 
 /***en
-    @brief Pop a text property
+    @brief Pop a text property.
 
     The mtext_pop_prop () function removes the topmost text property
     whose key is $KEY from the characters between $FROM (inclusive)
     and and $TO (exclusive) in $MT.
 
     This function does nothing if characters in the region have no
-    such text property.
+    such text property. With this function,
 
 @verbatim
                     FROM                    TO
@@ -2001,15 +2049,15 @@ PROP  :  <--OLD_VAL-->|                     |<--OLD_VAL-->|
     Otherwise it returns -1 and assigns an error code to the external
     variable #merror_code.  */
 
-/***oldja
-    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥Ý¥Ã¥×¤¹¤ë
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥Ý¥Ã¥×¤¹¤ë.
 
     ´Ø¿ô mtext_pop_prop () ¤Ï¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î
     ¤¦¤Á°ìÈÖ¾å¤Î¤â¤Î¤ò¡¢M-text $MT ¤Î $FROM ¡Ê´Þ¤Þ¤ì¤ë¡Ë¤«¤é $TO¡Ê´Þ¤Þ
     ¤ì¤Ê¤¤¡Ë¤ÎÈϰϤÎʸ»ú¤«¤é¼è¤ê½ü¤¯¡£
 
     »ØÄêÈϰϤÎʸ»ú¤¬¤½¤Î¤è¤¦¤Ê¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¤Ê¤é¤Ð¡¢¤³¤Î´Ø¿ô¤Ï²¿
-    ¤â¤·¤Ê¤¤¡£
+    ¤â¤·¤Ê¤¤¡£¤³¤Î´Ø¿ô¤Ë¤è¤Ã¤Æ¡¢
 
 @verbatim
                     FROM                    TO
@@ -2059,7 +2107,7 @@ mtext_pop_prop (MText *mt, int from, int to, MSymbol key)
     /* No property to pop.  */
     return 0;
 
-  prepare_to_modify (mt, from, to, key);
+  prepare_to_modify (mt, from, to, key, 0);
 
   /* If the found interval starts before FROM and has value(s), divide
      it at FROM.  */
@@ -2138,17 +2186,17 @@ mtext_pop_prop (MText *mt, int from, int to, MSymbol key)
     returns -1 and assigns an error code to the external variable @c
     merror_code.  */
 
-/***oldja
+/***ja
     @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬Æ±¤¸Ãͤò¤È¤ëÈϰϤòÄ´¤Ù¤ë.
 
-    ´Ø¿ô mtext_prop_range () ¤Ï¡¢Ï¢Â³¤·¤¿Ê¸»ú¤¬Æ±¤¸¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò»ý¤Ã
-    ¤Æ¤¤¤ëÈϰϤòÄ´¤Ù¤ë¡£¤Þ¤º M-text $MT ¤Î $POS ¤Î°ÌÃ֤ˤ¢¤ëʸ»ú¤Î¥×¥í
-    ¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼ $KEY ¤Ç»ØÄꤵ¤ì¤¿¤â¤Î¤ÎÃͤò¸«¤Ä¤±¤ë¡£¤½¤·¤ÆÁ°¸å
-    ¤Îʸ»ú¤â$KEY ¤Î¥×¥í¥Ñ¥Æ¥£¤ËƱ¤¸Ãͤò¤â¤Ã¤Æ¤¤¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡£¸«
-    ¤Ä¤±¤¿ÈϰϤκǽé¤ÈºÇ¸å¤ò¡¢¤½¤ì¤¾¤ì $FROM ¤È $TO ¤ò¥Ý¥¤¥ó¥¿¤È¤¹¤ëÊÑ
-    ¿ô¤ËÊݸ¤¹¤ë¡£$FROM ¤ËÊݸ¤µ¤ì¤ëʸ»ú¤Î°ÌÃ֤ϸ«¤Ä¤±¤¿ÈϰϤ˴ޤޤì¤ë
-    ¤¬¡¢$TO ¤Ï´Þ¤Þ¤ì¤Ê¤¤¡£¡Ê$TO ¤ÎÁ°¤ÇƱ¤¸Ãͤò¤È¤ëÈϰϤϽª¤ï¤ë¡£¡Ë¤³¤Î
-    ÈÏ°Ï»ØÄê¤ÎÊýË¡¤Ï¡¢´Ø¿ô mtext_put_prop () ¤Ê¤É¤È¶¦Ä̤Τâ¤Î¤Ç¤¢¤ë¡£
+    ´Ø¿ô mtext_prop_range () ¤Ï¡¢»ØÄꤷ¤¿¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬Æ±¤¸
+    ¤Ç¤¢¤ëϢ³¤·¤¿Ê¸»ú¤ÎÈϰϤòÄ´¤Ù¤ë¡£¤Þ¤º M-text $MT ¤Î $POS ¤Î°ÌÃÖ¤Ë
+    ¤¢¤ëʸ»ú¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼ $KEY ¤Ç»ØÄꤵ¤ì¤¿¤â¤ÎÃͤò¸«¤Ä¤±
+    ¤ë¡£¤½¤·¤ÆÁ°¸å¤Îʸ»ú¤â $KEY ¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬Æ±¤¸¤Ç¤¢¤ë¤«¤É¤¦¤«¤ò
+    Ä´¤Ù¤ë¡£¸«¤Ä¤±¤¿ÈϰϤκǽé¤ÈºÇ¸å¤ò¡¢¤½¤ì¤¾¤ì $FROM ¤È $TO ¤Ë¥Ý¥¤¥ó
+    ¥È¤µ¤ì¤ëÊÑ¿ô¤ËÊݸ¤¹¤ë¡£$FROM ¤ËÊݸ¤µ¤ì¤ëʸ»ú¤Î°ÌÃ֤ϸ«¤Ä¤±¤¿ÈÏ°Ï
+    ¤Ë´Þ¤Þ¤ì¤ë¤¬¡¢$TO ¤Ï´Þ¤Þ¤ì¤Ê¤¤¡£¡Ê$TO ¤ÎÁ°¤ÇƱ¤¸Ãͤò¤È¤ëÈϰϤϽª¤ï
+    ¤ë¡£¡Ë¤³¤ÎÈÏ°Ï»ØÄêË¡¤Ï¡¢´Ø¿ô mtext_put_prop () ¤Ê¤É¤È¶¦Ä̤Ǥ¢¤ë¡£
 
     $DEEPER ¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð¡¢$KEY ¤È¤¤¤¦¥­¡¼¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á°ìÈÖ
     ¾å¤Î¤â¤Î¤À¤±¤Ç¤Ê¤¯¡¢¥¹¥¿¥Ã¥¯Ãæ¤Î¤¹¤Ù¤Æ¤Î¤â¤Î¤¬Èæ³Ó¤µ¤ì¤ë¡£
@@ -2233,12 +2281,22 @@ mtext_prop_range (MText *mt, MSymbol key, int pos,
     @brief Create a text property.
 
     The mtext_property () function returns a newly allocated text
-    property whose key is $KEY and value is $VAL.  The text created
+    property whose key is $KEY and value is $VAL.  The created text 
     property is not attached to any M-text, i.e. it is detached.
 
     $CONTROL_BITS must be 0 or logical OR of @c enum @c
     MTextPropertyControl.  */
 
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÀ¸À®¤¹¤ë.
+
+    ´Ø¿ô mtext_property () ¤Ï $KEY ¤ò¥­¡¼¡¢$VAL ¤òÃͤȤ¹¤ë¿·¤·¤¯³ä¤êÅö
+    ¤Æ¤é¤ì¤¿¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÊÖ¤¹¡£À¸À®¤·¤¿¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¤¤¤«
+    ¤Ê¤ë M-text ¤Ë¤âÉղ䵤ì¤Æ¤¤¤Ê¤¤¡¢¤¹¤Ê¤ï¤ÁʬΥ¤·¤Æ (detached) ¤¤¤ë¡£
+
+    $CONTROL_BITS ¤Ï 0 ¤Ç¤¢¤ë¤« @c enum @c MTextPropertyControl ¤ÎÏÀÍý 
+    OR ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£  */
+
 MTextProperty *
 mtext_property (MSymbol key, void *val, int control_bits)
 {
@@ -2252,6 +2310,13 @@ mtext_property (MSymbol key, void *val, int control_bits)
     text property $PROP is attached.  If $PROP is currently detached,
     NULL is returned.  */
 
+/***ja
+    @brief ¤¢¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä M-text ¤òÊÖ¤¹.
+
+    ´Ø¿ô mtext_property_mtext () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£$PROP ¤¬Éղäµ
+    ¤ì¤Æ¤¤¤ë M-text ¤òÊÖ¤¹¡£¤½¤Î»þÅÀ¤Ç $PROP ¤¬Ê¬Î¥¤·¤Æ¤¤¤ì¤Ð NULL ¤ò
+    ÊÖ¤¹¡£  */
+
 MText *
 mtext_property_mtext (MTextProperty *prop)
 {
@@ -2264,6 +2329,12 @@ mtext_property_mtext (MTextProperty *prop)
     The mtext_property_key () function returns the key (symbol) of
     text property $PROP.  */
 
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤òÊÖ¤¹.
+
+    ´Ø¿ô mtext_property_key () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤Î¥­¡¼¡Ê¥·
+    ¥ó¥Ü¥ë¡Ë¤òÊÖ¤¹¡£  */
+
 MSymbol
 mtext_property_key (MTextProperty *prop)
 {
@@ -2276,6 +2347,12 @@ mtext_property_key (MTextProperty *prop)
     The mtext_property_value () function returns the value of text
     property $PROP.  */
 
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
+
+    ´Ø¿ô mtext_property_value () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤ÎÃͤòÊÖ
+    ¤¹¡£  */
+
 void *
 mtext_property_value (MTextProperty *prop)
 {
@@ -2290,6 +2367,13 @@ mtext_property_value (MTextProperty *prop)
     of an M-text where $PROP begins.  If $PROP is detached, it returns
     -1.  */
 
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î³«»Ï°ÌÃÖ¤òÊÖ¤¹.
+
+    ´Ø¿ô mtext_property_start () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤Î³«»Ï°Ì
+    ÃÖ¤òÊÖ¤¹¡£³«»Ï°ÌÃ֤ȤϠM-text Ãæ¤Ç $PROP ¤¬»Ï¤Þ¤ëʸ»ú°ÌÃ֤Ǥ¢¤ë¡£
+    $PROP ¤¬Ê¬Î¥¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢-1 ¤òÊÖ¤¹¡£  */
+
 int
 mtext_property_start (MTextProperty *prop)
 {
@@ -2304,6 +2388,13 @@ mtext_property_start (MTextProperty *prop)
     an M-text where $PROP ends.  If $PROP is detached, it returns
     -1.  */
 
+/***ja
+    @brief ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î½ªÎ»°ÌÃÖ¤òÊÖ¤¹.
+
+    ´Ø¿ô mtext_property_end () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤Î½ªÎ»°ÌÃÖ
+    ¤òÊÖ¤¹¡£½ªÎ»°ÌÃ֤ȤϠM-text Ãæ¤Ç $PROP ¤¬½ª¤ëʸ»ú°ÌÃ֤Ǥ¢¤ë¡£$PROP 
+    ¤¬Ê¬Î¥¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢-1 ¤òÊÖ¤¹¡£  */
+
 int
 mtext_property_end (MTextProperty *prop)
 {
@@ -2313,8 +2404,8 @@ mtext_property_end (MTextProperty *prop)
 /***en
     @brief Get the topmost text property.
 
-    The mtext_get_property () function searches the character at $POS
-    in M-text $MT for a text property whose key is $KEY.
+    The mtext_get_property () function searches the character at
+    position $POS in M-text $MT for a text property whose key is $KEY.
 
     @return
     If a text property is found, mtext_get_property () returns it.  If
@@ -2325,6 +2416,20 @@ mtext_property_end (MTextProperty *prop)
     If an error is detected, mtext_get_property () returns @c NULL and
     assigns an error code to the external variable #merror_code.  */
 
+/***ja
+    @brief °ìÈÖ¾å¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÆÀ¤ë.
+
+    ´Ø¿ô mtext_get_property () ¤Ï M-text $MT ¤Î°ÌÃÖ $POS ¤Îʸ»ú¤¬¥­¡¼
+    ¤¬ $KEY ¤Ç¤¢¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡£
+
+    @return 
+    ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤ì¤Ð¡¢mtext_get_property () ¤Ï¤½¤ì¤òÊÖ¤¹¡£
+    Ê£¿ô¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢°ìÈÖ¾å¤Î¤â¤Î¤òÊÖ¤¹¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð¡¢³°ÉôÊÑ¿ô 
+    #merror_code ¤òÊѤ¨¤ë¤³¤È¤Ê¤¯ @c NULL ¤òÊÖ¤¹¡£
+
+    ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç mtext_get_property () ¤Ï @c NULL ¤òÊÖ¤·¡¢³°
+    ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£    */
+
 MTextProperty *
 mtext_get_property (MText *mt, int pos, MSymbol key)
 {
@@ -2359,6 +2464,21 @@ mtext_get_property (MText *mt, int pos, MSymbol key)
     is 0. If an error is detected, mtext_get_properties () returns -1
     and assigns an error code to the external variable #merror_code.  */
 
+/***ja
+    @brief Ê£¿ô¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÆÀ¤ë.
+
+    ´Ø¿ô mtext_get_properties () ¤Ï M-text $MT ¤Î°ÌÃÖ $POS ¤Îʸ»ú¤¬¥­¡¼
+    ¤¬ $KEY ¤Ç¤¢¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡£¤½¤Î¤è¤¦¤Ê
+    ¥×¥í¥Ñ¥Æ¥£¤¬¤ß¤Ä¤«¤ì¤Ð¡¢$PROPS ¤¬»Ø¤¹¥á¥â¥êÎΰè¤ËÊݸ¤¹¤ë¡£$NUM ¤Ï
+    Êݸ¤µ¤ì¤ë¥×¥í¥Ñ¥Æ¥£¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
+
+    @return 
+    ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¡¢mtext_get_properties () ¤Ï¼ÂºÝ¤ËÊݸ¤·¤¿¥×¥í¥Ñ¥Æ¥£
+    ¤Î¿ô¤òÊÖ¤¹¡£$POS ¤Î°ÌÃÖ¤Îʸ»ú¤¬¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿
+    ¤Ê¤±¤ì¤Ð¡¢0 ¤¬Ê֤롣¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
+    mtext_get_properties () ¤Ï -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼
+    ¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
+
 int
 mtext_get_properties (MText *mt, int pos, MSymbol key,
                      MTextProperty **props, int num)
@@ -2408,6 +2528,18 @@ mtext_get_properties (MText *mt, int pos, MSymbol key,
     0.  Otherwise it returns -1 and assigns an error code to the
     external variable #merror_code.  */
 
+/***ja
+    @brief  M-text¤Ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÉղ乤ë.
+
+    ´Ø¿ô mtext_attach_property () ¤Ï¡¢M-text $MT ¤Î $FROM ¤«¤é $TO ¤Þ
+    ¤Ç¤ÎÎΰè¤Ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤òÉղ乤롣¤â¤· $PROP ¤¬´û¤Ë
+    M-text ¤ËÉղ䵤ì¤Æ¤¤¤ì¤Ð¡¢$MT ¤ËÉղ乤ëÁ°¤ËʬΥ¤µ¤ì¤ë¡£
+
+    @return 
+    ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢mtext_attach_property () ¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±
+    ¤ì¤Ð -1 ¤òÊÖ¤·¤Æ³°ÉôÊÑ¿ô#merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£      */
+
+
 int
 mtext_attach_property (MText *mt, int from, int to, MTextProperty *prop)
 {     
@@ -2419,7 +2551,7 @@ mtext_attach_property (MText *mt, int from, int to, MTextProperty *prop)
   M17N_OBJECT_REF (prop);
   if (prop->mt)
     mtext_detach_property (prop);
-  prepare_to_modify (mt, from, to, prop->key);
+  prepare_to_modify (mt, from, to, prop->key, 0);
   plist = get_plist_create (mt, prop->key, 1);
   xassert (check_plist (plist, 0) == 0);
   interval = pop_all_properties (plist, from, to);
@@ -2447,6 +2579,14 @@ mtext_attach_property (MText *mt, int from, int to, MTextProperty *prop)
     @return
     This function always returns 0.  */
 
+/***ja
+    @brief  M-text ¤«¤é¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òʬΥ¤¹¤ë.
+
+    ´Ø¿ô mtext_detach_property () ¤Ï¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤òʬΥ¤¹¤ë¡£
+
+    @return
+    ¤³¤Î´Ø¿ô¤Ï¾ï¤Ë 0 ¤òÊÖ¤¹¡£  */
+
 int
 mtext_detach_property (MTextProperty *prop)
 {
@@ -2455,7 +2595,7 @@ mtext_detach_property (MTextProperty *prop)
 
   if (! prop->mt)
     return 0;
-  prepare_to_modify (prop->mt, start, end, prop->key);
+  prepare_to_modify (prop->mt, start, end, prop->key, 0);
   plist = get_plist_create (prop->mt, prop->key, 0);
   xassert (plist);
   detach_property (plist, prop, NULL);
@@ -2465,14 +2605,27 @@ mtext_detach_property (MTextProperty *prop)
 /***en
     @brief Push a text property onto an M-text.
 
-    The mtext_push_property () function attaches text property $PROP on
-    M-text MT by the "push" manner.
+    The mtext_push_property () function pushes text property $PROP to
+    the characters between $FROM (inclusive) and $TO (exclusive) in
+    M-text $MT.
 
     @return
     If the operation was successful, mtext_push_property () returns
     0.  Otherwise it returns -1 and assigns an error code to the
     external variable #merror_code.  */
 
+/***ja
+    @brief M-text ¤Ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥×¥Ã¥·¥å¤¹¤ë.
+
+    ´Ø¿ô mtext_push_property () ¤Ï¡¢¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ $PROP ¤ò¡¢
+    M-text $MT Ãæ¤Î $FROM ¡Ê´Þ¤Þ¤ì¤ë¡Ë¤«¤é $TO ¡Ê´Þ¤Þ¤ì¤Ê¤¤¡Ë¤ÎÈϰϤÎ
+    Ê¸»ú¤Ë¥×¥Ã¥·¥å¤¹¤ë¡£
+
+    @return
+    ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢mtext_push_property () ¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±
+    ¤ì¤Ð -1 ¤òÊÖ¤·¤Æ³°ÉôÊÑ¿ô#merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£      */
+
+
 int
 mtext_push_property (MText *mt, int from, int to, MTextProperty *prop)
 {
@@ -2485,7 +2638,7 @@ mtext_push_property (MText *mt, int from, int to, MTextProperty *prop)
   M17N_OBJECT_REF (prop);
   if (prop->mt)
     mtext_detach_property (prop);
-  prepare_to_modify (mt, from, to, prop->key);
+  prepare_to_modify (mt, from, to, prop->key, 0);
   plist = get_plist_create (mt, prop->key, 1);
   prop->mt = mt;
   prop->start = from;
@@ -2569,7 +2722,20 @@ mtext_push_property (MText *mt, int from, int to, MTextProperty *prop)
     property whose key is #Mtext_prop_serializer and value is a
     pointer to an appropriate serializer function.
 
-    @seealso Mtext_prop_serializer (), MTextPropSerializeFunc
+    @seealso
+    mtext_serialize (), #MTextPropSerializeFunc
+  */
+
+/***ja
+    @brief ¥·¥ê¥¢¥é¥¤¥¶´Ø¿ô¤ò»ØÄꤹ¤ë¥·¥ó¥Ü¥ë.
+
+    ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥·¥ê¥¢¥é¥¤¥º¤¹¤ë¤¿¤á¤Ë¤Ï¡¢¤½¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ
+    ¥Æ¥£ÍѤΥ·¥ê¥¢¥é¥¤¥¶´Ø¿ô¤òÍ¿¤¨¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¶ñÂÎŪ¤Ë¤Ï¡¢
+    #Mtext_prop_serializer ¤ò¥­¡¼¤È¤·¡¢Å¬Àڤʥ·¥ê¥¢¥é¥¤¥º´Ø¿ô¤Ø¤Î¥Ý¥¤
+    ¥ó¥¿¤òÃͤȤ¹¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ë¡£
+
+    @seealso
+    mtext_serialize (), #MTextPropSerializeFunc
   */
 MSymbol Mtext_prop_serializer;
 
@@ -2581,7 +2747,20 @@ MSymbol Mtext_prop_serializer;
     property whose key is #Mtext_prop_deserializer and value is a
     pointer to an appropriate deserializer function.
 
-    @seealso Mtext_prop_serializer (), MTextPropSerializeFunc
+    @seealso
+    mtext_deserialize (), #MTextPropSerializeFunc
+  */
+
+/***ja
+    @brief ¥Ç¥·¥ê¥¢¥é¥¤¥¶´Ø¿ô¤ò»ØÄꤹ¤ë¥·¥ó¥Ü¥ë.
+
+    ¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥Ç¥·¥ê¥¢¥é¥¤¥º¤¹¤ë¤¿¤á¤Ë¤Ï¡¢¤½¤Î¥Æ¥­¥¹¥È¥×¥í
+    ¥Ñ¥Æ¥£ÍѤΥǥ·¥ê¥¢¥é¥¤¥¶´Ø¿ô¤òÍ¿¤¨¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¶ñÂÎŪ¤Ë¤Ï¡¢
+    #Mtext_prop_deserializer ¤ò¥­¡¼¤È¤·¡¢Å¬Àڤʥǥ·¥ê¥¢¥é¥¤¥º´Ø¿ô¤Ø¤Î
+    ¥Ý¥¤¥ó¥¿¤òÃͤȤ¹¤ë¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ë¡£
+
+    @seealso
+    mtext_deserialize (), #MTextPropSerializeFunc
   */
 MSymbol Mtext_prop_deserializer;
 
@@ -2589,13 +2768,15 @@ MSymbol Mtext_prop_deserializer;
     @brief Serialize text properties in an M-text.
 
     The mtext_serialize () function serializes the text between $FROM
-    and $TO in M-text $MT.  The serialized result is an M-text in the
+    and $TO in M-text $MT.  The serialized result is an M-text in a
     form of XML.  $PROPERTY_LIST limits the text properties to be
-    serialized.  If a symbol 1) appears as the value of an element in
-    $PROPERTY_LIST (the key must be @c Mt ) and 2) has the symbol
-    property #Mtext_prop_serializer, a text property having that
-    symbol as its key is turned into the "property" element in the
-    resulting XML representation.
+    serialized. Only those text properties whose key 
+
+    @li appears as the value of an element in $PROPERTY_LIST, and
+    @li has the symbol property #Mtext_prop_serializer
+
+    are serialized as a "property" element in the resulting XML
+    representation.
 
     The DTD of the generated XML is as follows:
 
@@ -2621,7 +2802,47 @@ MSymbol Mtext_prop_deserializer;
     error code to the external variable #merror_code.
 
     @seealso
-    mtext_deserialize (), Mtext_prop_serializer  */
+    mtext_deserialize (), #Mtext_prop_serializer  */
+
+/***ja
+    @brief M-text Ãæ¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥·¥ê¥¢¥é¥¤¥º¤¹¤ë.
+
+    ´Ø¿ô mtext_serialize () ¤Ï M-text $MT ¤Î $FROM ¤«¤é $TO ¤Þ¤Ç¤Î¥Æ¥­
+    ¥¹¥È¤ò¥·¥ê¥¢¥é¥¤¥º¤¹¤ë¡£¥·¥ê¥¢¥é¥¤¥º¤·¤¿·ë²Ì¤Ï XML ·Á¼°¤Î M-text ¤Ç
+    ¤¢¤ë¡£ $PROPERTY_LIST ¤Ï¥·¥ê¥¢¥é¥¤¥º¤µ¤ì¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¸ÂÄê
+    ¤¹¤ë¡£ÂоݤȤʤë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¡¢¤½¤Î¥­¡¼¤¬
+
+    @li $PROPERTY_LIST ¤ÎÍ×ÁǤÎÃͤȤ·¤Æ¸½¤ï¤ì¡¢¤«¤Ä
+    @li ¥·¥ó¥Ü¥ë¥×¥í¥Ñ¥Æ¥£ #Mtext_prop_serializer ¤ò»ý¤Ä
+    
+    ¤â¤Î¤Î¤ß¤Ç¤¢¤ë¡£¤³¤Î¾ò·ï¤òËþ¤¿¤¹¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¡¢À¸À®¤µ¤ì¤ë 
+    XML É½¸½Ãæ¤Ç "property" Í×ÁǤ˥·¥ê¥¢¥é¥¤¥º¤µ¤ì¤ë¡£
+
+    À¸À®¤µ¤ì¤ë XML ¤Î DTD ¤Ï°Ê²¼¤ÎÄ̤ê:
+
+@verbatim
+<!DOCTYPE mtext [
+  <!ELEMENT mtext (property*,body+)>
+  <!ELEMENT property EMPTY>
+  <!ELEMENT body (#PCDATA)>
+  <!ATTLIST property key CDATA #REQUIRED>
+  <!ATTLIST property value CDATA #REQUIRED>
+  <!ATTLIST property from CDATA #REQUIRED>
+  <!ATTLIST property to CDATA #REQUIRED>
+  <!ATTLIST property control CDATA #REQUIRED>
+ ]>
+@endverbatim
+
+    ¤³¤Î´Ø¿ô¤Ï libxml2 ¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é¥ê¤¬libxml2 
+    Ìµ¤·¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î´Ø¿ô¤Ï¾ï¤Ë¼ºÇÔ¤¹¤ë¡£
+
+    @return 
+    ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢mtext_serialize () ¤Ï XML ·Á¼°¤Ç M-text ¤òÊÖ¤¹¡£
+    ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤·¤Æ³°ÉôÊÑ¿ô#merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É
+    ¤òÀßÄꤹ¤ë¡£
+
+    @seealso
+    mtext_deserialize (), #Mtext_prop_serializer  */
 
 MText *
 mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
@@ -2636,6 +2857,11 @@ mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
   int n;
 
   M_CHECK_RANGE (mt, from, to, NULL, NULL);
+  if (mt->format != MTEXT_FORMAT_US_ASCII
+      && mt->format != MTEXT_FORMAT_UTF_8)
+    mtext__adjust_format (mt, MTEXT_FORMAT_UTF_8);
+  if (MTEXT_DATA (mt)[mtext_nbytes (mt)] != 0)
+    MTEXT_DATA (mt)[mtext_nbytes (mt)] = 0;
   doc = xmlParseMemory (XML_TEMPLATE, strlen (XML_TEMPLATE) + 1);
   node = xmlDocGetRootElement (doc);
 
@@ -2644,7 +2870,8 @@ mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
     {
       MSymbol key = MPLIST_VAL (pl);
 
-      func = (MTextPropSerializeFunc) msymbol_get (key, Mtext_prop_serializer);
+      func = ((MTextPropSerializeFunc)
+             msymbol_get_func (key, Mtext_prop_serializer));
       if (func)
        extract_text_properties (mt, from, to, key, plist);
     }
@@ -2657,13 +2884,13 @@ mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
       MPlist *serialized_plist;
       xmlNodePtr child;
 
-      func = (MTextPropSerializeFunc) msymbol_get (prop->key,
-                                                  Mtext_prop_serializer);
+      func = ((MTextPropSerializeFunc)
+             msymbol_get_func (prop->key, Mtext_prop_serializer));
       serialized_plist = (func) (prop->val);
       if (! serialized_plist)
        continue;
       mtext_reset (work);
-      mplist__serialize (work, serialized_plist);
+      mplist__serialize (work, serialized_plist, 0);
       child = xmlNewChild (node, NULL, (xmlChar *) "property", NULL);
       xmlSetProp (child, (xmlChar *) "key",
                  (xmlChar *) MSYMBOL_NAME (prop->key));
@@ -2710,7 +2937,7 @@ mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
     @brief Deserialize text properties in an M-text.
 
     The mtext_deserialize () function deserializes M-text $MT.  $MT
-    must be an XML having the followng DTD.
+    must be an XML having the following DTD.
 
 @verbatim
 <!DOCTYPE mtext [
@@ -2734,7 +2961,37 @@ mtext_serialize (MText *mt, int from, int to, MPlist *property_list)
     code to the external variable #merror_code.
 
     @seealso
-    mtext_serialize (), Mtext_prop_deserializer  */
+    mtext_serialize (), #Mtext_prop_deserializer  */
+
+/***ja
+    @brief M-text Ãæ¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò¥Ç¥·¥ê¥¢¥é¥¤¥º¤¹¤ë.
+
+    ´Ø¿ô mtext_deserialize () ¤Ï M-text $MT ¤ò¥Ç¥·¥ê¥¢¥é¥¤¥º¤¹¤ë¡£$MT
+    ¤Ï¼¡¤Î DTD ¤ò»ý¤Ä XML ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+@verbatim
+<!DOCTYPE mtext [
+  <!ELEMENT mtext (property*,body+)>
+  <!ELEMENT property EMPTY>
+  <!ELEMENT body (#PCDATA)>
+  <!ATTLIST property key CDATA #REQUIRED>
+  <!ATTLIST property value CDATA #REQUIRED>
+  <!ATTLIST property from CDATA #REQUIRED>
+  <!ATTLIST property to CDATA #REQUIRED>
+  <!ATTLIST property control CDATA #REQUIRED>
+ ]>
+@endverbatim
+
+    ¤³¤Î´Ø¿ô¤Ï libxml2 ¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤¹¤ë¡£m17n ¥é¥¤¥Ö¥é¥ê¤¬libxml2 
+    Ìµ¤·¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î´Ø¿ô¤Ï¾ï¤Ë¼ºÇÔ¤¹¤ë¡£
+
+    @return 
+    ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢mtext_serialize () ¤ÏÆÀ¤é¤ì¤¿ M-text ¤ò
+    ÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤·¤Æ³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼
+    ¥³¡¼¥É¤òÀßÄꤹ¤ë¡£
+
+    @seealso
+    mtext_serialize (), #Mtext_prop_deserializer  */
 
 MText *
 mtext_deserialize (MText *mt)
@@ -2809,7 +3066,7 @@ mtext_deserialize (MText *mt)
 
        key = msymbol ((char *) key_str);
        func = ((MTextPropDeserializeFunc)
-               msymbol_get (key, Mtext_prop_deserializer));
+               msymbol_get_func (key, Mtext_prop_deserializer));
        if (! func)
          continue;
        plist = mplist__from_string (val_str, strlen ((char *) val_str));