2004-05-04 Guilhem Lavaux <guilhem@kaffe.org>
authormkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2004 16:27:20 +0000 (16:27 +0000)
committermkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2004 16:27:20 +0000 (16:27 +0000)
* gnu/java/text/FormatBuffer.java,
gnu/java/text/AttributedFormatBuffer.java,
gnu/java/text/StringFormatBuffer.java: New classes to implement
attributed iterators in java.text.
* gnu/java/text/FormatCharacterIterator.java: Moved
from java/text as it is an internal class.
* java/text/FormatCharacterIterator.java: Removed.
* java/text/Format.java:
Import gnu.java.text.FormatCharacterIterator.
* Makefile.am (java_source_files): Added new files.
* Makefile.in: Regenerated.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81479 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/gnu/java/text/AttributedFormatBuffer.java [new file with mode: 0644]
libjava/gnu/java/text/FormatBuffer.java [new file with mode: 0644]
libjava/gnu/java/text/FormatCharacterIterator.java [moved from libjava/java/text/FormatCharacterIterator.java with 83% similarity]
libjava/gnu/java/text/StringFormatBuffer.java [new file with mode: 0644]
libjava/java/text/Format.java

index 30f0880..2a7bfa3 100644 (file)
@@ -1,3 +1,18 @@
+2004-05-04  Guilhem Lavaux <guilhem@kaffe.org>
+
+       * gnu/java/text/FormatBuffer.java,
+       gnu/java/text/AttributedFormatBuffer.java,
+       gnu/java/text/StringFormatBuffer.java: New classes to implement
+       attributed iterators in java.text.
+       * gnu/java/text/FormatCharacterIterator.java: Moved 
+       from java/text as it is an internal class.
+       * java/text/FormatCharacterIterator.java: Removed.
+       * java/text/Format.java:
+       Import gnu.java.text.FormatCharacterIterator.
+       * Makefile.am (java_source_files): Added new files.
+       * Makefile.in: Regenerated.
+       
+
 2004-05-04  Mark Wielaard  <mark@klomp.org>
 
        * gnu/java/nio/channels/FileChannelImpl.java (finalize): New method.
index cc2cfbc..0acbb88 100644 (file)
@@ -2469,10 +2469,14 @@ gnu/java/security/x509/X500DistinguishedName.java \
 gnu/java/security/x509/X509Certificate.java \
 gnu/java/security/x509/X509CRLEntry.java \
 gnu/java/security/x509/X509CRL.java \
+gnu/java/text/AttributedFormatBuffer.java \
 gnu/java/text/BaseBreakIterator.java \
 gnu/java/text/CharacterBreakIterator.java \
+gnu/java/text/FormatBuffer.java \
+gnu/java/text/FormatCharacterIterator.java \
 gnu/java/text/LineBreakIterator.java \
 gnu/java/text/SentenceBreakIterator.java \
+gnu/java/text/StringFormatBuffer.java \
 gnu/java/text/WordBreakIterator.java \
 gnu/java/util/DoubleEnumeration.java \
 gnu/java/util/EmptyEnumeration.java \
@@ -2812,7 +2816,6 @@ java/text/DecimalFormat.java \
 java/text/DecimalFormatSymbols.java \
 java/text/FieldPosition.java \
 java/text/Format.java \
-java/text/FormatCharacterIterator.java \
 java/text/MessageFormat.java \
 java/text/NumberFormat.java \
 java/text/ParseException.java \
index 0e3be8d..1605cbf 100644 (file)
@@ -2141,10 +2141,14 @@ gnu/java/security/x509/X500DistinguishedName.java \
 gnu/java/security/x509/X509Certificate.java \
 gnu/java/security/x509/X509CRLEntry.java \
 gnu/java/security/x509/X509CRL.java \
+gnu/java/text/AttributedFormatBuffer.java \
 gnu/java/text/BaseBreakIterator.java \
 gnu/java/text/CharacterBreakIterator.java \
