/* plist.c -- plist 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
static MPlist *
read_mtext_element (MPlist *plist, MStream *st, int skip)
{
- union {
- int chars[READ_MTEXT_BUF_SIZE];
- unsigned char bytes[sizeof (int) * READ_MTEXT_BUF_SIZE];
- } buffer;
- unsigned char *bytes = buffer.bytes;
- int nbytes = sizeof (int) * READ_MTEXT_BUF_SIZE;
- int *chars = NULL;
- int nchars = 0;
- int c, i, j;
+ unsigned char buffer[READ_MTEXT_BUF_SIZE], *buf = buffer;
+ int nbytes = READ_MTEXT_BUF_SIZE;
+ int c, i;
i = 0;
while ((c = GETC (st)) != EOF && c != '"')
if (! skip)
{
- if (is_char && ! chars)
+ if (i + MAX_UTF8_CHAR_BYTES >= nbytes)
{
- chars = buffer.chars;
- for (j = i - 1; j >= 0; j--)
- chars[j] = bytes[j];
- nchars = READ_MTEXT_BUF_SIZE;
- if (bytes != buffer.bytes)
- free (bytes);
- }
-
- if (chars)
- {
- if (i + 1 >= nchars)
+ if (buf == buffer)
{
- nchars *= 2;
- if (chars == buffer.chars)
- {
- MTABLE_MALLOC (chars, nchars, MERROR_PLIST);
- memcpy (chars, buffer.chars, sizeof (int) * i);
- }
- else
- MTABLE_REALLOC (chars, nchars, MERROR_PLIST);
+ nbytes *= 2;
+ buf = malloc (nbytes);
+ memcpy (buf, buffer, i);
}
- chars[i++] = c;
- }
- else
- {
- if (i + MAX_UTF8_CHAR_BYTES >= nbytes)
+ else
{
- nbytes *= 2;
- if (bytes == buffer.bytes)
- {
- MTABLE_MALLOC (bytes, nbytes, MERROR_PLIST);
- memcpy (bytes, buffer.bytes, i);
- }
- else
- MTABLE_REALLOC (bytes, nbytes, MERROR_PLIST);
+ nbytes += READ_MTEXT_BUF_SIZE;
+ buf = realloc (buf, nbytes);
}
- bytes[i++] = c;
}
+
+ if (is_char)
+ i += CHAR_STRING_UTF8 (c, buf);
+ else
+ buf[i++] = c;
}
}
if (! skip)
{
- MText *mt;
-
- if (chars)
- {
- mt = mtext__from_data (chars, i, MTEXT_FORMAT_UTF_32, 1);
- if (chars != buffer.chars)
- free (chars);
- }
- else
- {
- mt = mtext__from_data (bytes, i, MTEXT_FORMAT_UTF_8, 1);
- if (bytes != buffer.bytes)
- free (bytes);
- }
+ MText *mt = mtext__from_data (buf, i, MTEXT_FORMAT_UTF_8,
+ (buf == buffer));
+ if (buf != buffer)
+ mt->allocated = nbytes;
MPLIST_SET_ADVANCE (plist, Mtext, mt);
}
return plist;
Msymbol, @c Minteger, @c Mtext, @c Mplist
In an ascii-character-sequence, a backslash (\) is used as the escape
- character, which means that, for instance, <tt>"abc\ def"</tt>
+ 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
@c Mplist ¤Î¤¤¤º¤ì¤«¤ò³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë¡£
¥¢¥¹¥¡¼Ê¸»úÎóÆâ¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å (\) ¤¬¥¨¥¹¥±¡¼¥×ʸ»ú¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£¤¿¤È¤¨¤Ð
- <tt>"abc\ def"</tt> ¤Ï 4 ʸ»úÌܤ¬¶õÇòʸ»ú¤Ç¤¢¤êŤµ¤¬ 7
+ <tt>abc\ def</tt> ¤Ï 4 ʸ»úÌܤ¬¶õÇòʸ»ú¤Ç¤¢¤êŤµ¤¬ 7
¤Ç¤¢¤ë»ý¤Ä̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÀ¸À®¤¹¤ë¡£ */
MPlist *