neilg       2003/01/24 09:28:35

  Modified:    java/src/org/apache/xerces/impl XMLVersionDetector.java
  Log:
  replace logic to reset the current entity character buffer after version detection 
by something which seems a good deal more correct.  It also allows the class to work 
properly when the source of characters is a character reader, rather than a byte 
stream.
  
  Revision  Changes    Path
  1.3       +20 -22    
xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java
  
  Index: XMLVersionDetector.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XMLVersionDetector.java   11 Dec 2002 15:11:40 -0000      1.2
  +++ XMLVersionDetector.java   24 Jan 2003 17:28:35 -0000      1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999-2002 The Apache Software Foundation.  
  + * Copyright (c) 1999-2003 The Apache Software Foundation.  
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -111,7 +111,7 @@
   
       private final static char[] XML11_VERSION = new char[]{'1', '.', '1'};
       private final static char [] EXPECTED_VERSION_STRING = {'<', '?', 'x', 'm', 
'l', ' ', 'v', 'e', 'r', 's', 
  -                    'i', 'o', 'n', '=', ' ', ' ', ' ', ' '};
  +                    'i', 'o', 'n', '=', ' ', ' ', ' ', ' ', ' '};
   
       // this class doesn't do anything that would affect events
       // further down the pipeline; therefore, it doesn't
  @@ -524,7 +524,9 @@
           for (int versionPos=0; versionPos<XML11_VERSION.length; versionPos++) {
               EXPECTED_VERSION_STRING[15+versionPos] = (char)scanner.scanChar();
           } 
  -        fixupCurrentEntity(fEntityManager, EXPECTED_VERSION_STRING, 18);
  +        // REVISIT:  should we check whether this equals quoteChar? 
  +        EXPECTED_VERSION_STRING[18] = (char)scanner.scanChar();
  +        fixupCurrentEntity(fEntityManager, EXPECTED_VERSION_STRING, 19);
           int matched = 0;
           for(; matched<XML11_VERSION.length; matched++) {
               if(EXPECTED_VERSION_STRING[15+matched] != XML11_VERSION[matched]) break;
  @@ -655,27 +657,23 @@
       private void fixupCurrentEntity(XMLEntityManager manager, 
                   char [] scannedChars, int length) {
           XMLEntityManager.ScannedEntity currentEntity = manager.getCurrentEntity();
  -        if(currentEntity.position > length) {
  -            // there's something to do; no point rescanning useless whitespace
  -            // (or perhaps the buffer was reset once already)
  -            System.arraycopy(scannedChars, 0, currentEntity.ch, 0, length);
  -            for(int i=currentEntity.position; i>= length; i--) {
  -                currentEntity.ch[i] = ' ';
  -            } 
  -        } else if (currentEntity.position < length) {
  -            if(currentEntity.count-currentEntity.position+length > 
currentEntity.ch.length) {
  -                //resize array; this case is hard to imagine...
  -                char[] tempCh = currentEntity.ch;
  -                currentEntity.ch = new char[currentEntity.ch.length << 1];
  -                System.arraycopy(tempCh, currentEntity.position, currentEntity.ch, 
0, currentEntity.count-currentEntity.position);
  -                currentEntity.count -= currentEntity.position;
  -                currentEntity.position = 0;
  -            }
  -            // prepend contents...
  +        if(currentEntity.count-currentEntity.position+length > 
currentEntity.ch.length) {
  +            //resize array; this case is hard to imagine...
  +            char[] tempCh = currentEntity.ch;
  +            currentEntity.ch = new 
char[length+currentEntity.count-currentEntity.position+1];
  +            System.arraycopy(tempCh, 0, currentEntity.ch, 0, tempCh.length);
  +        }
  +        if(currentEntity.position < length) {
  +            // have to move sensitive stuff out of the way...
               System.arraycopy(currentEntity.ch, currentEntity.position, 
currentEntity.ch, length, currentEntity.count-currentEntity.position);
  -            System.arraycopy(scannedChars, 0, currentEntity.ch, 0, length);
               currentEntity.count += length-currentEntity.position;
  +        } else {
  +            // have to reintroduce some whitespace so this parses:
  +            for(int i=length; i<currentEntity.position; i++) 
  +                currentEntity.ch[i]=' ';
           }
  +        // prepend contents...
  +        System.arraycopy(scannedChars, 0, currentEntity.ch, 0, length);
           currentEntity.position = 0;
           currentEntity.columnNumber = currentEntity.lineNumber = 1;
       }
  
  
  

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

Reply via email to