If the key of a property is a @e managing @e key, its @e value is
a @e managed @e object. A property list itself is a managed
objects. */
+/***ja
+ @addtogroup m17nPlist
+
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤È¤½¤ì¤Ë´Ø¤¹¤ë API.
+
+ @e ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È (¤Þ¤¿¤Ï @e plist) ¤Ï 0
+ ¸Ä°Ê¾å¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥ê¥¹¥È¤Ç¤¢¤ë¡£¥×¥í¥Ñ¥Æ¥£¤Ï @e ¥¡¼ ¤È @e ÃÍ
+ ¤«¤é¤Ê¤ë¡£¥¡¼¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃÍ¤Ï <tt>(void *)</tt>
+ ¤Ë¥¥ã¥¹¥È¤Ç¤¤ë¤â¤Î¤Ê¤é¤Ð²¿¤Ç¤âÎɤ¤¡£
+
+ ¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤¬ @e ´ÉÍý¥¡¼ ¤Ê¤é¤Ð¡¢¤½¤Î @e ÃÍ ¤Ï @e ´ÉÍý²¼
+ @e ¥ª¥Ö¥¸¥§¥¯¥È
+ ¤Ç¤¢¤ë¡£¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¼«ÂΤâ´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£ */
/*=*/
#include <stdio.h>
#include <string.h>
+#include "config.h"
#include "m17n.h"
#include "m17n-misc.h"
#include "internal.h"
return st->buffer[0];
}
-#define GETC(st) \
- ((st)->p < (st)->pend ? *(st)->p++ : get_byte (st))
-
+#define GETC(st) ((st)->p < (st)->pend ? *(st)->p++ : get_byte (st))
-#define UNGETC(c, st) \
- (*--(st)->p = (c))
+#define UNGETC(c, st) (--((st)->p))
/** Mapping table for reading a number. Hexadecimal chars
(0..9,A..F,a..F) are mapped to the corresponding numbers.
for the next element. */
static MPlist *
-read_mtext_element (MPlist *plist, MStream *st)
+read_mtext_element (MPlist *plist, MStream *st, int skip)
{
unsigned char buffer[1024];
int bufsize = 1024;
c = escape_mnemonic[c];
}
- buf[i++] = c;
+ if (! skip)
+ buf[i++] = c;
}
- MPLIST_SET_ADVANCE (plist, Mtext,
- mtext__from_data (buf, i, MTEXT_FORMAT_UTF_8, 1));
- if (buf != buffer)
- free (buf);
+ if (! skip)
+ {
+ MPLIST_SET_ADVANCE (plist, Mtext,
+ mtext__from_data (buf, i, MTEXT_FORMAT_UTF_8, 1));
+ if (buf != buffer)
+ free (buf);
+ }
return plist;
}
read the character C. */
static MPlist *
-read_integer_element (MPlist *plist, MStream *st, int c)
+read_integer_element (MPlist *plist, MStream *st, int c, int skip)
{
int num;
else
num = read_decimal (st, c);
- MPLIST_SET_ADVANCE (plist, Minteger, (void *) num);
+ if (! skip)
+ MPLIST_SET_ADVANCE (plist, Minteger, (void *) num);
return plist;
}
for the next element. */
static MPlist *
-read_symbol_element (MPlist *plist, MStream *st)
+read_symbol_element (MPlist *plist, MStream *st, int skip)
{
unsigned char buffer[1024];
int bufsize = 1024;
break;
c = escape_mnemonic[c];
}
- buf[i++] = c;
+ if (! skip)
+ buf[i++] = c;
}
- buf[i] = 0;
- MPLIST_SET_ADVANCE (plist, Msymbol, msymbol ((char *) buf));
- if (buf != buffer)
- free (buf);
if (c > ' ')
UNGETC (c, st);
+ if (! skip)
+ {
+ buf[i] = 0;
+ MPLIST_SET_ADVANCE (plist, Msymbol, msymbol ((char *) buf));
+ if (buf != buffer)
+ free (buf);
+ }
return plist;
}
'0'..'9', '-': integer
'?': integer representing character code
the other ASCII letters: symbol
-*/
+
+ If KEYS is not NULL, it is a plist contains target keys and stop
+ keys. In this caes, read only a plist whose key has value 1 in
+ KEYS, and return NULL when we encounter a plist whose key has value
+ 0 in KEYS while skipping any other elements. */
static MPlist *
-read_element (MPlist *plist, MStream *st)
+read_element (MPlist *plist, MStream *st, MPlist *keys)
{
int c;
MPLIST_NEW (pl);
p = pl;
- while ((p = read_element (p, st)));
- MPLIST_SET_ADVANCE (plist, Mplist, pl);
+ p = read_element (p, st, NULL);
+ if (keys && p && MPLIST_SYMBOL_P (pl))
+ {
+ MPlist *p0 = keys;
+ MPLIST_FIND (p0, MPLIST_SYMBOL (pl));
+ if (! MPLIST_TAIL_P (p0) && ! MPLIST_VAL (p0))
+ {
+ M17N_OBJECT_UNREF (pl);
+ return NULL;
+ }
+ while ((p = read_element (p, st, NULL)));
+ if (! MPLIST_TAIL_P (p0))
+ MPLIST_SET_ADVANCE (plist, Mplist, pl);
+ else
+ M17N_OBJECT_UNREF (pl);
+ }
+ else
+ {
+ if (p)
+ while ((p = read_element (p, st, NULL)));
+ MPLIST_SET_ADVANCE (plist, Mplist, pl);
+ }
return plist;
}
if (c == '"')
- return read_mtext_element (plist, st);
+ return (read_mtext_element (plist, st, keys ? 1 : 0));
if ((c >= '0' && c <= '9') || c == '-' || c == '?' || c == '#')
- return read_integer_element (plist, st, c);
+ return (read_integer_element (plist, st, c, keys ? 1 : 0));
if (c == EOF || c == ')')
return NULL;
UNGETC (c, st);
- return read_symbol_element (plist, st);
+ return (read_symbol_element (plist, st, keys ? 1 : 0));
}
void
key = MPLIST_SYMBOL (plist);
plist = MPLIST_NEXT (plist);
type = MPLIST_KEY (plist);
- if (type->managing_key)
+ if (type->managing_key && MPLIST_VAL (plist))
M17N_OBJECT_REF (MPLIST_VAL (plist));
MPLIST_SET_ADVANCE (p, key, MPLIST_VAL (plist));
plist = MPLIST_NEXT (plist);
MPlist *
-mplist__from_file (FILE *fp)
+mplist__from_file (FILE *fp, MPlist *keys)
{
MPlist *plist, *pl;
MStream st;
st.p = st.pend = st.buffer;
MPLIST_NEW (plist);
pl = plist;
- while ((pl = read_element (pl, &st)));
+ while ((pl = read_element (pl, &st, keys)));
return plist;
}
st.pend = str + n;
MPLIST_NEW (plist);
pl = plist;
- while ((pl = read_element (pl, &st)));
+ while ((pl = read_element (pl, &st, NULL)));
return plist;
}
/***en
@brief Symbol whose name is "integer".
- The symbol @c Minteger has the name <tt>"integer"</tt>. A value
- of a plist whose key is @c Minteger must be an integer. */
+ The symbol @c Minteger has the name <tt>"integer"</tt>. The value
+ of a property whose key is @c Minteger must be an integer. */
+/***ja
+ @brief "integer" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
+
+ ¥·¥ó¥Ü¥ë @c Minteger ¤Ï <tt>"integer"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¡£¥¡¼¤¬
+ @c Minteger ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
MSymbol Minteger;
/*=*/
@brief Symbol whose name is "plist".
The symbol @c Mplist has the name <tt>"plist"</tt>. It is a
- managing key. A value of a plist whose key is @c Mplist must be a
- plist. */
+ managing key. A value of a property whose key is @c Mplist must
+ be a plist. */
+/***ja
+ @brief "plist" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
+
+ ¥·¥ó¥Ü¥ë @c Mplist ¤Ï <tt>"plist"</tt>
+ ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¡£¤³¤ì¤Ï´ÉÍý¥¡¼¤Ç¤¢¤ë¡£¥¡¼¤¬ @c Mplist
+ ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ¤Ï plist ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
MSymbol Mplist;
/*=*/
@brief Symbol whose name is "mtext".
The symbol @c Mtext has the name <tt>"mtext"</tt>. It is a
- managing key. A value of a plist whose key is @c Mtext must be an
+ managing key. A value of a property whose key is @c Mtext must be an
M-text. */
-/***oldja
- @brief "text" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë
+/***ja
+ @brief "mtext" ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë.
- ÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë @c Mtext ¤Ï <tt>"text"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä´ÉÍý
- ¥¡¼¤Ç¤¢¤ë¡£ */
+ ¥·¥ó¥Ü¥ë @c Mtext ¤Ï <tt>"mtext"</tt>
+ ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä´ÉÍý¥¡¼¤Ç¤¢¤ë¡£¥¡¼¤¬ @c Mtext
+ ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃÍ¤Ï M-text ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
MSymbol Mtext;
-
/*=*/
/***en
@brief Create a property list object.
@errors
This function never fails. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë.
+
+ ´Ø¿ô mplist () ¤ÏŤµ 0 ¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò¿·¤·¤¯ºî¤Ã¤ÆÊÖ¤¹¡£
+
+ @returns
+ ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹¡£
+
+ @errors
+ ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
MPlist *
mplist ()
/*=*/
/***en
- @brief Copy a plist.
+ @brief Copy a property list.
- The mplist_copy () function copies $PLIST. In the copy, the
- values are the same as those of $PLIST.
+ The mplist_copy () function copies property list $PLIST. In the
+ copy, the values are the same as those of $PLIST.
@return
This function returns a newly created plist which is a copy of
- $PLIST. */
-/***
+ $PLIST.
+
@errors
This function never fails. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò¥³¥Ô¡¼¤¹¤ë.
+
+ ´Ø¿ô mplist_copy () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ ¤ò¥³¥Ô¡¼¤¹¤ë¡£¥³¥Ô¡¼¤Î¤¹¤Ù¤Æ¤ÎÃͤϥ³¥Ô¡¼¸µ $PLIST ¤ÎÃͤÈƱ¤¸¤Ç¤¢¤ë¡£
+
+ @return
+ ¤³¤Î´Ø¿ô¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¡¢$PLIST ¤Î¥³¥Ô¡¼¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òÊÖ¤¹¡£
+
+ @errors
+ ¤³¤Î´Ø¿ô¤Ï·è¤·¤Æ¼ºÇÔ¤·¤Ê¤¤¡£ */
MPlist *
mplist_copy (MPlist *plist)
/*=*/
/***en
- @brief Set the value of a property in a property list object.
+ @brief Set the value of a property in a property list.
- The mplist_put () function searches property list object $PLIST
+ The mplist_put () function searches property list $PLIST
from the beginning for a property whose key is $KEY. If such a
property is found, its value is changed to $VALUE. Otherwise, a
new property whose key is $KEY and value is $VALUE is appended at
If the operation was successful, mplist_put () returns a sublist of
$PLIST whose first element is the just modified or added one.
Otherwise, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë.
+
+ ´Ø¿ô mplist_put () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢¥¡¼¤¬
+ $KEY ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ÎÃͤò $VALUE
+ ¤ËÊѹ¹¤¹¤ë¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð¡¢¥¡¼¤¬ $KEY ¤ÇÃͤ¬ $VALUE
+ ¤Ç¤¢¤ë¿·¤·¤¤¥×¥í¥Ñ¥Æ¥£¤¬ $PLIST ¤ÎËöÈø¤ËÄɲ䵤ì¤ë¡£$KEY ¤È $VAL
+ ¤ËÂФ¹¤ëÀ©¸Â¤Ë¤Ä¤¤¤Æ¤Ï¡¢mplist_add () ¤ÎÀâÌÀ¤ò»²¾È¡£
+
+ $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢
+ $VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢¸Å¤¤Ãͤλ²¾È¿ô¤Ï
+ @c NULL ¤Ç¤Ê¤±¤ì¤Ð 1 ¸º¤é¤µ¤ì¡¢$VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
+
+ @return
+ ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mplist_put () ¤ÏÊѹ¹¤µ¤ì¤¿¤«Äɲ䵤줿Í×ÁǤ«¤é»Ï¤Þ¤ë
+ $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
MPlist *
mplist_put (MPlist *plist, MSymbol key, void *val)
{
if (! MPLIST_TAIL_P (plist))
M17N_OBJECT_UNREF (MPLIST_VAL (plist));
- M17N_OBJECT_REF (val);
+ if (val)
+ M17N_OBJECT_REF (val);
}
MPLIST_SET (plist, key, val);
return plist;
/*=*/
/***en
- @brief Get the value of a property in a property list object.
+ @brief Get the value of a property in a property list.
- The mplist_get () function searches property list object $PLIST
+ The mplist_get () function searches property list $PLIST
from the beginning for a property whose key is $KEY. If such a
property is found, a pointer to its value is returned as the type
of <tt>(void *)</tt>. If not found, @c NULL is returned.
where a property is found and its value is @c NULL. In case that
these two cases must be distinguished, use the mplist_find_by_key ()
function. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
+
+ ´Ø¿ô mplist_get () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢¥¡¼¤¬
+ $KEY ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤ÎÃͤؤΥݥ¤¥ó¥¿¤ò
+ <tt>(void *)</tt> ·¿¤ÇÊÖ¤¹¡£¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
+
+ @c NULL ¤¬Ê֤俺ݤˤÏÆó¤Ä¤Î²ÄǽÀ¤¬¤¢¤ë:
+ ¾åµ¤Î¤è¤¦¤Ë¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤È¡¢¥×¥í¥Ñ¥Æ¥£¤¬¸«¤Ä¤«¤ê¡¢¤½¤ÎÃͤ¬
+ @c NULL ¤Ç¤¢¤ë¾ì¹ç¤Ç¤¢¤ë¡£¤³¤ì¤é¤ò¶èÊ̤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ë¤Ï´Ø¿ô
+ mplist_find_by_key () ¤ò»È¤¦¤³¤È¡£ */
/***
@seealso
/*=*/
/***en
- @brief Add a property at the end of a property list object.
+ @brief Add a property at the end of a property list.
- The mplist_add () function appends at the end of $PLIST a property
- whose key is $KEY and value is $VAL. $KEY can be any symbol
- other than @c Mnil.
+ The mplist_add () function appends at the end of property list
+ $PLIST a property whose key is $KEY and value is $VAL. $KEY can
+ be any symbol other than @c Mnil.
If $KEY is a managing key, $VAL must be a managed object. In this
case, the reference count of $VAL is incremented by one.
If the operation was successful, mplist_add () returns a sublist of
$PLIST whose first element is the just added one. Otherwise, it
returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈËöÈø¤Ë¥×¥í¥Ñ¥Æ¥£¤òÄɲ乤ë.
+
+ ´Ø¿ô mplist_add () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ÎËöÈø¤Ë¥¡¼¤¬ $KEY
+ ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤òÄɲ乤롣$KEY ¤Ï¡¢@c Mnil °Ê³°¤ÎǤ°Õ¤Î¥·¥ó¥Ü¥ë¤Ç¤è¤¤¡£
+
+ $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢$VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢
+ $VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
+
+ @return
+ ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mplist_add () ¤ÏÄɲ䵤줿Í×ÁǤ«¤é»Ï¤Þ¤ë $PLIST
+ ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
MPlist *
mplist_add (MPlist *plist, MSymbol key, void *val)
if (key == Mnil)
MERROR (MERROR_PLIST, NULL);
MPLIST_FIND (plist, Mnil);
- if (key->managing_key)
+ if (val && key->managing_key)
M17N_OBJECT_REF (val);
MPLIST_KEY (plist) = key;
MPLIST_VAL (plist) = val;
/*=*/
/***en
- @brief Push a property to a property list object.
+ @brief Add a property at the beginning of a property list.
- The mplist_push () function pushes at the top of $PLIST a
- property whose key is $KEY and value si $VAL.
+ The mplist_push () function inserts at the beginning of property
+ list $PLIST a property whose key is $KEY and value is $VAL.
If $KEY is a managing key, $VAL must be a managed object. In this
case, the reference count of $VAL is incremented by one.
@return
If the operation was successful, this function returns $PLIST.
Otherwise, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎÀèƬ¤Ë¥×¥í¥Ñ¥Æ¥£¤òÁÞÆþ¤¹¤ë.
+
+ ´Ø¿ô mplist_push () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ÎÀèƬ¤Ë¥¡¼¤¬ $KEY
+ ¤ÇÃͤ¬ $VAL ¤Ç¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÁÞÆþ¤¹¤ë¡£
+
+ $KEY ¤¬´ÉÍý¥¡¼¤Ê¤é¤Ð¡¢$VAL ¤Ï´ÉÍý²¼¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢
+ $VAL ¤Î»²¾È¿ô¤Ï 1 Áý¤ä¤µ¤ì¤ë¡£
+
+ @return
+ ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï $PLIST ¤òÊÖ¤·¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð@c NULL
+ ¤òÊÖ¤¹¡£ */
MPlist *
mplist_push (MPlist *plist, MSymbol key, void *val)
MPLIST_NEW (pl);
MPLIST_KEY (pl) = MPLIST_KEY (plist);
MPLIST_VAL (pl) = MPLIST_VAL (plist);
- pl->next = plist->next;
+ MPLIST_NEXT (pl) = MPLIST_NEXT (plist);
plist->next = pl;
- if (key->managing_key)
+ if (val && key->managing_key)
M17N_OBJECT_REF (val);
MPLIST_KEY (plist) = key;
MPLIST_VAL (plist) = val;
/*=*/
/***en
- @brief Pop a property from a property list object.
+ @brief Remove a property at the beginning of a property list.
- The mplist_pop () function pops the topmost property from $PLIST.
- As a result, the key and value of $PLIST becomes those of the next
- of $PLIST.
+ The mplist_pop () function removes a property at the beginning of
+ property list $PLIST. As a result, the second key and value of
+ the original $PLIST become the first of those of the new $PLIST.
@return
If the operation was successful, this function return the value of
the just popped property. Otherwise, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎÀèƬ¤«¤é¥×¥í¥Ñ¥Æ¥£¤òºï½ü¤¹¤ë.
+
+ ´Ø¿ô mplist_pop () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ ¤ÎÀèƬ¤Î¥×¥í¥Ñ¥Æ¥£¤òºï½ü¤¹¤ë¡£·ë²Ì¤È¤·¤Æ¡¢¸µ¤Î $PLIST ¤Î2ÈÖÌܤΥ¡¼¤ÈÃͤ¬¡¢¿·¤·¤¤
+ $PLIST ¤ÎÀèƬ¤Î¥¡¼¤ÈÃͤˤʤ롣
+
+ @return
+ ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ïºï½ü¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
+ @c NULL ¤òÊÖ¤¹¡£ */
void *
mplist_pop (MPlist *plist)
if (MPLIST_TAIL_P (plist))
return NULL;
val = MPLIST_VAL (plist);
- next = plist->next;
+ next = MPLIST_NEXT (plist);
MPLIST_KEY (plist) = MPLIST_KEY (next);
MPLIST_VAL (plist) = MPLIST_VAL (next);
if (MPLIST_KEY (plist) != Mnil
&& MPLIST_KEY (plist)->managing_key
&& MPLIST_VAL (plist))
M17N_OBJECT_REF (MPLIST_VAL (plist));
- plist->next = next->next;
+ MPLIST_NEXT (plist) = MPLIST_NEXT (next);
if (plist->next)
M17N_OBJECT_REF (plist->next);
M17N_OBJECT_UNREF (next);
/*=*/
/***en
- @brief Find a property of a specific key in a property list object.
+ @brief Find a property of a specific key in a property list.
- The mplist_find_by_key () function searches property list object
+ The mplist_find_by_key () function searches property list
$PLIST from the beginning for a property whose key is $KEY. If
such a property is found, a sublist of $PLIST whose first element
is the found one is returned. Otherwise, @c NULL is returned.
- If $KEY is Mnil, it returns the last a sublist of $PLIST whose
+ If $KEY is @c Mnil, it returns a sublist of $PLIST whose
first element is the last one of $PLIST. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃ椫¤é»ØÄê¤Î¥¡¼¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤òõ¤¹.
+
+ ´Ø¿ô mplist_find_by_key () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ ¤ò»Ï¤á¤«¤éõ ¤·¤Æ¡¢¥¡¼¤¬ $KEY
+ ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤Î¥×¥í¥Ñ¥Æ¥£¤«¤é»Ï¤Þ¤ë
+ $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
+
+ $KEY ¤¬ @c Mnil ¤Ê¤é¤Ð¡¢$PLIST ¤ÎºÇ¸å¤ÎÍ×ÁǤ«¤é»Ï¤Þ¤ëÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£ */
MPlist *
mplist_find_by_key (MPlist *plist, MSymbol key)
/*=*/
/***en
- @brief Find a property of a specific value in a property list object.
+ @brief Find a property of a specific value in a property list.
- The mplist_find_by_value () function searches property list object
- $PLIST from the beginning for a property whose value is $VAL. If
- such a property is found, a sublist of $PLIST whose first element
- is the found one is returned. Otherwise, @c NULL is returned. */
+ The mplist_find_by_value () function searches property list $PLIST
+ from the beginning for a property whose value is $VAL. If such a
+ property is found, a sublist of $PLIST whose first element is the
+ found one is returned. Otherwise, @c NULL is returned. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃ椫¤é»ØÄê¤ÎÃͤò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤òõ¤¹.
+
+ ´Ø¿ô mplist_find_by_value () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ ¤ò»Ï¤á¤«¤éõ¤·¤Æ¡¢Ãͤ¬ $VAL
+ ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ò¸«¤Ä¤±¤ë¡£¸«¤Ä¤«¤ì¤Ð¡¢¤½¤Î¥×¥í¥Ñ¥Æ¥£¤«¤é»Ï¤Þ¤ë
+ $PLIST ¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
MPlist *
mplist_find_by_value (MPlist *plist, void *val)
/*=*/
/***en
- @brief Return the next sublist of a plist.
+ @brief Return the next sublist of a property list.
The mplist_next () function returns a pointer to the sublist of
- $PLIST, which begins at the second element in $PLIST. If the
+ property list $PLIST, which begins at the second element in $PLIST. If the
length of $PLIST is zero, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Î¼¡¤ÎÉôʬ¥ê¥¹¥È¤òÊÖ¤¹.
+
+ ´Ø¿ô mplist_next () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤Î 2
+ ÈÖÌܤÎÍ×ÁǤ«¤é»Ï¤Þ¤ëÉôʬ¥ê¥¹¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£$PLIST ¤ÎŤµ¤¬ 0
+ ¤Ê¤é¤Ð @c NULL ¤òÊÖ¤¹¡£ */
MPlist *
mplist_next (MPlist *plist)
/*=*/
/***en
- @brief Set the first property in a property list object.
+ @brief Set the first property in a property list.
- The mplist_set () function sets the key and value of the first
- property in property list object $PLIST to $KEY and $VALUE,
- respectively. See the documentation of mplist_add () for the
- restriction on $KEY and $VAL.
+ The mplist_set () function sets the key and the value of the first
+ property in property list $PLIST to $KEY and $VALUE, respectively.
+ See the documentation of mplist_add () for the restriction on $KEY
+ and $VAL.
@return
If the operation was successful, mplist_set () returns $PLIST.
Otherwise, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤹ¤ë.
+
+ ´Ø¿ô mplist_set () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤ÈÃͤò¤½¤ì¤¾¤ì $KEY ¤È $VALUE ¤ËÀßÄꤹ¤ë¡£
+ $KEY ¤È $VAL ¤ËÂФ¹¤ëÀ©¸Â¤Ë¤Ä¤¤¤Æ¤Ï¡¢mplist_add () ¤ÎÀâÌÀ¤ò»²¾È¡£
+
+ @return
+ ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð mplist_set () ¤Ï $PLIST ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
MPlist *
mplist_set (MPlist *plist, MSymbol key, void * val)
key = MPLIST_KEY (plist);
M17N_OBJECT_UNREF (MPLIST_NEXT (plist));
MPLIST_KEY (plist) = Mnil;
- if (key->managing_key && MPLIST_VAL (plist))
+ if (key->managing_key)
M17N_OBJECT_UNREF (MPLIST_VAL (plist));
plist->next = NULL;
}
else
{
if (! MPLIST_TAIL_P (plist)
- && MPLIST_KEY (plist)->managing_key
- && MPLIST_VAL (plist))
+ && MPLIST_KEY (plist)->managing_key)
M17N_OBJECT_UNREF (MPLIST_VAL (plist));
- if (key->managing_key)
+ if (val && key->managing_key)
M17N_OBJECT_REF (val);
MPLIST_SET (plist, key, val);
}
/*=*/
/***en
- @brief Return the length of a plist.
+ @brief Return the length of a property list.
The mplist_length () function returns the number of properties in
- property list object $PLIST. */
+ property list $PLIST. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ÎŤµ¤òÊÖ¤¹.
+
+ ´Ø¿ô mplist_length () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST Ãæ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¿ô¤òÊÖ¤¹¡£ */
int
mplist_length (MPlist *plist)
/*=*/
/***en
- @brief Return the key of the first property in a property list object.
+ @brief Return the key of the first property in a property list.
The mplist_key () function returns the key of the first property
- in property list object $PLIST. If the length of $PLIST is zero,
+ in property list $PLIST. If the length of $PLIST is zero,
it returns @c Mnil. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÊÖ¤¹.
+
+ ´Ø¿ô mplist_key () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST
+ Ãæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÊÖ¤¹¡£$PLIST ¤ÎŤµ¤¬ 0 ¤Ê¤é¤Ð¡¢ @c Mnil
+ ¤òÊÖ¤¹¡£ */
MSymbol
mplist_key (MPlist *plist)
/*=*/
/***en
- @brief Return the value of the first property in a property list object.
+ @brief Return the value of the first property in a property list.
The mplist_value () function returns the value of the first
- property in property list object $PLIST. If the length of $PLIST
+ property in property list $PLIST. If the length of $PLIST
is zero, it returns @c NULL. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥ÈÃæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
+
+ ´Ø¿ô mplist_value () ¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST Ãæ¤ÎºÇ½é¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£
+ $PLIST ¤ÎŤµ¤¬ 0 ¤Ê¤é¤Ð¡¢ @c Mnil ¤òÊÖ¤¹¡£ */
void *
mplist_value (MPlist *plist)
}
/***en
- @brief Generate a plist by deserializaing an M-text.
+ @brief Generate a property list by deserializaing an M-text.
The mplist_deserialize () function parses M-text $MT and returns a
property list.
M-TEXT ::= '"' character-sequence '"'
- Each kind of @c ELEMENT is assigned one of these keys:
- @c Msymbol, @c Minteger, @c Mtext, @c Mplist
+ Each alternatives of @c ELEMENT is assigned one of these keys: @c
+ Msymbol, @c Minteger, @c Mtext, @c Mplist
- In an ascii-character-sequence, a backslush (\) is used as the escape
+ In an ascii-character-sequence, a backslash (\) is used as the escape
character, which means that, for instance, <tt>"abc\ def"</tt>
produces a symbol whose name is of length seven with the fourth
character being a space. */
+/***ja
+ @brief M-text ¤ò¥Ç¥·¥ê¥¢¥é¥¤¥º¤·¤Æ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òºî¤ë.
+
+ ´Ø¿ô mplist_deserialize () ¤Ï M-text $MT ¤ò²òÀϤ·¤Æ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤òÊÖ¤¹¡£
+
+ $MT ¤Î¥·¥ó¥¿¥Ã¥¯¥¹¤Ï°Ê²¼¤ÎÄ̤ꡣ
+
+ MT ::= '(' ELEMENT * ')'
+
+ ELEMENT ::= SYMBOL | INTEGER | M-TEXT | PLIST
+
+ SYMBOL ::= ¥¢¥¹¥¡¼Ê¸»úÎó
+
+ INTEGER ::= '-' ? [ '0' | .. | '9' ]+
+ | '0x' [ '0' | .. | '9' | 'A' | .. | 'F' | 'a' | .. | 'f' ]+
+
+ M-TEXT ::= '"' character-sequence '"'
+
+ @c ELEMENT ¤Î³ÆÁªÂò»è¤Ï¥¡¼¡§@c Msymbol, @c Minteger, @c Mtext,
+ @c Mplist ¤Î¤¤¤º¤ì¤«¤ò³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë¡£
+
+ ¥¢¥¹¥¡¼Ê¸»úÎóÆâ¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å (\) ¤¬¥¨¥¹¥±¡¼¥×ʸ»ú¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð
+ <tt>"abc\ def"</tt> ¤Ï 4 ʸ»úÌܤ¬¶õÇòʸ»ú¤Ç¤¢¤êŤµ¤¬ 7
+ ¤Ç¤¢¤ë»ý¤Ä̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÀ¸À®¤¹¤ë¡£ */
MPlist *
mplist_deserialize (MText *mt)
{
+ MPlist *plist;
+ MText *tmp = NULL;
+
if (mt->format > MTEXT_FORMAT_UTF_8)
{
- if (mtext__adjust_format (mt, MTEXT_FORMAT_UTF_8) < 0)
- MERROR (MERROR_PLIST, NULL);
+ if (MTEXT_READ_ONLY_P (mt))
+ mt = tmp = mtext_cpy (mtext (), mt);
+ else
+ mtext__adjust_format (mt, MTEXT_FORMAT_UTF_8);
}
- return mplist__from_string (MTEXT_DATA (mt), mtext_nbytes (mt));
+ plist = mplist__from_string (MTEXT_DATA (mt), mtext_nbytes (mt));
+ if (tmp)
+ M17N_OBJECT_UNREF (tmp);
+ return plist;
}
/*** @} */
/*** @{ */
/***en
- @brief Dump a plist.
+ @brief Dump a property list.
- The mdebug_dump_plist () function prints $PLIST in a human
- readable way to the stderr. $INDENT specifies how many columns to
- indent the lines but the first one.
+ The mdebug_dump_plist () function prints a property list $PLIST in
+ a human readable way to the stderr. $INDENT specifies how many
+ columns to indent the lines but the first one.
@return
This function returns $PLIST. */
+/***ja
+ @brief ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò¥À¥ó¥×¤¹¤ë.
+ ´Ø¿ô mdebug_dump_plist () ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È $PLIST ¤ò stderr
+ ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
+
+ @return
+ ¤³¤Î´Ø¿ô¤Ï $PLIST ¤òÊÖ¤¹¡£ */
MPlist *
mdebug_dump_plist (MPlist *plist, int indent)
{