private UnicodeSet applyPropertyPattern(String pattern,ParsePosition ppos,SymbolTable symbols){
  int pos=ppos.getIndex();
  if ((pos + 5) > pattern.length()) {
    return null;
  }
  boolean posix=false;
  boolean isName=false;
  boolean invert=false;
  if (pattern.regionMatches(pos,"[:",0,2)) {
    posix=true;
    pos=Utility.skipWhitespace(pattern,pos + 2);
    if (pos < pattern.length() && pattern.charAt(pos) == '^') {
      ++pos;
      invert=true;
    }
  }
 else   if (pattern.regionMatches(true,pos,"\\p",0,2) || pattern.regionMatches(pos,"\\N",0,2)) {
    char c=pattern.charAt(pos + 1);
    invert=(c == 'P');
    isName=(c == 'N');
    pos=Utility.skipWhitespace(pattern,pos + 2);
    if (pos == pattern.length() || pattern.charAt(pos++) != '{') {
      return null;
    }
  }
 else {
    return null;
  }
  int close=pattern.indexOf(posix ? ":]" : "}",pos);
  if (close < 0) {
    return null;
  }
  int equals=pattern.indexOf('=',pos);
  String propName, valueName;
  if (equals >= 0 && equals < close && !isName) {
    propName=pattern.substring(pos,equals);
    valueName=pattern.substring(equals + 1,close);
  }
 else {
    propName=pattern.substring(pos,close);
    valueName="";
    if (isName) {
      valueName=propName;
      propName="na";
    }
  }
  applyPropertyAlias(propName,valueName,symbols);
  if (invert) {
    complement();
  }
  ppos.setIndex(close + (posix ? 2 : 1));
  return this;
}

private UnicodeSet applyPropertyPattern ( String pattern , ParsePosition ppos , SymbolTable symbols ) { int pos = ppos . getIndex ( ) ; if ( ( pos + 5 ) > pattern . length ( ) ) { return null ; } boolean posix = false ; boolean isName = false ; boolean invert = false ; if ( pattern . regionMatches ( pos , "[:" , 0 , 2 ) ) { posix = true ; pos = Utility . skipWhitespace ( pattern , pos + 2 ) ; if ( pos < pattern . length ( ) && pattern . charAt ( pos ) == '^' ) { ++ pos ; invert = true ; } } else if ( pattern . regionMatches ( true , pos , "\\p" , 0 , 2 ) || pattern . regionMatches ( pos , "\\N" , 0 , 2 ) ) { char c = pattern . charAt ( pos + 1 ) ; invert = ( c == 'P' ) ; isName = ( c == 'N' ) ; pos = Utility . skipWhitespace ( pattern , pos + 2 ) ; if ( pos == pattern . length ( ) || pattern . charAt ( pos ++ ) != '{' ) { return null ; } } else { return null ; } int close = pattern . indexOf ( posix ? ":]" : "}" , pos ) ; if ( close < 0 ) { return null ; } int equals = pattern . indexOf ( '=' , pos ) ; String propName , valueName ; if ( equals >= 0 && equals < close && ! isName ) { propName = pattern . substring ( pos , equals ) ; valueName = pattern . substring ( equals + 1 , close ) ; } else { propName = pattern . substring ( pos , close ) ; valueName = "" ; if ( isName ) { valueName = propName ; propName = "na" ; } } applyPropertyAlias ( propName , valueName , symbols ) ; if ( invert ) { complement ( ) ; } ppos . setIndex ( close + ( posix ? 2 : 1 ) ) ; return this ; }
parse the given property pattern at the given parse position .
