*** empty log message ***
[m17n/m17n-lib.git] / src / textprop.c
index e2abb67..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
@@ -1127,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
@@ -1147,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;
        }
@@ -1444,7 +1446,7 @@ mtext__adjust_plist_for_change (MText *mt, int pos, int len1, int len2)
       for (plist = mt->plist; plist; plist = plist->next)
        {
          MInterval *head = find_interval (plist, pos2);
-         MInterval *tail = mt->plist->tail;
+         MInterval *tail = plist->tail;
          MTextProperty *prop;
          int i;
 
@@ -2855,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);
 
@@ -2863,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);
     }
@@ -2876,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));
@@ -2929,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 [
@@ -3058,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));