+gnu/java/text/FormatBuffer.java \
+gnu/java/text/FormatCharacterIterator.java \
 gnu/java/text/LineBreakIterator.java \
 gnu/java/text/SentenceBreakIterator.java \
+gnu/java/text/StringFormatBuffer.java \
 gnu/java/text/WordBreakIterator.java \
 gnu/java/util/DoubleEnumeration.java \
 gnu/java/util/EmptyEnumeration.java \
@@ -2484,7 +2488,6 @@ java/text/DecimalFormat.java \
 java/text/DecimalFormatSymbols.java \
 java/text/FieldPosition.java \
 java/text/Format.java \
-java/text/FormatCharacterIterator.java \
 java/text/MessageFormat.java \
 java/text/NumberFormat.java \
 java/text/ParseException.java \
@@ -3410,10 +3413,14 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .deps/gnu/java/security/x509/X509CRL.P \
 .deps/gnu/java/security/x509/X509CRLEntry.P \
 .deps/gnu/java/security/x509/X509Certificate.P \
+.deps/gnu/java/text/AttributedFormatBuffer.P \
 .deps/gnu/java/text/BaseBreakIterator.P \
 .deps/gnu/java/text/CharacterBreakIterator.P \
+.deps/gnu/java/text/FormatBuffer.P \
+.deps/gnu/java/text/FormatCharacterIterator.P \
 .deps/gnu/java/text/LineBreakIterator.P \
 .deps/gnu/java/text/SentenceBreakIterator.P \
+.deps/gnu/java/text/StringFormatBuffer.P \
 .deps/gnu/java/text/WordBreakIterator.P \
 .deps/gnu/java/util/DoubleEnumeration.P \
 .deps/gnu/java/util/EmptyEnumeration.P \
@@ -4148,7 +4155,6 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .deps/java/text/DateFormat.P .deps/java/text/DateFormatSymbols.P \
 .deps/java/text/DecimalFormat.P .deps/java/text/DecimalFormatSymbols.P \
 .deps/java/text/FieldPosition.P .deps/java/text/Format.P \
-.deps/java/text/FormatCharacterIterator.P \
 .deps/java/text/MessageFormat.P .deps/java/text/NumberFormat.P \
 .deps/java/text/ParseException.P .deps/java/text/ParsePosition.P \
 .deps/java/text/RuleBasedCollator.P .deps/java/text/SimpleDateFormat.P \
