{% from 'macros.tmpl' import license %} {{license()}} {% macro trie_switch(trie, index) %} {# FIXME: No need to switch if there's only a single item in the subtrie: can just have an if statement as we're currently doing for leaves. #} switch (data[{{index}}]) { {% for char, subtrie, tag, conditions in trie %} case '{{char}}': {% if subtrie %}{# Recurse on subtrie #} {{trie_switch(subtrie, index + 1) | indent}} {% elif conditions %}{# Check suffix #} if ({{conditions | join(' && ')}}) return {{tag}}Tag.localName().impl(); return 0; {% else %}{# Terminal node (no suffix) #} return {{tag}}Tag.localName().impl(); {% endif %} {% endfor %} } return 0; {% endmacro %} #include "config.h" #include "{{namespace}}ElementLookupTrie.h" #include "{{namespace}}Names.h" namespace blink { using namespace {{namespace}}Names; StringImpl* lookup{{namespace}}Tag(const UChar* data, unsigned length) { ASSERT(data); ASSERT(length); switch (length) { {% for length, trie in length_tries %} case {{length}}: {{trie_switch(trie, 0) | indent(8)}} {% endfor %} } return 0; } } // namespace blink