code: private String readDTDNmtoken(char c)
          throws XMLStreamException
      {
          char[] outBuf = getNameBuffer(64);
          int outLen = outBuf.length;
          int outPtr = 0;
  
          while (true) {
              /* Note: colon not included in name char array, since it has
               * special meaning WRT QNames, need to add into account here:
               */
              if (!isNameChar(c)  && c != ':') {
                  // Need to get at least one char
                  if (outPtr == 0) {
                      throwDTDUnexpectedChar(c, "; expected a NMTOKEN character to start a NMTOKEN");
                  }
                  --mInputPtr;
                  break;
              }
              if (outPtr >= outLen) {
                  outBuf = expandBy50Pct(outBuf);
                  outLen = outBuf.length;
              }
              outBuf[outPtr++] = c;
              if (mInputPtr < mInputEnd) {
                  c = mInputBuffer[mInputPtr++];
              } else {
                  c = dtdNextIfAvailable();
                  if (c == CHAR_NULL) { // end-of-block
                      break;
                  }
              }
          }
  
          /* Nmtokens need not be canonicalized; they will be processed
           * as necessary later on:
           */
          return new String(outBuf, 0, outPtr);
      }
docs: Similar to {@link #readDTDName}, except that the rules are bit looser,
  ie. there are no additional restrictions for the first char