diff --git a/libjava/gnu/java/text/AttributedFormatBuffer.java b/libjava/gnu/java/text/AttributedFormatBuffer.java
new file mode 100644 (file)
index 0000000..a02f8a1
--- /dev/null
@@ -0,0 +1,247 @@
+/* AttributedFormatBuffer.java -- Implements an attributed FormatBuffer.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+package gnu.java.text;
+
+import java.text.AttributedCharacterIterator;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * This class is an implementation of a FormatBuffer with attributes.
+ * 
+ * @author Guilhem Lavaux <guilhem@kaffe.org>
+ * @date April 10, 2004
+ */
+public class AttributedFormatBuffer implements FormatBuffer
+{
+  private StringBuffer buffer;
+  private ArrayList ranges;
+  private ArrayList attributes;
+  private int[] a_ranges;
+  private HashMap[] a_attributes; 
+  private int startingRange;
+  AttributedCharacterIterator.Attribute defaultAttr;
+
+  /**
+   * This constructor accepts a StringBuffer. If the buffer contains
+   * already some characters they will not be attributed. 
+   */
+  public AttributedFormatBuffer(StringBuffer buffer)
+  {
+    this.buffer = buffer;
+    this.ranges = new ArrayList();
+    this.attributes = new ArrayList();
+    this.defaultAttr = null;
+    if (buffer.length() != 0)
+      {
+       this.startingRange = buffer.length();
+       addAttribute(buffer.length(), null);
+      }
+    else
+      this.startingRange = -1;
+  }
+
+  public AttributedFormatBuffer(int prebuffer)
+  {
+    this(new StringBuffer(prebuffer));
+  }
+
+  public AttributedFormatBuffer()
+  {
+    this(10);
+  }
+
+  /**
+   * This method is a helper function for formatters. Given a set of ranges
+   * and attributes it adds exactly one attribute for the range of characters
+   * comprised between the last entry in 'ranges' and the specified new range.
+   *
+   * @param new_range A new range to insert in the list.
+   * @param new_attribute A new attribute to insert in the list.
+   */  
+  private final void addAttribute(int new_range, AttributedCharacterIterator.Attribute attr)
+  {
+    HashMap map;
+
+    if (attr != null)
+      {
+       map = new HashMap();
+       map.put(attr, attr);
+       attributes.add(map);
+      }
+    else
+      attributes.add(null);
+
+    ranges.add(new Integer(new_range));
+  }
+
+  public void append(String s)
+  {
+    if (startingRange < 0)
+      startingRange = 0;
+    buffer.append(s);
+  }
+  
+  public void append(String s, AttributedCharacterIterator.Attribute attr)
+  {
+    setDefaultAttribute(attr);
+    startingRange = buffer.length();
+    append(s);
+    setDefaultAttribute(null);
+  }
+
+  public void append(String s, int[] ranges, HashMap[] attrs)
+  {
+    int curPos = buffer.length();
+
+    setDefaultAttribute(null);
+    if (ranges != null)
+      {
+       for (int i = 0; i < ranges.length; i++)
+         {         
+           this.ranges.add(new Integer(ranges[i] + curPos));
+           this.attributes.add(attrs[i]);
+         }
+      }
+    startingRange = buffer.length();
+    buffer.append(s);
+  }
+
+  public void append(char c)
+  {
+    if (startingRange < 0)
+      startingRange = buffer.length();
+    buffer.append(c);
+  }
+
+  public void append(char c, AttributedCharacterIterator.Attribute attr)
+  {
+    setDefaultAttribute(attr);
+    buffer.append(c);
+    setDefaultAttribute(null);
+  }
+
+  public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr)
+  {
+    if (attr == defaultAttr)
+      return;
+
+    int currentPos = buffer.length();
+
+    if (startingRange != currentPos && startingRange >= 0)
+      {
+       addAttribute(currentPos, defaultAttr);
+      }
+    defaultAttr = attr;
+    startingRange = currentPos;
+  }
+
+  public AttributedCharacterIterator.Attribute getDefaultAttribute()
+  {
+    return defaultAttr;
+  }
+
+  public void cutTail(int length)
+  {
+    buffer.setLength(buffer.length()-length);
+  }
+
+  public int length()
+  {
+    return buffer.length();
+  }
+
+  public void clear()
+  {
+    buffer.setLength(0);
+    ranges.clear();
+    attributes.clear();
+    defaultAttr = null;
+    startingRange = -1;
+  }
+
+  /**
+   * This method synchronizes the state of the attribute array.
+   * After calling it you may call {@link #getDefaultAttribute()}.
+   */
+  public void sync()
+  {
+    if (startingRange < 0 || startingRange == buffer.length())
+      return;
+
+    addAttribute(buffer.length(), defaultAttr);
+
+    a_ranges = new int[ranges.size()];
+    for (int i = 0; i < a_ranges.length; i++)
+      a_ranges[i] = ((Integer)(ranges.get (i))).intValue();
+    
+    a_attributes = new HashMap[attributes.size()];
+    System.arraycopy(attributes.toArray(), 0, a_attributes, 0, a_attributes.length);
+  }
+
+  /**
+   * This method returns the internal StringBuffer describing
+   * the attributed string.
+   *
+   * @return An instance of StringBuffer which contains the string.
+   */
+  public StringBuffer getBuffer()
+  {
+    return buffer;
+  }
+
+  /**
+   * This method returns the ranges for the attributes.
+   *
+   * @return An array of int describing the ranges.
+   */
+  public int[] getRanges()
+  {
+    return a_ranges;
+  }
+
+  /**
+   * This method returns the array containing the map on the 
+   * attributes.
+   *
+   * @return An array of {@link java.util.Map} containing the attributes.
+   */
+  public HashMap[] getAttributes()
+  {
+    return a_attributes;
+  }
+}
diff --git a/libjava/gnu/java/text/FormatBuffer.java b/libjava/gnu/java/text/FormatBuffer.java
new file mode 100644 (file)
index 0000000..addfcbe
--- /dev/null
@@ -0,0 +1,136 @@
+/* FormatBuffer.java -- General interface to build attributed strings.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+package gnu.java.text;
+
+import java.text.AttributedCharacterIterator;
+import java.util.HashMap;
+
+/**
+ * This interface describes a modifiable buffer which contains attributed
+ * characters. The implementation may or may not implements attributes. It
+ * aims to greatly simplify and clarify the implementation of java.text 
+ * formatters. The buffer may be appended or have its tail cut. It may also
+ * be completely cleant up.
+ *
+ * @author Guilhem Lavaux <guilhem@kaffe.org>
+ * @date April 10, 2004
+ */
+public interface FormatBuffer 
+{
+  /**
+   * This method appends a simple string to the buffer. This part of
+   * the buffer will be attributed using the default attribute.
+   *
+   * @param s The string to append to the buffer.
+   */
+  public void append(String s);
+
+  /**
+   * This method appends a simple string to the buffer. This part of
+   * the buffer will have the specified attribute (and only this one).
+   * The default attribute may be changed after calling this method.
+   *
+   * @param s The string to append to the buffer.
+   * @param attr Attribute to use for the string in the buffer.
+   */
+  public void append(String s, AttributedCharacterIterator.Attribute attr);
+
+  /**
+   * This method appends a simple string to the buffer. This part of
+   * the buffer will be attributed using the specified ranges and attributes.
+   * To have an example on how to specify ranges see {@link gnu.java.text.FormatCharacterIterator}. 
+   * 
+   * @param s The string to append to the buffer.
+   * @param ranges The ranges describing how the attributes should be applied
+   * to the string.
+   * @param attrs The attributes of the string in the buffer.
+   */
+  public void append(String s, int[] ranges, HashMap[] attrs);
+
+  /**
+   * This method appends a simple char to the buffer. This part of
+   * the buffer will be attributed using the default attribute.
+   *
+   * @param c The character to append to the buffer.
+   */
+  public void append(char c);
+
+  /**
+   * This method appends a simple character to the buffer. This part of
+   * the buffer will have the specified attribute (and only this one).
+   * The default attribute may be changed after calling this method.
+   *
+   * @param c The character to append to the buffer.
+   * @param attr Attribute to use for the character in the buffer.
+   */
+  public void append(char c, AttributedCharacterIterator.Attribute attr);
+
+  /**
+   * This method changes the current default attribute for the next string
+   * or character which will be appended to the buffer.
+   *
+   * @param attr The attribute which will be used by default.
+   */
+  public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr);
+
+  /**
+   * This method returns the current default attribute for the buffer.
+   *
+   * @return The default attribute for the buffer.
+   */
+  public AttributedCharacterIterator.Attribute getDefaultAttribute();
+
+  /**
+   * This method cuts the last characters of the buffer. The number of
+   * characters to cut is given by "length".
+   *
+   * @param length Number of characters to cut at the end of the buffer.
+   */
+  public void cutTail(int length);
+  
+  /**
+   * This method resets completely the buffer.
+   */
+  public void clear();
+
+  /**
+   * This method returns the number of character in the buffer.
+   *
+   * @return The number of character in the buffer.
+   */
+  public int length();
+}
@@ -35,15 +35,18 @@ or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. */
-package java.text;
+package gnu.java.text;
 
