mrglavas    2005/06/23 08:55:18

  Modified:    java/src/org/apache/xerces/impl/xpath/regex
                        ParserForXMLSchema.java
  Log:
  Implementing first edition erratum E2-67:
  http://www.w3.org/2001/05/xmlschema-errata#e2-67
  
  This reallows character ranges which look like [-+] and [+-].
  The XHTML schema [1] makes use of such character ranges
  and was rejected by Xerces 2.6.2. We're now able to
  process it.
  
  Thanks to Ankit Pasricha for providing this patch.
  
  [1] http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd
  
  Revision  Changes    Path
  1.9       +19 -4     
xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/ParserForXMLSchema.java
  
  Index: ParserForXMLSchema.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/ParserForXMLSchema.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ParserForXMLSchema.java   22 Mar 2005 03:22:37 -0000      1.8
  +++ ParserForXMLSchema.java   23 Jun 2005 15:55:18 -0000      1.9
  @@ -169,6 +169,7 @@
           this.setContext(S_INBRACKETS);
           this.next();                            // '['
           boolean nrange = false;
  +        boolean wasDecoded = false;                  // used to detect if 
the last - was escaped.
           RangeToken base = null;
           RangeToken tok;
           if (this.read() == T_CHAR && this.chardata == '^') {
  @@ -183,6 +184,8 @@
           int type;
           boolean firstloop = true;
           while ((type = this.read()) != T_EOF) { // Don't use 'cotinue' for 
this loop.
  +             
  +             wasDecoded = false;
               // single-range | from-to-range | subtraction
               if (type == T_CHAR && this.chardata == ']' && !firstloop) {
                   if (nrange) {
  @@ -216,6 +219,11 @@
                       tok.mergeRanges(tok2);
                       end = true;
                       break;
  +                   
  +                 case '-':
  +                     c = this.decodeEscaped();
  +                     wasDecoded = true;
  +                     break;
   
                     default:
                       c = this.decodeEscaped();
  @@ -238,7 +246,10 @@
                   if (type == T_CHAR) {
                       if (c == '[')  throw this.ex("parser.cc.6", 
this.offset-2);
                       if (c == ']')  throw this.ex("parser.cc.7", 
this.offset-2);
  -                    if (c == '-')  throw this.ex("parser.cc.8", 
this.offset-2);
  +                    if (c == '-' && this.chardata == ']' && firstloop)  
throw this.ex("parser.cc.8", this.offset-2); // if regex = '[-]' then invalid
  +                }
  +                if(c == '-' && this.chardata == '-' && this.read() != 
T_BACKSOLIDUS && !wasDecoded) {
  +                     throw this.ex("parser.cc.8", this.offset-2);
                   }
                   if (this.read() != T_CHAR || this.chardata != '-') { // Here 
is no '-'.
                       tok.addRange(c, c);
  @@ -247,10 +258,14 @@
                       this.next(); // Skips '-'
                       if ((type = this.read()) == T_EOF)  throw 
this.ex("parser.cc.2", this.offset);
                                                   // c '-' ']' -> '-' is a 
single-range.
  -                    if ((type == T_CHAR && this.chardata == ']')
  -                        || type == T_XMLSCHEMA_CC_SUBTRACTION) {
  +                    if(type == T_CHAR && this.chardata == ']') {             
                // if - is at the last position of the group
  +                     tok.addRange(c, c);
  +                     tok.addRange('-', '-');
  +                    }
  +                    else if (type == T_XMLSCHEMA_CC_SUBTRACTION) {
                           throw this.ex("parser.cc.8", this.offset-1);
                       } else {
  +                     
                           int rangeend = this.chardata;
                           if (type == T_CHAR) {
                               if (rangeend == '[')  throw 
this.ex("parser.cc.6", this.offset-1);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to