void read(Tokeniser t, CharacterReader r) {
      if (r.matchesLetter()) {
        String name = r.consumeLetterSequence();
        t.tagPending.appendTagName(name.toLowerCase());
        t.dataBuffer.append(name);
        return;
      }

      char c = r.consume();
      switch (c) {
        case '\t':
        case '\n':
        case '\r':
        case '\f':
        case ' ':
          if (t.isAppropriateEndTagToken()) t.transition(BeforeAttributeName);
          else anythingElse(t, r);
          break;
        case '/':
          if (t.isAppropriateEndTagToken()) t.transition(SelfClosingStartTag);
          else anythingElse(t, r);
          break;
        case '>':
          if (t.isAppropriateEndTagToken()) {
            t.emitTagPending();
            t.transition(Data);
          } else anythingElse(t, r);
          break;
        default:
          anythingElse(t, r);
      }
    }