-import java.util.Set;
+import gnu.classpath.Configuration;
+
+import java.text.AttributedCharacterIterator;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
-import java.util.HashMap;
+import java.util.Set;
 import java.util.Vector;
 
-
 /**
  * This class should not be put public and it is only intended to the
  * classes of the java.text package. Its aim is to build a segmented
@@ -55,7 +58,7 @@ import java.util.Vector;
  * @author Guilhem Lavaux <guilhem@kaffe.org>
  * @date November 22, 2003
  */
-class FormatCharacterIterator implements AttributedCharacterIterator
+public class FormatCharacterIterator implements AttributedCharacterIterator
 {
   private String formattedString;
   private int charIndex;
@@ -68,7 +71,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    * are empty and so is the string. However you may append strings
    * and attributes to this iterator.
    */
-  FormatCharacterIterator()
+  public FormatCharacterIterator()
   {
     formattedString = "";
     ranges = new int[0];
@@ -90,7 +93,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    * <code>"he"</code> will have the attributes <code>attributes[0]</code>,
    * <code>"llo"</code> the <code>attributes[1]</code>.
    */
-  FormatCharacterIterator (String s, int[] ranges, HashMap[] attributes)
+  public FormatCharacterIterator (String s, int[] ranges, HashMap[] attributes)
   {
     formattedString = s;
     this.ranges = ranges;
@@ -325,12 +328,14 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    *
    * @param attributes the new array attributes to apply to the string.
    */
-  protected void mergeAttributes (HashMap[] attributes, int[] ranges)
+  public void mergeAttributes (HashMap[] attributes, int[] ranges)
   {
     Vector new_ranges = new Vector();
     Vector new_attributes = new Vector();
     int i = 0, j = 0;
 
+    debug("merging " + attributes.length + " attrs");
+    
     while (i < this.ranges.length && j < ranges.length)
       {
        if (this.attributes[i] != null)
@@ -388,6 +393,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
        this.ranges[i] = ((Integer)new_ranges.elementAt (i)).intValue();
       }
     
+    dumpTable();
   }
 
   /**
@@ -397,7 +403,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    * @param iterator the iterator which contains the attributed string to
    * append to this iterator.
    */
-  protected void append (AttributedCharacterIterator iterator)
+  public void append (AttributedCharacterIterator iterator)
   {
     char c = iterator.first();
     Vector more_ranges = new Vector();
@@ -405,7 +411,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
 
     do
       {
-       formattedString = formattedString + String.valueOf(c);
+       formattedString = formattedString + String.valueOf (c);
        // TODO: Reduce the size of the output array.
        more_attributes.add (iterator.getAttributes());
        more_ranges.add (new Integer (formattedString.length()));
@@ -424,8 +430,8 @@ class FormatCharacterIterator implements AttributedCharacterIterator
 
     System.arraycopy (ranges, 0, new_ranges, 0, ranges.length);
     Object[] new_ranges_array = more_ranges.toArray();
-    for (int i=0;i<more_ranges.size();i++)
-      new_ranges[i+ranges.length] = ((Integer)new_ranges_array[i]).intValue();
+    for (int i = 0; i < more_ranges.size();i++)
+      new_ranges[i+ranges.length] = ((Integer) new_ranges_array[i]).intValue();
 
     attributes = new_attributes;
     ranges = new_ranges;
@@ -440,7 +446,7 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    * iterator. If it is <code>null</code> the string will simply have no
    * attributes.
    */
-  protected void append (String text, HashMap local_attributes)
+  public void append (String text, HashMap local_attributes)
   {
     int[] new_ranges = new int[ranges.length+1];
     HashMap[] new_attributes = new HashMap[attributes.length+1];
@@ -462,8 +468,67 @@ class FormatCharacterIterator implements AttributedCharacterIterator
    *
    * @param text The string to append to the iterator.
    */
-  protected void append (String text)
+  public void append (String text)
   {
     append (text, null);
   }  
+
+  /**
+   * This method adds a set of attributes to a range of character. The
+   * bounds are always inclusive. In the case many attributes have to
+   * be added it is advised to directly use {@link #mergeAttributes([Ljava.util.HashMap;[I}
+   *
+   * @param attributes Attributes to merge into the iterator.
+   * @param range_start Lower bound of the range of characters which will receive the
+   * attribute.
+   * @param range_end Upper bound of the range of characters which will receive the
+   * attribute. 
+   *
+   * @throws IllegalArgumentException if ranges are out of bounds.
+   */
+  public void addAttributes(HashMap attributes, int range_start, int range_end)
+  {
+    if (range_start == 0)
+      mergeAttributes(new HashMap[] { attributes }, new int[] { range_end });
+    else
+      mergeAttributes(new HashMap[] { null, attributes }, new int[] { range_start, range_end });
+  }
+
+  final private void debug(String s)
+  {
+    if (Configuration.DEBUG)
+      System.out.println(s);
+  }
+
+  final private void dumpTable()
+  {
+    int start_range = 0;
+    
+    if (!Configuration.DEBUG)
+      return;
+
+    System.out.println("Dumping internal table:");
+    for (int i = 0; i < ranges.length; i++)
+      {
+       System.out.print("\t" + start_range + " => " + ranges[i] + ":");
+       if (attributes[i] == null)
+         System.out.println("null");
+       else
+         {
+           Set keyset = attributes[i].keySet();
+           if (keyset != null)
+             {
+               Iterator keys = keyset.iterator();
+               
+               while (keys.hasNext())
+                 System.out.print(" " + keys.next());
+             }
+           else
+             System.out.println("keySet null");
+           System.out.println();
+         }
+      }
+    System.out.println();
+    System.out.flush();
+  }
 }
diff --git a/libjava/gnu/java/text/StringFormatBuffer.java b/libjava/gnu/java/text/StringFormatBuffer.java
new file mode 100644 (file)
index 0000000..ec0ed86
--- /dev/null
@@ -0,0 +1,121 @@
+/* StringFormatBuffer.java -- Implements FormatBuffer using StringBuffer.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+package gnu.java.text;
+
+import java.text.AttributedCharacterIterator;
+import java.util.HashMap;
+
+/**
+ * This class is an implementation of a FormatBuffer without attributes.
+ * 
+ * @author Guilhem Lavaux <guilhem@kaffe.org>
+ * @date April 10, 2004
+ */
+public class StringFormatBuffer implements FormatBuffer
+{
+  private StringBuffer buffer;
+  private AttributedCharacterIterator.Attribute defaultAttr;
+
+  public StringFormatBuffer(int prebuffer)
+  {
+    buffer = new StringBuffer(prebuffer);
+  }
+
+  public StringFormatBuffer(StringBuffer buffer)
+  {
+    this.buffer = buffer;
+  }
+
+  public void append(String s)
+  {
+    buffer.append(s);
+  }
+  
+  public void append(String s, AttributedCharacterIterator.Attribute attr)
+  {
+    buffer.append(s);
+  }
+
+  public void append(String s, int[] ranges, HashMap[] attrs)
+  {
+    buffer.append(s);
+  }
+
+  public void append(char c)
+  {
+    buffer.append(c);
+  }
+
+  public void append(char c, AttributedCharacterIterator.Attribute attr)
+  {
+    buffer.append(c);
+  }
+
+  public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr)
+  {
+    defaultAttr = attr;
+  }
+
+  public AttributedCharacterIterator.Attribute getDefaultAttribute()
+  {
+    return defaultAttr;
+  }
+
+  public void cutTail(int length)
+  {
+    buffer.setLength(buffer.length()-length);
+  }
+
+  public int length()
+  {
+    return buffer.length();
+  }
+
+  public void clear()
+  {
+    buffer.setLength(0);
+  }
+
+  /**
+   * This method returns the internal {@link java.lang.StringBuffer} which 
+   * contains the string of character.
+   */
+  public StringBuffer getBuffer()
+  {
+    return buffer;
+  }
+}
index d3b7fcc..0cef00a 100644 (file)
@@ -38,6 +38,8 @@ exception statement from your version. */
 
 package java.text;
 
+import gnu.java.text.FormatCharacterIterator;
+
 import java.util.Set;
 import java.util.Map;
 import java.util.HashSet;