Example #1
0
static char *xml_parse_meta_text(ACL_XML3 *xml, char *data)
{
	int   ch;

	if (xml->curr_node->text == xml->addr)
		SKIP_SPACE(data);

	if (*data == 0)
		return data;

	if (xml->curr_node->text == xml->addr)
		xml->curr_node->text = data;

	while ((ch = *data) != 0) {
		if (xml->curr_node->quote) {
			if (ch == xml->curr_node->quote)
				xml->curr_node->quote = 0;
		} else if (IS_QUOTE(ch)) {
			if (xml->curr_node->quote == 0)
				xml->curr_node->quote = ch;
		} else if (ch == '<') {
			xml->curr_node->nlt++;
		} else if (ch != '>') {
			;
		} else if (xml->curr_node->nlt == 0) {
			char *last;

			xml->curr_node->text_size = data - xml->curr_node->text;
			xml->curr_node->status = ACL_XML3_S_MEND;
			*data++ = 0;

			if ((xml->curr_node->flag & ACL_XML3_F_META_QM) == 0)
				break;

			last = data;
			while (last > xml->curr_node->text) {
				if (*last == '?') {
					xml->curr_node->text_size = last -
						xml->curr_node->text;
					*last = 0;
					break;
				}
				last--;
			}
			if (last == xml->curr_node->text)
				break;

			xml_meta_attr(xml->curr_node);
			break;
		} else {
			xml->curr_node->nlt--;
		}

		data++;
	}

	return data;
}
Example #2
0
static const char *xml_parse_meta_text(ACL_XML *xml, const char *data)
{
	int   ch;

	if (LEN(xml->curr_node->text) == 0) {
		SKIP_SPACE(data);
	}

	while ((ch = *data) != 0) {
		if (xml->curr_node->quote) {
			if (ch == xml->curr_node->quote) {
				xml->curr_node->quote = 0;
			}
			ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		} else if (IS_QUOTE(ch)) {
			if (xml->curr_node->quote == 0) {
				xml->curr_node->quote = ch;
			}
			ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		} else if (ch == '<') {
			xml->curr_node->nlt++;
			ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		} else if (ch == '>') {
			if (xml->curr_node->nlt == 0) {
				char *last;
				size_t off;

				data++;
				xml->curr_node->status = ACL_XML_S_MEND;
				if ((xml->curr_node->flag & ACL_XML_F_META_QM) == 0)
					break;

				last = acl_vstring_end(xml->curr_node->text) - 1;
				if (last < STR(xml->curr_node->text) || *last != '?')
					break;
				off = ACL_VSTRING_LEN(xml->curr_node->text) - 1;
				if (off == 0)
					break;
				ACL_VSTRING_AT_OFFSET(xml->curr_node->text, off);
				ACL_VSTRING_TERMINATE(xml->curr_node->text);
				xml_meta_attr(xml->curr_node);
				break;
			}
			xml->curr_node->nlt--;
			ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		} else {
			ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		}
		data++;
	}

	ACL_VSTRING_TERMINATE(xml->curr_node->text);
	return (data);
}
Example #3
0
static const char *xml_parse_meta_text(ACL_XML2 *xml, const char *data)
{
    int   ch;

    if (xml->curr_node->text == xml->addr)
        SKIP_SPACE(data);

    if (*data == 0)
        return data;

    if (xml->curr_node->text == xml->addr)
        xml->curr_node->text = xml->ptr;

    while ((ch = *data) != 0) {
        if (xml->curr_node->quote) {
            if (xml->len < MIN_LEN)
                return data;
            if (ch == xml->curr_node->quote)
                xml->curr_node->quote = 0;
            xml->len--;
            *xml->ptr++ = ch;
        } else if (IS_QUOTE(ch)) {
            if (xml->len < MIN_LEN)
                return data;
            if (xml->curr_node->quote == 0)
                xml->curr_node->quote = ch;
            xml->len--;
            *xml->ptr++ = ch;
        } else if (ch == '<') {
            if (xml->len < MIN_LEN)
                return data;
            xml->curr_node->nlt++;
            xml->len--;
            *xml->ptr++ = ch;
        } else if (ch != '>') {
            if (xml->len < MIN_LEN)
                return data;
            xml->len--;
            *xml->ptr++ = ch;
        } else if (xml->curr_node->nlt == 0) {
            char *last;

            if (xml->len < MIN_LEN)
                return data;

            data++;
            xml->len--;
            xml->curr_node->text_size = xml->ptr -
                                        xml->curr_node->text;
            *xml->ptr++ = 0;
            xml->curr_node->status = ACL_XML2_S_MEND;

            if ((xml->curr_node->flag & ACL_XML2_F_META_QM) == 0)
                break;

            last = xml->ptr - 1;
            while (last > xml->curr_node->text) {
                if (*last == '?') {
                    *last = 0;
                    xml->curr_node->text_size = last -
                                                xml->curr_node->text;
                    break;
                }
                last--;
            }
            if (last == xml->curr_node->text)
                break;

            xml_meta_attr(xml->curr_node);
            break;
        } else {
            if (xml->len < MIN_LEN)
                return data;
            xml->curr_node->nlt--;
            xml->len--;
            *xml->ptr++ = ch;
        }

        data++;
    }

    if (xml->curr_node->status == ACL_XML2_S_MEND
            && (xml->flag & ACL_XML2_FLAG_XML_DECODE)
            && xml->curr_node->text_size > 0 && xml->len > 0)
    {
        const char *txt = xml->curr_node->text;

        xml->curr_node->text = xml->ptr;
        (void) acl_xml_decode2(txt, &xml->ptr, &xml->len);
        xml->curr_node->text_size = xml->ptr
                                    - xml->curr_node->text - 1;
    }

    return data;
}
Example #4
0
static const char *xml_parse_meta_text(ACL_XML2 *xml, const char *data)
{
	int   ch;

	if (xml->curr_node->text == xml->dummy)
		SKIP_SPACE(data);

	if (*data == 0)
		return data;

	if (xml->curr_node->text == xml->dummy)
		xml->curr_node->text = END(xml);

	while ((ch = *data) != 0) {
		if (xml->curr_node->quote) {
			if (NO_SPACE(xml))
				return data;
			if (ch == xml->curr_node->quote)
				xml->curr_node->quote = 0;
			ADD(xml, ch);
		} else if (IS_QUOTE(ch)) {
			if (NO_SPACE(xml))
				return data;
			if (xml->curr_node->quote == 0)
				xml->curr_node->quote = ch;
			ADD(xml, ch);
		} else if (ch == '<') {
			if (NO_SPACE(xml))
				return data;
			xml->curr_node->nlt++;
			ADD(xml, ch);
		} else if (ch != '>') {
			if (NO_SPACE(xml))
				return data;
			ADD(xml, ch);
		} else if (xml->curr_node->nlt == 0) {
			char *last;

			if (NO_SPACE(xml))
				return data;

			xml->curr_node->text_size =
				END(xml) - xml->curr_node->text;
			xml->curr_node->status = ACL_XML2_S_MEND;

			ADD(xml, '\0');
			data++;

			if ((xml->curr_node->flag & ACL_XML2_F_META_QM) == 0)
				break;

			last = END(xml) - 1;
			while (last > xml->curr_node->text) {
				if (*last == '?') {
					*last = 0;
					xml->curr_node->text_size = last -
						xml->curr_node->text;
					break;
				}
				last--;
			}
			if (last == xml->curr_node->text)
				break;

			xml_meta_attr(xml->curr_node);
			break;
		} else {
			if (NO_SPACE(xml))
				return data;
			xml->curr_node->nlt--;
			ADD(xml, ch);
		}

		data++;
	}

	if (xml->curr_node->status == ACL_XML2_S_MEND
		&& (xml->flag & ACL_XML2_FLAG_XML_DECODE)
		&& xml->curr_node->text_size > 0 && !NO_SPACE(xml))
	{
		const char *txt = xml->curr_node->text;

		xml->curr_node->text = END(xml);
		(void) acl_xml_decode(txt, xml->vbuf);
		xml->curr_node->text_size = END(xml) - xml->curr_node->text;
		ADD(xml, '\0');  /* skip one byte */
	}

	return data;
}