TransferToken readToken(Reader in) throws IOException {
    if (!input_buffer.isEmpty()) {
      return input_buffer.next();
    }

    String content = "";
    while (true) {
      int val = in.read();
      if (val == -1 || (val == 0 && internal_null_flush)) {
        return input_buffer.add(new TransferToken(content, TransferToken.TransferTokenType.tt_eof));
      }
      if (val == '\\') {
        content += '\\';
        content += (char) in.read();
      } else if (val == '[') {
        content += '[';
        while (true) {
          int val2 = in.read();
          if (val2 == '\\') {
            content += '\\';
            content += (char) in.read();
          } else if (val2 == ']') {
            content += ']';
            break;
          } else {
            content += (char) val2;
          }
        }
      } else if (val == '$') {
        return input_buffer.add(
            new TransferToken(content, TransferToken.TransferTokenType.tt_word));
      } else if (val == '^') {
        return input_buffer.add(
            new TransferToken(content, TransferToken.TransferTokenType.tt_blank));
      } else {
        content += (char) val;
      }
    }
  }