jkesselm    2002/05/31 13:37:04

  Modified:    java/src/org/apache/xml/utils FastStringBuffer.java
  Log:
  Starting branch for Xalan3
  
  Revision  Changes    Path
  1.20      +122 -1    xml-xalan/java/src/org/apache/xml/utils/FastStringBuffer.java
  
  Index: FastStringBuffer.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/utils/FastStringBuffer.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- FastStringBuffer.java     22 Apr 2002 19:26:02 -0000      1.19
  +++ FastStringBuffer.java     31 May 2002 20:37:04 -0000      1.20
  @@ -966,7 +966,7 @@
   
       return sb;
     }
  -
  +  
     /**
      * Get a single character from the string buffer.
      *
  @@ -1372,5 +1372,126 @@
       source.m_chunkBits += m_rebundleBits;
       source.m_chunkSize = 1 << (source.m_chunkBits);
       source.m_chunkMask = source.m_chunkSize - 1;
  +  }
  +
  +  /** Yield substring value as a sequence of Character Blocks
  +     * @return a CharacterBlockEnumeration displaying the contents of
  +     * this object's string value (as in str()). May be empty, may
  +     * yield multiple blocks depending on the FSB's contents. (The latter
  +     * case is why we need to enumerate, of course!)
  +     * 
  +     * @param start Offset of first character to be delivered
  +     * @param length Number of contiguous characters to be delivered
  +     * */
  +  public org.apache.xml.utils.CharacterBlockEnumeration 
enumerateCharacterBlocks(int start,int length)
  +  {
  +     // %REVIEW% %OPT% I'm not sure this is an optimization. Depends on
  +     // how retrieval of char[] from String works in any given JVM.
  +     // See comments in CharacterBlockEnumeration, and run some tests.
  +     return new FSBCharacterBlockEnumeration(start,length);
  +  }
  +  
  +  /** FSB-specific implementation of CharacterBlockEnumeration.
  +   * 
  +   * NOTE: This is _NOT_ guaranteed to tolerate attempts to modify the
  +   * FSB's contents while it is executing!
  +   * 
  +   * Inner class, since it's accessing FSB's implementation details
  +   * and might as well leverage its ability to access the associated FSB.
  +   * */
  +  protected class FSBCharacterBlockEnumeration
  +  extends org.apache.xml.utils.CharacterBlockEnumeration
  +  {
  +     int e_chunk; // Current enumeration position
  +     int e_toBeDelivered; // Current enumeration status
  +     
  +     /** Construct this enumeration 
  +      * 
  +      * %BUG% Does not currently support m_innerFSB. (I'm still deciding
  +      * whether to rip out the innerFSB support entirely, or to fix it.)
  +      * 
  +      * @param start Starting offset, in characters. If past available data,
  +      *   we return a single empty block.
  +      * @param length Number of characters to deliver. If start+length is
  +      *   past available data, length will be truncated to fit.
  +      * */   
  +     public FSBCharacterBlockEnumeration(int start,int length)
  +     {
  +             if(m_innerFSB!=null)
  +              throw new java.lang.UnsupportedOperationException("Inner FSB not yet 
implemented. Oops.");                     
  +             
  +             int fsblength=length();
  +             if (start<=fsblength)
  +             { 
  +                     int max=fsblength-start;
  +                     e_toBeDelivered=(length<max) ? length : max;
  +  
  +                     // Set up to display first chunk                
  +                     e_chunk=start>>m_chunkBits;
  +                     _chars=m_array[e_chunk];
  +                     _start=start&m_chunkBits;
  +                     max=m_chunkSize-_start;
  +                     _length=(max<=e_toBeDelivered) ? max : e_toBeDelivered;
  +                     // and decrement what's left to go
  +                     e_toBeDelivered -= _length;
  +             }
  +             else
  +             {
  +                     // Off the end. We can just leave it empty.
  +             }
  +     }
  +
  +     /** Disable superclass's ctor
  +      * @throws java.lang.UnsupportedOperationException since not appropriate here.
  +      * */
  +     public FSBCharacterBlockEnumeration(String s)
  +     { throw new java.lang.UnsupportedOperationException("Inappropriate ctor for 
this subclass"); 
  +     }
  +     /** Disable superclass's ctor
  +      * @throws java.lang.UnsupportedOperationException since not appropriate here.
  +      * */
  +     public FSBCharacterBlockEnumeration(String s, int start, int length)
  +     { throw new java.lang.UnsupportedOperationException("Inappropriate ctor for 
this subclass"); 
  +     }
  +     /** Disable superclass's ctor
  +      * @throws java.lang.UnsupportedOperationException since not appropriate here.
  +      * */
  +     public FSBCharacterBlockEnumeration(char[] ch)
  +     { throw new java.lang.UnsupportedOperationException("Inappropriate ctor for 
this subclass"); 
  +     }
  +     /** Disable superclass's ctor
  +      * @throws java.lang.UnsupportedOperationException since not appropriate here.
  +      * */
  +     public FSBCharacterBlockEnumeration(char[] ch, int start, int length)
  +     { throw new java.lang.UnsupportedOperationException("Inappropriate ctor for 
this subclass"); 
  +     }
  +             
  +     /** @return true if another character block can be accessed by calling
  +      * nextElement()
  +      */
  +     public boolean hasMoreElements()
  +     { 
  +             return e_toBeDelivered > 0; 
  +     }
  +     
  +     /** Advance to the next character block. 
  +      * 
  +      * @returns either this CharacterBlockEnumeration object (as a
  +      * transient accessor to the "element") or null if no more elements are 
available.
  +      * This is a bit of a kluge, but it allows us to claim that we
  +      * implement the Java Enumeration interface if we want to do so, and
  +      * it seems to be as good or bad as any other return value.
  +      * */
  +     public Object nextElement()
  +     {
  +             // Set up to display next chunk         
  +             _chars=m_array[++e_chunk];
  +             _start=0;
  +             _length=(m_chunkSize<=e_toBeDelivered) ? m_chunkSize : e_toBeDelivered;
  +             // and decrement what's left to go
  +             e_toBeDelivered -= _length;
  +             
  +             return (e_toBeDelivered>0) ? this : null;
  +     }  
     }
   }
  
  
  

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

Reply via email to