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); } } }
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); }
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); } } }