1 /* plist.c -- plist module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 @brief Property List objects and API for them.
28 A @e property @e list (or @e plist for short) is a list of zero or
29 more properties. A property consists of a @e key and a @e value,
30 where key is a symbol and value is anything that can be cast to
33 If the key of a property is a @e managing @e key, its @e value is
34 a @e managed @e object. A property list itself is a managed
39 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤È¤½¤ì¤Ë´Ø¤¹¤ë API.
41 @e ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È (¤Þ¤¿¤Ï @e plist) ¤Ï 0
42 ¸Ä°Ê¾å¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥ê¥¹¥È¤Ç¤¢¤ë¡£¥×¥í¥Ñ¥Æ¥£¤Ï @e ¥¡¼ ¤È @e ÃÍ
43 ¤«¤é¤Ê¤ë¡£¥¡¼¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃÍ¤Ï <tt>(void *)</tt>
44 ¤Ë¥¥ã¥¹¥È¤Ç¤¤ë¤â¤Î¤Ê¤é¤Ð²¿¤Ç¤âÎɤ¤¡£
46 ¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤¬ @e ´ÉÍý¥¡¼ ¤Ê¤é¤Ð¡¢¤½¤Î @e ÃÍ ¤Ï @e ´ÉÍý²¼
48 ¤Ç¤¢¤ë¡£¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¼«ÂΤâ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£ */
52 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
53 /*** @addtogroup m17nInternal
61 #include "m17n-misc.h"
63 #include "character.h"
68 static M17NObjectArray plist_table;
70 /** Set PLIST to a newly allocated plist object. */
72 #define MPLIST_NEW(plist) \
74 M17N_OBJECT (plist, free_plist, MERROR_PLIST); \
75 M17N_OBJECT_REGISTER (plist_table, plist); \
79 /** Set the element of PLIST to KEY and VAL. If PLIST is an anchor,
80 append a new anchor. */
82 #define MPLIST_SET(plist, key, val) \
84 MPLIST_KEY (plist) = (key); \
85 MPLIST_VAL (plist) = (val); \
86 if (! (plist)->next) \
87 MPLIST_NEW ((plist)->next); \
91 /** Set the element of PLIST to KEY and VAL. PLIST must be an anchor.
92 Append a new anchor and set PLIST to that anchor. */
94 #define MPLIST_SET_ADVANCE(plist, key, val) \
96 MPLIST_KEY (plist) = (key); \
97 MPLIST_VAL (plist) = (val); \
98 MPLIST_NEW ((plist)->next); \
99 plist = (plist)->next; \
104 free_plist (void *object)
106 MPlist *plist = (MPlist *) object;
109 MPlist *next = plist->next;
111 if (MPLIST_KEY (plist) != Mnil && MPLIST_KEY (plist)->managing_key)
112 M17N_OBJECT_UNREF (MPLIST_VAL (plist));
113 M17N_OBJECT_UNREGISTER (plist_table, plist);
116 } while (plist && plist->control.ref_count == 1);
117 M17N_OBJECT_UNREF (plist);
122 /* Load a plist from a string. */
124 #define READ_CHUNK 0x10000
128 /* File pointer if the stream is associated with a file. Otherwise
132 unsigned char buffer[READ_CHUNK];
133 unsigned char *p, *pend;
137 get_byte (MStream *st)
141 if (! st->fp || st->eof)
143 n = fread (st->buffer, 1, READ_CHUNK, st->fp);
149 st->p = st->buffer + 1;
150 st->pend = st->buffer + n;
151 return st->buffer[0];
154 #define GETC(st) ((st)->p < (st)->pend ? *(st)->p++ : get_byte (st))
156 #define UNGETC(c, st) (--((st)->p))
158 /** Mapping table for reading a number. Hexadecimal chars
159 (0..9,A..F,a..F) are mapped to the corresponding numbers.
160 Apostrophe (code 39) is mapped to 254. All the other bytes are
162 unsigned char hex_mnemonic[256];
164 /** Mapping table for escaped characters. Mnemonic characters (e, b,
165 f, n, r, or t) that follows '\' are mapped to the corresponding
166 character code. All the other bytes are mapped to themselves. */
167 unsigned char escape_mnemonic[256];
170 /** Read an integer from the stream ST. It is assumed that we have
171 already read one character C. */
174 read_decimal (MStream *st, int c)
178 while (c >= '0' && c <= '9')
180 num = (num * 10) + (c - '0');
189 /** Read an unsigned from the stream ST. */
192 read_hexadesimal (MStream *st)
197 while ((c = GETC (st)) != EOF
198 && (n = hex_mnemonic[c]) < 16)
199 num = (num << 4) | n;
206 /** Read an M-text element from ST, and add it to LIST. Return a list
207 for the next element. */
209 #define READ_MTEXT_BUF_SIZE 256
212 read_mtext_element (MPlist *plist, MStream *st, int skip)
215 int chars[READ_MTEXT_BUF_SIZE];
216 unsigned char bytes[sizeof (int) * READ_MTEXT_BUF_SIZE];
218 unsigned char *bytes = buffer.bytes;
219 int nbytes = sizeof (int) * READ_MTEXT_BUF_SIZE;
225 while ((c = GETC (st)) != EOF && c != '"')
236 if (c == 'x' || c == 'u')
240 c = read_hexadesimal (st);
248 c = escape_mnemonic[c];
253 if (is_char && ! chars)
255 chars = buffer.chars;
256 for (j = i - 1; j >= 0; j--)
258 nchars = READ_MTEXT_BUF_SIZE;
259 if (bytes != buffer.bytes)
268 if (chars == buffer.chars)
270 MTABLE_MALLOC (chars, nchars, MERROR_PLIST);
271 memcpy (chars, buffer.chars, sizeof (int) * i);
274 MTABLE_REALLOC (chars, nchars, MERROR_PLIST);
280 if (i + MAX_UTF8_CHAR_BYTES >= nbytes)
283 if (bytes == buffer.bytes)
285 MTABLE_MALLOC (bytes, nbytes, MERROR_PLIST);
286 memcpy (bytes, buffer.bytes, i);
289 MTABLE_REALLOC (bytes, nbytes, MERROR_PLIST);
302 mt = mtext__from_data (chars, i, MTEXT_FORMAT_UTF_32, 1);
303 if (chars != buffer.chars)
308 mt = mtext__from_data (bytes, i, MTEXT_FORMAT_UTF_8, 1);
309 if (bytes != buffer.bytes)
312 MPLIST_SET_ADVANCE (plist, Mtext, mt);
318 read_character (MStream *st, int c)
320 unsigned char buf[MAX_UTF8_CHAR_BYTES + 1];
321 int len = CHAR_BYTES_BY_HEAD (c);
325 for (i = 1; i < len; i++)
329 || (c & 0xC0) != 0x80)
334 c = STRING_CHAR_UTF8 (buf);
341 /** Read an integer element from ST, and add it to LIST. Return a
342 list for the next element. It is assumed that we have already
343 read the character C. */
346 read_integer_element (MPlist *plist, MStream *st, int c, int skip)
350 if (c == '0' || c == '#')
354 num = read_hexadesimal (st);
356 num = read_decimal (st, c);
365 if (c < 128 || ! CHAR_UNITS_BY_HEAD_UTF8 (c))
368 num = read_character (st, c);
375 else if (c < 128 || ! CHAR_UNITS_BY_HEAD_UTF8 (c))
376 num = escape_mnemonic[c];
378 num = read_character (st, c);
382 num = - read_decimal (st, GETC (st));
384 num = read_decimal (st, c);
387 MPLIST_SET_ADVANCE (plist, Minteger, (void *) num);
391 /** Read a symbol element from ST, and add it to LIST. Return a list
392 for the next element. */
395 read_symbol_element (MPlist *plist, MStream *st, int skip)
397 unsigned char buffer[1024];
399 unsigned char *buf = buffer;
403 while ((c = GETC (st)) != EOF
405 && c != ')' && c != '(' && c != '"')
412 MTABLE_MALLOC (buf, bufsize, MERROR_PLIST);
413 memcpy (buf, buffer, i);
416 MTABLE_REALLOC (buf, bufsize, MERROR_PLIST);
423 c = escape_mnemonic[c];
434 MPLIST_SET_ADVANCE (plist, Msymbol, msymbol ((char *) buf));
441 /* Read an element of various type from stream ST, and add it to LIST.
442 Return a list for the next element. The element type is decided by
443 the first token character found as below:
446 '0'..'9', '-': integer
447 '?': integer representing character code
448 the other ASCII letters: symbol
450 If KEYS is not NULL, it is a plist contains target keys and stop
451 keys. In this caes, read only a plist whose key has value 1 in
452 KEYS, and return NULL when we encounter a plist whose key has value
453 0 in KEYS while skipping any other elements. */
456 read_element (MPlist *plist, MStream *st, MPlist *keys)
460 /* Skip separators and comments. */
463 while ((c = GETC (st)) != EOF && c <= ' ');
466 while ((c = GETC (st)) != EOF && c != '\n');
477 p = read_element (p, st, NULL);
478 if (keys && p && MPLIST_SYMBOL_P (pl))
480 if (MPLIST_TAIL_P (keys))
482 while ((p = read_element (p, st, NULL)));
483 MPLIST_SET_ADVANCE (plist, Mplist, pl);
490 MPLIST_FIND (p0, MPLIST_SYMBOL (pl));
491 if (! MPLIST_TAIL_P (p0) && ! MPLIST_VAL (p0))
493 M17N_OBJECT_UNREF (pl);
496 while ((p = read_element (p, st, NULL)));
497 if (! MPLIST_TAIL_P (p0))
499 MPLIST_SET_ADVANCE (plist, Mplist, pl);
503 M17N_OBJECT_UNREF (pl);
509 while ((p = read_element (p, st, NULL)));
510 MPLIST_SET_ADVANCE (plist, Mplist, pl);
515 return (read_mtext_element (plist, st, keys ? 1 : 0));
516 if ((c >= '0' && c <= '9') || c == '-' || c == '?' || c == '#')
517 return (read_integer_element (plist, st, c, keys ? 1 : 0));
518 if (c == EOF || c == ')')
521 return (read_symbol_element (plist, st, keys ? 1 : 0));
525 write_element (MText *mt, MPlist *plist)
527 if (MPLIST_SYMBOL_P (plist))
529 MSymbol sym = MPLIST_SYMBOL (plist);
533 MTEXT_CAT_ASCII (mt, "nil");
537 char *name = MSYMBOL_NAME (sym);
538 char *buf = alloca (MSYMBOL_NAMELEN (sym) * 2 + 1), *p = buf;
542 if (*name <= ' ' || *name == '"' || *name == ')' || *name == ')')
547 MTEXT_CAT_ASCII (mt, buf);
550 else if (MPLIST_INTEGER_P (plist))
552 int num = MPLIST_INTEGER (plist);
555 sprintf (buf, "%d", num);
556 MTEXT_CAT_ASCII (mt, buf);
558 else if (MPLIST_PLIST_P (plist))
562 plist = MPLIST_PLIST (plist);
563 mtext_cat_char (mt, '(');
564 MPLIST_DO (pl, plist)
567 mtext_cat_char (mt, ' ');
568 write_element (mt, pl);
570 mtext_cat_char (mt, ')');
572 else if (MPLIST_MTEXT_P (plist))
574 mtext_cat_char (mt, '"');
575 /* Not yet implemnted */
576 mtext_cat_char (mt, '"');
580 /* Support functions for mdebug_dump_plist. */
583 dump_string (char *str)
585 char *p = str, *pend = p + strlen (p), *new, *p1;
587 new = p1 = alloca ((pend - p) * 4 + 1);
592 sprintf (p1, "\\x%02X", (unsigned char) *p);
610 fprintf (stderr, "%s", new);
614 dump_plist_element (MPlist *plist, int indent)
616 char *prefix = (char *) alloca (indent + 1);
619 memset (prefix, 32, indent);
622 key = MPLIST_KEY (plist);
623 fprintf (stderr, "(%s(#%d) ", msymbol_name (MPLIST_KEY (plist)),
624 plist->control.ref_count);
626 dump_string (msymbol_name (MPLIST_SYMBOL (plist)));
627 else if (key == Mtext)
628 mdebug_dump_mtext (MPLIST_MTEXT (plist), indent, 0);
629 else if (key == Minteger)
630 fprintf (stderr, "%x", MPLIST_INTEGER (plist));
631 else if (key == Mstring)
632 fprintf (stderr, "\"%s\"", MPLIST_STRING (plist));
633 else if (MPLIST_NESTED_P (plist))
635 fprintf (stderr, "\n%s", prefix);
636 mdebug_dump_plist (MPLIST_PLIST (plist), indent);
639 fprintf (stderr, "0x%X", (unsigned) MPLIST_VAL (plist));
640 fprintf (stderr, ")");
650 M17N_OBJECT_ADD_ARRAY (plist_table, "Plist");
652 Minteger = msymbol ("integer");
653 Mplist = msymbol_as_managing_key ("plist");
654 Mtext = msymbol_as_managing_key ("mtext");
656 for (i = 0; i < 256; i++)
657 hex_mnemonic[i] = 255;
658 for (i = '0'; i <= '9'; i++)
659 hex_mnemonic[i] = i - '0';
660 for (i = 'A'; i <= 'F'; i++)
661 hex_mnemonic[i] = i - 'A' + 10;
662 for (i = 'a'; i <= 'f'; i++)
663 hex_mnemonic[i] = i - 'a' + 10;
664 for (i = 0; i < 256; i++)
665 escape_mnemonic[i] = i;
666 escape_mnemonic['e'] = 27;
667 escape_mnemonic['b'] = '\b';
668 escape_mnemonic['f'] = '\f';
669 escape_mnemonic['n'] = '\n';
670 escape_mnemonic['r'] = '\r';
671 escape_mnemonic['t'] = '\t';
672 escape_mnemonic['\\'] = '\\';
683 /* Parse this form of PLIST:
684 (symbol:KEY1 TYPE1:VAL1 symbol:KEY2 TYPE2:VAL2 ...)
685 and return a newly created plist of this form:
686 (KEY1:VAL1 KEY2:VAL2 ...) */
689 mplist__from_plist (MPlist *plist)
695 while (! MPLIST_TAIL_P (plist))
699 if (! MPLIST_SYMBOL_P (plist))
700 MERROR (MERROR_PLIST, NULL);
701 key = MPLIST_SYMBOL (plist);
702 plist = MPLIST_NEXT (plist);
703 type = MPLIST_KEY (plist);
704 if (type->managing_key && MPLIST_VAL (plist))
705 M17N_OBJECT_REF (MPLIST_VAL (plist));
706 MPLIST_SET_ADVANCE (p, key, MPLIST_VAL (plist));
707 plist = MPLIST_NEXT (plist);
712 /** Parse this form of PLIST:
713 ((symbol:KEY1 ANY:VAL1 ... ) (symbol:KEY2 ANY:VAL2 ...) ...)
714 and return a newly created plist of this form:
715 (KEY1:(ANY:VAL1 ...) KEY2:(ANY:VAL2 ...) ...)
716 ANY can be any type. */
719 mplist__from_alist (MPlist *plist)
725 MPLIST_DO (plist, plist)
729 if (! MPLIST_PLIST_P (plist))
730 MERROR (MERROR_PLIST, NULL);
731 elt = MPLIST_PLIST (plist);
732 if (! MPLIST_SYMBOL_P (elt))
733 MERROR (MERROR_PLIST, NULL);
734 MPLIST_SET_ADVANCE (p, MPLIST_SYMBOL (elt), MPLIST_NEXT (elt));
735 M17N_OBJECT_REF (MPLIST_NEXT (elt));
742 mplist__from_file (FILE *fp, MPlist *keys)
749 st.p = st.pend = st.buffer;
752 while ((pl = read_element (pl, &st, keys)));
757 /** Parse $STR of $N bytes and return a property list object. $FORMAT
758 must be either @c MTEXT_FORMAT_US_ASCII or @c MTEXT_FORMAT_UTF_8,
759 and controls how to produce @c STRING or @c M-TEXT in the
760 following definition.
762 The syntax of $STR is as follows.
764 PLIST ::= '(' ELEMENT * ')'
766 ELEMENT ::= SYMBOL | INTEGER | UNSIGNED | STRING | M-TEXT | PLIST
768 SYMBOL ::= ascii-character-sequence
770 INTEGER ::= '-' ? [ '0' | .. | '9' ]+
772 UNSIGNED ::= '0x' [ '0' | .. | '9' | 'A' | .. | 'F' | 'a' | .. | 'f' ]+
774 M-TEXT ::= '"' byte-sequence '"'
776 Each kind of @c ELEMENT is assigned one of these keys:
777 @c Msymbol, @c Mint, @c Munsigned, @c Mtext, @c Mplist
779 In an ascii-character-sequence, a backslush (\) is used as the escape
780 character, which means that, for instance, <tt>"abc\ def"</tt>
781 produces a symbol whose name is of length seven with the fourth
782 character being a space.
784 In a byte-sequence, "\r", "\n", "\e", and "\t" are replaced by CR,
785 NL, ESC, and TAB character respectively, "\xXX" are replaced by
786 byte 0xXX. After this replacement, the byte-sequence is decoded
787 into M-TEXT by $CODING. */
790 mplist__from_string (unsigned char *str, int n)
801 while ((pl = read_element (pl, &st, NULL)));
806 mplist__serialize (MText *mt, MPlist *plist)
810 MPLIST_DO (pl, plist)
813 mtext_cat_char (mt, ' ');
814 write_element (mt, pl);
820 @brief Concatenate two plists.
822 The mplist__conc () function concatenates plist $TAIL at the end of
823 plist $PLIST and return $PLIST. If $TAIL is empty, return $PLIST
824 without modifying it. */
827 mplist__conc (MPlist *plist, MPlist *tail)
831 if (MPLIST_TAIL_P (tail))
833 MPLIST_DO (pl, plist);
834 MPLIST_KEY (pl) = MPLIST_KEY (tail);
835 MPLIST_VAL (pl) = MPLIST_VAL (tail);
836 if (MPLIST_KEY (pl)->managing_key)
837 M17N_OBJECT_REF (MPLIST_VAL (pl));
838 tail = MPLIST_NEXT (tail);
839 MPLIST_NEXT (pl) = tail;
840 M17N_OBJECT_REF (tail);
846 @brief Discard a property at the beginning of a property list.
848 The mplist__pop_unref () function removes a property at the
849 beginning of property list $PLIST, and if the property value is a
850 managed object, unref it. As a result, the second key and value
851 of the original $PLIST become the first of those of the new
855 mplist__pop_unref (MPlist *plist)
860 if (MPLIST_TAIL_P (plist))
862 key = MPLIST_KEY (plist);
863 val = mplist_pop (plist);
864 if (key->managing_key)
865 M17N_OBJECT_UNREF (val);
869 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
874 /*** @addtogroup m17nPlist */
879 @brief Symbol whose name is "integer".
881 The symbol @c Minteger has the name <tt>"integer"</tt>. The value
882 of a property whose key is @c Minteger must be an integer. */
884 @brief "integer" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
886 ¥·¥ó¥Ü¥ë @c Minteger ¤Ï <tt>"integer"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¡£¥¡¼¤¬
887 @c Minteger ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
893 @brief Symbol whose name is "plist".
895 The symbol @c Mplist has the name <tt>"plist"</tt>. It is a
896 managing key. A value of a property whose key is @c Mplist must
899 @brief "plist" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
901 ¥·¥ó¥Ü¥ë @c Mplist ¤Ï <tt>"plist"</tt>
902 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¡£¤³¤ì¤Ï´ÉÍý¥¡¼¤Ç¤¢¤ë¡£¥¡¼¤¬ @c Mplist
903 ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ¤Ï plist ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
909 @brief Symbol whose name is "mtext".
911 The symbol @c Mtext has the name <tt>"mtext"</tt>. It is a
912 managing key. A value of a property whose key is @c Mtext must be an
916 @brief "mtext" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
918 ¥·¥ó¥Ü¥ë @c Mtext ¤Ï <tt>"mtext"</tt>
919 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä´ÉÍý¥¡¼¤Ç¤¢¤ë¡£¥¡¼¤¬ @c Mtext
920 ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ¤Ï M-text ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
926 @brief Create a property list object.
928 The mplist () function returns a newly created property list
929 object of length zero.
932 This function returns a newly created property list.
935 This function never fails. */
937 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë.
939 ´Ø¿ô mplist () ¤ÏŤµ 0 ¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò¿·¤·¤¯ºî¤Ã¤ÆÊÖ¤¹¡£
942 ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
945 ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
958 @brief Copy a property list.
960 The mplist_copy () function copies property list $PLIST. In the
961 copy, the values are the same as those of $PLIST.
964 This function returns a newly created plist which is a copy of
968 This function never fails. */
970 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò¥³¥Ô¡¼¤¹¤ë.
972 ´Ø¿ô mplist_copy () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
973 ¤ò¥³¥Ô¡¼¤¹¤ë¡£¥³¥Ô¡¼¤Î¤¹¤Ù¤Æ¤ÎÃͤϥ³¥Ô¡¼¸µ $PLIST ¤ÎÃͤÈƱ¤¸¤Ç¤¢¤ë¡£
976 ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¡¢$PLIST ¤Î¥³¥Ô¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òÊÖ¤¹¡£
979 ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
982 mplist_copy (MPlist *plist)
984 MPlist *copy = mplist (), *pl = copy;
986 MPLIST_DO (plist, plist)
987 pl = mplist_add (pl, MPLIST_KEY (plist), MPLIST_VAL (plist));
994 @brief Set the value of a property in a property list.
996 The mplist_put () function searches property list $PLIST
997 from the beginning for a property whose key is $KEY. If such a
998 property is found, its value is changed to $VALUE. Otherwise, a
999 new property whose key is $KEY and value is $VALUE is appended at
1000 the end of $PLIST. See the documentation of mplist_add () for
1001 the restriction on $KEY and $VAL.
1003 If $KEY is a managing key, $VAL must be a managed object. In this
1004 case, the reference count of the old value, if not @c NULL, is
1005 decremented by one, and that of $VAL is incremented by one.
1008 If the operation was successful, mplist_put () returns a sublist of
1009 $PLIST whose first element is the just modified or added one.
1010 Otherwise, it returns @c NULL. */
1012 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë.
1014 ´Ø¿ô mplist_put () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢¥¡¼¤¬
1015 $KEY ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ÎÃͤò $VALUE
1016 ¤ËÊѹ¹¤¹¤ë¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð¡¢¥¡¼¤¬ $KEY ¤ÇÃͤ¬ $VALUE
1017 ¤Ç¤¢¤ë¿·¤·¤¤¥×¥í¥Ñ¥Æ¥£¤¬ $PLIST ¤ÎËöÈø¤ËÄɲ䵤ì¤ë¡£$KEY ¤È $VAL
1018 ¤ËÂФ¹¤ëÀ©¸Â¤Ë¤Ä¤¤¤Æ¤Ï¡¢mplist_add () ¤ÎÀâÌÀ¤ò»²¾È¡£
1020 $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢
1021 $VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢¸Å¤¤Ãͤλ²¾È¿ô¤Ï
1022 @c NULL ¤Ç¤Ê¤±¤ì¤Ð 1 ¸º¤é¤µ¤ì¡¢$VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
1025 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mplist_put () ¤ÏÊѹ¹¤µ¤ì¤¿¤«Äɲ䵤줿Í×ÁǤ«¤é»Ï¤Þ¤ë
1026 $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1029 mplist_put (MPlist *plist, MSymbol key, void *val)
1032 MERROR (MERROR_PLIST, NULL);
1033 MPLIST_FIND (plist, key);
1034 if (key->managing_key)
1036 if (! MPLIST_TAIL_P (plist))
1037 M17N_OBJECT_UNREF (MPLIST_VAL (plist));
1039 M17N_OBJECT_REF (val);
1041 MPLIST_SET (plist, key, val);
1048 @brief Get the value of a property in a property list.
1050 The mplist_get () function searches property list $PLIST
1051 from the beginning for a property whose key is $KEY. If such a
1052 property is found, a pointer to its value is returned as the type
1053 of <tt>(void *)</tt>. If not found, @c NULL is returned.
1055 When @c NULL is returned, there are two possibilities: one is the
1056 case where no property is found (see above); the other is the case
1057 where a property is found and its value is @c NULL. In case that
1058 these two cases must be distinguished, use the mplist_find_by_key ()
1061 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1063 ´Ø¿ô mplist_get () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢¥¡¼¤¬
1064 $KEY ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ÎÃͤؤΥݥ¤¥ó¥¿¤ò
1065 <tt>(void *)</tt> ·¿¤ÇÊÖ¤¹¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
1067 @c NULL ¤¬Ê֤俺ݤˤÏÆó¤Ä¤Î²ÄǽÀ¤¬¤¢¤ë:
1068 ¾åµ¤Î¤è¤¦¤Ë¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤È¡¢¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤ê¡¢¤½¤ÎÃͤ¬
1069 @c NULL ¤Ç¤¢¤ë¾ì¹ç¤Ç¤¢¤ë¡£¤³¤ì¤é¤ò¶èÊ̤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ë¤Ï´Ø¿ô
1070 mplist_find_by_key () ¤ò»È¤¦¤³¤È¡£ */
1074 mplist_find_by_key () */
1077 mplist_get (MPlist *plist, MSymbol key)
1079 MPLIST_FIND (plist, key);
1080 return (MPLIST_TAIL_P (plist) ? NULL : MPLIST_VAL (plist));
1086 @brief Add a property at the end of a property list.
1088 The mplist_add () function appends at the end of property list
1089 $PLIST a property whose key is $KEY and value is $VAL. $KEY can
1090 be any symbol other than @c Mnil.
1092 If $KEY is a managing key, $VAL must be a managed object. In this
1093 case, the reference count of $VAL is incremented by one.
1096 If the operation was successful, mplist_add () returns a sublist of
1097 $PLIST whose first element is the just added one. Otherwise, it
1100 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈËöÈø¤Ë¥×¥í¥Ñ¥Æ¥£¤òÄɲ乤ë.
1102 ´Ø¿ô mplist_add () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ÎËöÈø¤Ë¥¡¼¤¬ $KEY
1103 ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤òÄɲ乤롣$KEY ¤Ï¡¢@c Mnil °Ê³°¤ÎǤ°Õ¤Î¥·¥ó¥Ü¥ë¤Ç¤è¤¤¡£
1105 $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢$VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢
1106 $VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
1109 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mplist_add () ¤ÏÄɲ䵤줿Í×ÁǤ«¤é»Ï¤Þ¤ë $PLIST
1110 ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1113 mplist_add (MPlist *plist, MSymbol key, void *val)
1116 MERROR (MERROR_PLIST, NULL);
1117 MPLIST_FIND (plist, Mnil);
1118 if (val && key->managing_key)
1119 M17N_OBJECT_REF (val);
1120 MPLIST_KEY (plist) = key;
1121 MPLIST_VAL (plist) = val;
1122 MPLIST_NEW (plist->next);
1129 @brief Add a property at the beginning of a property list.
1131 The mplist_push () function inserts at the beginning of property
1132 list $PLIST a property whose key is $KEY and value is $VAL.
1134 If $KEY is a managing key, $VAL must be a managed object. In this
1135 case, the reference count of $VAL is incremented by one.
1138 If the operation was successful, this function returns $PLIST.
1139 Otherwise, it returns @c NULL. */
1141 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎÀèƬ¤Ë¥×¥í¥Ñ¥Æ¥£¤òÁÞÆþ¤¹¤ë.
1143 ´Ø¿ô mplist_push () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ÎÀèƬ¤Ë¥¡¼¤¬ $KEY
1144 ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÁÞÆþ¤¹¤ë¡£
1146 $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢$VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢
1147 $VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
1150 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï $PLIST ¤òÊÖ¤·¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð@c NULL
1154 mplist_push (MPlist *plist, MSymbol key, void *val)
1159 MERROR (MERROR_PLIST, NULL);
1161 MPLIST_KEY (pl) = MPLIST_KEY (plist);
1162 MPLIST_VAL (pl) = MPLIST_VAL (plist);
1163 MPLIST_NEXT (pl) = MPLIST_NEXT (plist);
1165 if (val && key->managing_key)
1166 M17N_OBJECT_REF (val);
1167 MPLIST_KEY (plist) = key;
1168 MPLIST_VAL (plist) = val;
1175 @brief Remove a property at the beginning of a property list.
1177 The mplist_pop () function removes a property at the beginning of
1178 property list $PLIST. As a result, the second key and value of
1179 the original $PLIST become the first of those of the new $PLIST.
1182 If the operation was successful, this function return the value of
1183 the just popped property. Otherwise, it returns @c NULL. */
1185 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎÀèƬ¤«¤é¥×¥í¥Ñ¥Æ¥£¤òºï½ü¤¹¤ë.
1187 ´Ø¿ô mplist_pop () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
1188 ¤ÎÀèƬ¤Î¥×¥í¥Ñ¥Æ¥£¤òºï½ü¤¹¤ë¡£·ë²Ì¤È¤·¤Æ¡¢¸µ¤Î $PLIST ¤Î2ÈÖÌܤΥ¡¼¤ÈÃͤ¬¡¢¿·¤·¤¤
1189 $PLIST ¤ÎÀèƬ¤Î¥¡¼¤ÈÃͤˤʤ롣
1192 ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ïºï½ü¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
1196 mplist_pop (MPlist *plist)
1201 if (MPLIST_TAIL_P (plist))
1203 val = MPLIST_VAL (plist);
1204 next = MPLIST_NEXT (plist);
1205 MPLIST_KEY (plist) = MPLIST_KEY (next);
1206 MPLIST_VAL (plist) = MPLIST_VAL (next);
1207 if (MPLIST_KEY (plist) != Mnil
1208 && MPLIST_KEY (plist)->managing_key
1209 && MPLIST_VAL (plist))
1210 M17N_OBJECT_REF (MPLIST_VAL (plist));
1211 MPLIST_NEXT (plist) = MPLIST_NEXT (next);
1213 M17N_OBJECT_REF (plist->next);
1214 M17N_OBJECT_UNREF (next);
1220 @brief Find a property of a specific key in a property list.
1222 The mplist_find_by_key () function searches property list
1223 $PLIST from the beginning for a property whose key is $KEY. If
1224 such a property is found, a sublist of $PLIST whose first element
1225 is the found one is returned. Otherwise, @c NULL is returned.
1227 If $KEY is @c Mnil, it returns a sublist of $PLIST whose
1228 first element is the last one of $PLIST. */
1230 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃ椫¤é»ØÄê¤Î¥¡¼¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤òõ¤¹.
1232 ´Ø¿ô mplist_find_by_key () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
1233 ¤ò»Ï¤á¤«¤éõ ¤·¤Æ¡¢¥¡¼¤¬ $KEY
1234 ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤Î¥×¥í¥Ñ¥Æ¥£¤«¤é»Ï¤Þ¤ë
1235 $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
1237 $KEY ¤¬ @c Mnil ¤Ê¤é¤Ð¡¢$PLIST ¤ÎºÇ¸å¤ÎÍ×ÁǤ«¤é»Ï¤Þ¤ëÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£ */
1240 mplist_find_by_key (MPlist *plist, MSymbol key)
1242 MPLIST_FIND (plist, key);
1243 return (MPLIST_TAIL_P (plist)
1244 ? (key == Mnil ? plist : NULL)
1250 @brief Find a property of a specific value in a property list.
1252 The mplist_find_by_value () function searches property list $PLIST
1253 from the beginning for a property whose value is $VAL. If such a
1254 property is found, a sublist of $PLIST whose first element is the
1255 found one is returned. Otherwise, @c NULL is returned. */
1257 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃ椫¤é»ØÄê¤ÎÃͤò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤òõ¤¹.
1259 ´Ø¿ô mplist_find_by_value () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
1260 ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢Ãͤ¬ $VAL
1261 ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤Î¥×¥í¥Ñ¥Æ¥£¤«¤é»Ï¤Þ¤ë
1262 $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1265 mplist_find_by_value (MPlist *plist, void *val)
1267 MPLIST_DO (plist, plist)
1269 if (MPLIST_VAL (plist) == val)
1278 @brief Return the next sublist of a property list.
1280 The mplist_next () function returns a pointer to the sublist of
1281 property list $PLIST, which begins at the second element in $PLIST. If the
1282 length of $PLIST is zero, it returns @c NULL. */
1284 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Î¼¡¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹.
1286 ´Ø¿ô mplist_next () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤Î 2
1287 ÈÖÌܤÎÍ×ÁǤ«¤é»Ï¤Þ¤ëÉôʬ¥ê¥¹¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£$PLIST ¤ÎŤµ¤¬ 0
1288 ¤Ê¤é¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1291 mplist_next (MPlist *plist)
1293 return (MPLIST_TAIL_P (plist) ? NULL : plist->next);
1299 @brief Set the first property in a property list.
1301 The mplist_set () function sets the key and the value of the first
1302 property in property list $PLIST to $KEY and $VALUE, respectively.
1303 See the documentation of mplist_add () for the restriction on $KEY
1307 If the operation was successful, mplist_set () returns $PLIST.
1308 Otherwise, it returns @c NULL. */
1310 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ¤ë.
1312 ´Ø¿ô mplist_set () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
1313 ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤ÈÃͤò¤½¤ì¤¾¤ì $KEY ¤È $VALUE ¤ËÀßÄꤹ¤ë¡£
1314 $KEY ¤È $VAL ¤ËÂФ¹¤ëÀ©¸Â¤Ë¤Ä¤¤¤Æ¤Ï¡¢mplist_add () ¤ÎÀâÌÀ¤ò»²¾È¡£
1317 ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð mplist_set () ¤Ï $PLIST ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1320 mplist_set (MPlist *plist, MSymbol key, void * val)
1324 if (! MPLIST_TAIL_P (plist))
1326 key = MPLIST_KEY (plist);
1327 M17N_OBJECT_UNREF (MPLIST_NEXT (plist));
1328 MPLIST_KEY (plist) = Mnil;
1329 if (key->managing_key)
1330 M17N_OBJECT_UNREF (MPLIST_VAL (plist));
1336 if (val && key->managing_key)
1337 M17N_OBJECT_REF (val);
1338 if (! MPLIST_TAIL_P (plist)
1339 && MPLIST_KEY (plist)->managing_key)
1340 M17N_OBJECT_UNREF (MPLIST_VAL (plist));
1341 MPLIST_SET (plist, key, val);
1349 @brief Return the length of a property list.
1351 The mplist_length () function returns the number of properties in
1352 property list $PLIST. */
1354 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎŤµ¤òÊÖ¤¹.
1356 ´Ø¿ô mplist_length () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST Ãæ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¿ô¤òÊÖ¤¹¡£ */
1359 mplist_length (MPlist *plist)
1363 for (n = 0; ! (MPLIST_TAIL_P (plist)); n++, plist = plist->next);
1370 @brief Return the key of the first property in a property list.
1372 The mplist_key () function returns the key of the first property
1373 in property list $PLIST. If the length of $PLIST is zero,
1374 it returns @c Mnil. */
1376 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÊÖ¤¹.
1378 ´Ø¿ô mplist_key () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
1379 Ãæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÊÖ¤¹¡£$PLIST ¤ÎŤµ¤¬ 0 ¤Ê¤é¤Ð¡¢ @c Mnil
1383 mplist_key (MPlist *plist)
1385 return MPLIST_KEY (plist);
1391 @brief Return the value of the first property in a property list.
1393 The mplist_value () function returns the value of the first
1394 property in property list $PLIST. If the length of $PLIST
1395 is zero, it returns @c NULL. */
1397 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
1399 ´Ø¿ô mplist_value () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST Ãæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£
1400 $PLIST ¤ÎŤµ¤¬ 0 ¤Ê¤é¤Ð¡¢ @c Mnil ¤òÊÖ¤¹¡£ */
1403 mplist_value (MPlist *plist)
1405 return MPLIST_VAL (plist);
1409 @brief Generate a property list by deserializaing an M-text.
1411 The mplist_deserialize () function parses M-text $MT and returns a
1414 The syntax of $MT is as follows.
1416 MT ::= '(' ELEMENT * ')'
1418 ELEMENT ::= SYMBOL | INTEGER | M-TEXT | PLIST
1420 SYMBOL ::= ascii-character-sequence
1422 INTEGER ::= '-' ? [ '0' | .. | '9' ]+
1423 | '0x' [ '0' | .. | '9' | 'A' | .. | 'F' | 'a' | .. | 'f' ]+
1425 M-TEXT ::= '"' character-sequence '"'
1427 Each alternatives of @c ELEMENT is assigned one of these keys: @c
1428 Msymbol, @c Minteger, @c Mtext, @c Mplist
1430 In an ascii-character-sequence, a backslash (\) is used as the escape
1431 character, which means that, for instance, <tt>"abc\ def"</tt>
1432 produces a symbol whose name is of length seven with the fourth
1433 character being a space. */
1435 @brief M-text ¤ò¥Ç¥·¥ê¥¢¥é¥¤¥º¤·¤Æ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òºî¤ë.
1437 ´Ø¿ô mplist_deserialize () ¤Ï M-text $MT ¤ò²òÀϤ·¤Æ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òÊÖ¤¹¡£
1439 $MT ¤Î¥·¥ó¥¿¥Ã¥¯¥¹¤Ï°Ê²¼¤ÎÄ̤ꡣ
1441 MT ::= '(' ELEMENT * ')'
1443 ELEMENT ::= SYMBOL | INTEGER | M-TEXT | PLIST
1445 SYMBOL ::= ¥¢¥¹¥¡¼Ê¸»úÎó
1447 INTEGER ::= '-' ? [ '0' | .. | '9' ]+
1448 | '0x' [ '0' | .. | '9' | 'A' | .. | 'F' | 'a' | .. | 'f' ]+
1450 M-TEXT ::= '"' character-sequence '"'
1452 @c ELEMENT ¤Î³ÆÁªÂò»è¤Ï¥¡¼¡§@c Msymbol, @c Minteger, @c Mtext,
1453 @c Mplist ¤Î¤¤¤º¤ì¤«¤ò³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë¡£
1455 ¥¢¥¹¥¡¼Ê¸»úÎóÆâ¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å (\) ¤¬¥¨¥¹¥±¡¼¥×ʸ»ú¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð
1456 <tt>"abc\ def"</tt> ¤Ï 4 ʸ»úÌܤ¬¶õÇòʸ»ú¤Ç¤¢¤êŤµ¤¬ 7
1457 ¤Ç¤¢¤ë»ý¤Ä̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÀ¸À®¤¹¤ë¡£ */
1460 mplist_deserialize (MText *mt)
1465 if (mt->format > MTEXT_FORMAT_UTF_8)
1467 if (MTEXT_READ_ONLY_P (mt))
1468 mt = tmp = mtext_cpy (mtext (), mt);
1470 mtext__adjust_format (mt, MTEXT_FORMAT_UTF_8);
1472 plist = mplist__from_string (MTEXT_DATA (mt), mtext_nbytes (mt));
1474 M17N_OBJECT_UNREF (tmp);
1480 /*** @addtogroup m17nDebug */
1485 @brief Dump a property list.
1487 The mdebug_dump_plist () function prints a property list $PLIST in
1488 a human readable way to the stderr. $INDENT specifies how many
1489 columns to indent the lines but the first one.
1492 This function returns $PLIST. */
1494 @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò¥À¥ó¥×¤¹¤ë.
1496 ´Ø¿ô mdebug_dump_plist () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò stderr
1497 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
1500 ¤³¤Î´Ø¿ô¤Ï $PLIST ¤òÊÖ¤¹¡£ */
1502 mdebug_dump_plist (MPlist *plist, int indent)
1504 char *prefix = (char *) alloca (indent + 1);
1508 memset (prefix, 32, indent);
1511 fprintf (stderr, "(");
1512 MPLIST_DO (pl, plist)
1517 fprintf (stderr, "\n%s ", prefix);
1518 dump_plist_element (pl, indent + 2);
1520 fprintf (stderr, ")");