Ejemplo n.º 1
0
void xml::lex::getQuote()
{
	if (m_s != 0)
	{
		char ch = m_s->m_xml[m_s->m_offset];
		m_s->m_offset++;
		offsetLine();

		if ((ch == '"') || (ch == '\''))
		{
			if (m_quote == 0)
				m_quote = ch;
			else if ((m_quote != 0) && (ch == m_quote))
				m_quote = 0;
			else
			{
				throw GException("XML Parser", 6, m_line, m_byte);
			}
		}
		else
		{
			throw GException("XML Parser", 6, m_line, m_byte);
		}
	}
}
Ejemplo n.º 2
0
bool LineLayer::Impl::queryIntersectsGeometry(
        const GeometryCollection& queryGeometry,
        const GeometryCollection& geometry,
        const float bearing,
        const float pixelsToTileUnits) const {

    const float halfWidth = getLineWidth() / 2.0 * pixelsToTileUnits;

    auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
            queryGeometry, paint.lineTranslate, paint.lineTranslateAnchor, bearing, pixelsToTileUnits);
    auto offsetGeometry = offsetLine(geometry, paint.lineOffset * pixelsToTileUnits);

    return util::multiPolygonIntersectsBufferedMultiLine(
            translatedQueryGeometry.value_or(queryGeometry),
            offsetGeometry.value_or(geometry),
            halfWidth);
}
Ejemplo n.º 3
0
void xml::lex::getContent(xml::token *tok)
{
	static const char* s_emptyElement = "/>";
	static const char* s_endElement = "</";
	static const char* s_elementEnd = ">";
	static const char* s_cdataStart = "<![CDATA[";
	int nEndlessLoopDetection = 0;
	if (m_s != 0)
	{

contentTop:;
		if (nEndlessLoopDetection++ > 1000)
		{
			// When parsing a XML with an invalid element <@CustomerID>
			// 1000 is well beyond any normal behavior of stream stacks.
			throw GException("XML Parser", 27, m_line, m_byte);
		}
		switch (m_sstate)
		{
			case xml::_xml_element_start :
				if (!m_s)
					throw GException("XML Parser", 28, m_line, m_byte);

				if ((m_s->m_xml[m_s->m_offset] == '<') && 
					(isNameChar(m_s->m_xml[m_s->m_offset + 1])))
				{
					m_s->m_offset++;
					offsetLine();
					tok->m_type = _startTag;
					if (getName(tok) != false)
					{
						GStackPush(m_tagStack,tok->get());

						m_sstate = _xml_element_attribute;

						if ((m_tagStack.m_nNext == 1) &&
							(m_documentType != 0))
						{
							if (memcmp(m_documentType, tok->get(), tok->length()) != 0)
							{
								throw GException("XML Parser", 16, m_line, m_byte);
							}
						}
					}
					else
					{
						throw GException("XML Parser", 11, m_line, m_byte);
					}
				}
				else
				{
					// make sure that the next tag isn't a >
					if (m_s->m_xml[m_s->m_offset + 1] == *s_elementEnd)
						throw GException("XML Parser", 11, m_line, m_byte);
		
					m_sstate = _xml_element_content;
					goto contentTop;
				}

				break;

			case xml::_xml_element_attribute :
				if (handleWhitespace() != false)
				{
					if (getName(tok) != false)
					{
						tok->m_type = _attributeName;
						m_sstate = _xml_element_attribute_value;
					}
					else
					{
						m_sstate = _xml_element_start_end;
						goto contentTop;
					}
				}
				else
				{
					m_sstate = _xml_element_start_end;
					goto contentTop;
				}
				break;

			case xml::_xml_element_start_end :
				if (handleReserved(s_emptyElement) != false)
				{
					// return an empty end tag token
					tok->m_type  = _emptyEndTag;
					m_sstate = _xml_element_start;
				}
				else if (handleReserved(s_elementEnd) != false)
				{
					m_sstate = _xml_element_content;
					goto contentTop;
				}
				else
				{
					throw GException("XML Parser", 8, m_line, m_byte);
				}

				break;

			case xml::_xml_element_attribute_value :
				getEqual();
				getQuote();
				tok->m_type = _pcdata;
				getAttribute(tok);
				getQuote();
				m_sstate = _xml_element_attribute;

				break;

			case xml::_xml_element_content :
				if (getCharacterData(tok) != false)
					tok->m_type = _pcdata;
				else if (handleReserved(s_cdataStart) != false)
				{
					getCData(tok);
					tok->m_type = _cdata;
				}
				else
				{
					getMisc(tok);

					if (tok->m_type == _unknown)
					{
						m_sstate = _xml_element_end_tag;
						goto contentTop;
					}
				}
				break;

			case xml::_xml_element_end_tag :
				handleWhitespace();
				if (handleReserved(s_endElement) != false)
				{
					tok->m_type = _endTag;
					getName(tok);

					m_sstate = _xml_element_end_end;
				}
				else if (m_tagStack.m_nNext)
				{
					m_sstate = _xml_element_start;
					goto contentTop;
				}
				break;

			case xml::_xml_element_end_end :
				handleWhitespace();
				if (handleReserved(s_elementEnd) == false)
				{
					throw GException("XML Parser", 8, m_line, m_byte);
				}

				m_sstate = _xml_element_start;
				goto contentTop;

				break;
		}
	}

	if ((tok->m_type == _endTag) || 
		(tok->m_type == _emptyEndTag))
	{
		// throw an exception if the end tag
		// doesn't match the last start tag
		GStackPopType(m_tagStack,tag,char *)
		if ( (tok->isEmpty() == false) && (tag != 0) )
		{
			if (memcmp(tag, tok->get(), tok->length()) != 0)
			{
				GString strStartTag;
				while ((tag) && (*tag != '>') && (!isWhitespace(*tag)))
				{
					strStartTag += *tag;
					tag++;
				}
				GString strEndTag(tok->get(), tok->length());
				throw GException("XML Parser", 12, (const char *)strEndTag, (const char *)strStartTag,m_line, m_byte);
			}
		}

		if (m_tagStack.m_nNext == 0)
		{
			m_state = xml::_finished;
			m_nextState = xml::_finished;

			if ((tok->m_type == _endTag) && (handleReserved(s_elementEnd) == false))
			{
				throw GException("XML Parser", 8, m_line, m_byte);
			}
		}
	}