| {% 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 |