static List<String> readExtensions(final SubstringReader reader) throws DecodeException {
  int length=0;
  List<String> values;
  reader.skipWhitespaces();
  reader.mark();
  try {
    char c=reader.read();
    if (c == '\'') {
      reader.mark();
      while (reader.read() != '\'') {
        length++;
      }
      reader.reset();
      values=Collections.singletonList(reader.read(length));
      reader.read();
    }
 else     if (c == '(') {
      reader.skipWhitespaces();
      reader.mark();
      c=reader.read();
      if (c == ')') {
        values=Collections.emptyList();
      }
 else {
        values=new ArrayList<>();
        do {
          reader.reset();
          values.add(readQuotedString(reader));
          reader.skipWhitespaces();
          reader.mark();
        }
 while (reader.read() != ')');
        values=Collections.unmodifiableList(values);
      }
    }
 else {
      do {
        length++;
      }
 while (reader.read() != ' ');
      reader.reset();
      values=Collections.singletonList(reader.read(length));
    }
    return values;
  }
 catch (  final StringIndexOutOfBoundsException e) {
    throw DecodeException.error(ERR_ATTR_SYNTAX_TRUNCATED_VALUE1.get());
  }
}

static List < String > readExtensions ( final SubstringReader reader ) throws DecodeException { int length = 0 ; List < String > values ; reader . skipWhitespaces ( ) ; reader . mark ( ) ; try { char c = reader . read ( ) ; if ( c == '\'' ) { reader . mark ( ) ; while ( reader . read ( ) != '\'' ) { length ++ ; } reader . reset ( ) ; values = Collections . singletonList ( reader . read ( length ) ) ; reader . read ( ) ; } else if ( c == '(' ) { reader . skipWhitespaces ( ) ; reader . mark ( ) ; c = reader . read ( ) ; if ( c == ')' ) { values = Collections . emptyList ( ) ; } else { values = new ArrayList < > ( ) ; do { reader . reset ( ) ; values . add ( readQuotedString ( reader ) ) ; reader . skipWhitespaces ( ) ; reader . mark ( ) ; } while ( reader . read ( ) != ')' ) ; values = Collections . unmodifiableList ( values ) ; } } else { do { length ++ ; } while ( reader . read ( ) != ' ' ) ; reader . reset ( ) ; values = Collections . singletonList ( reader . read ( length ) ) ; } return values ; } catch ( final StringIndexOutOfBoundsException e ) { throw DecodeException . error ( ERR_ATTR_SYNTAX_TRUNCATED_VALUE1 . get ( ) ) ; } }
reads the value for an " extra " parameter . it will handle a single unquoted word ( which is technically illegal , but we ' ll allow it ) , a single quoted string , or an open parenthesis followed by a space - delimited set of quoted strings or unquoted words followed by a close parenthesis .
