PatchSet 4530 
Date: 2004/03/17 02:53:10
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Replaced a few java.util classes by implementations from GNU Classpath

2004-03-16  Dalibor Topic <[EMAIL PROTECTED]>

        * libraries/javalib/java/util/Stack.java,
        libraries/javalib/java/util/MissingResourceException.java,
        libraries/javalib/java/util/Observable.java,
        libraries/javalib/java/util/Properties.java,
        libraries/javalib/java/util/StringTokenizer.java,
        libraries/javalib/java/util/Timer.java,
        libraries/javalib/java/util/TimerTask.java:
        Replaced by implementation from GNU Classpath.

Members: 
        ChangeLog:1.2108->1.2109 
        libraries/javalib/java/util/MissingResourceException.java:1.5->1.6 
        libraries/javalib/java/util/Observable.java:1.3->1.4 
        libraries/javalib/java/util/Properties.java:1.21->1.22 
        libraries/javalib/java/util/Stack.java:1.4->1.5 
        libraries/javalib/java/util/StringTokenizer.java:1.5->1.6 
        libraries/javalib/java/util/Timer.java:1.5->1.6 
        libraries/javalib/java/util/TimerTask.java:1.2->1.3 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2108 kaffe/ChangeLog:1.2109
--- kaffe/ChangeLog:1.2108      Wed Mar 17 00:59:43 2004
+++ kaffe/ChangeLog     Wed Mar 17 02:53:10 2004
@@ -1,5 +1,16 @@
 2004-03-16  Dalibor Topic <[EMAIL PROTECTED]>
 
+       * libraries/javalib/java/util/Stack.java,
+       libraries/javalib/java/util/MissingResourceException.java,
+       libraries/javalib/java/util/Observable.java,
+       libraries/javalib/java/util/Properties.java,
+       libraries/javalib/java/util/StringTokenizer.java,
+       libraries/javalib/java/util/Timer.java,
+       libraries/javalib/java/util/TimerTask.java:
+       Replaced by implementation from GNU Classpath.
+
+2004-03-16  Dalibor Topic <[EMAIL PROTECTED]>
+
        * libraries/javalib/java/util/AbstractListIterator.java,
        libraries/javalib/java/util/AbstractMapEntry.java,
        libraries/javalib/java/util/AbstractMapEntrySet.java:
Index: kaffe/libraries/javalib/java/util/MissingResourceException.java
diff -u kaffe/libraries/javalib/java/util/MissingResourceException.java:1.5 
kaffe/libraries/javalib/java/util/MissingResourceException.java:1.6
--- kaffe/libraries/javalib/java/util/MissingResourceException.java:1.5 Wed Sep  4 
11:10:46 2002
+++ kaffe/libraries/javalib/java/util/MissingResourceException.java     Wed Mar 17 
02:53:12 2004
@@ -1,37 +1,105 @@
-/*
- * Java core library component.
- *
- * Copyright (c) 1997, 1998
- *      Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
- */
+/* MissingResourceException.java -- thrown for a missing resource
+   Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
 
-package java.util;
+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. */
 
-public class MissingResourceException extends RuntimeException {
 
-  // NB: both are part of serialized form
-  private String className;
-  private String key;
+package java.util;
 
-  public MissingResourceException(String s, String className, String ky)
+/**
+ * This exception is thrown when a resource is missing.
+ *
+ * @author Jochen Hoenicke
+ * @author Warren Levy <[EMAIL PROTECTED]>
+ * @see ResourceBundle
+ * @since 1.1
+ * @status updated to 1.4
+ */
+public class MissingResourceException extends RuntimeException
+{
+  /**
+   * Compatible with JDK 1.1+.
+   */
+  private static final long serialVersionUID = -4876345176062000401L;
+
+  /**
+   * The name of the resource bundle requested by user.
+   *
+   * @serial the class name of the resource bundle
+   */
+  private final String className;
+
+  /**
+   * The key of the resource in the bundle requested by user.
+   *
+   * @serial the name of the resouce
+   */
+  private final String key;
+
+  /**
+   * Creates a new exception, with the specified parameters.
+   *
+   * @param s the detail message
+   * @param className the name of the resource bundle
+   * @param key the key of the missing resource
+   */
+  public MissingResourceException(String s, String className, String key)
   {
-    super(s + "\t" + className + "\t" + ky);
+    super(s);
     this.className = className;
-    key = ky;
+    this.key = key;
   }
 
+  /**
+   * Gets the name of the resource bundle, for which a resource is missing.
+   *
+   * @return the name of the resource bundle
+   */
   public String getClassName()
   {
-    return (className);
+    return className;
   }
 
+  /**
+   * Gets the key of the resource that is missing bundle, this is an empty
+   * string if the whole resource bundle is missing.
+   *
+   * @return the name of the resource bundle
+   */
   public String getKey()
   {
-    return (key);
+    return key;
   }
-
 }
Index: kaffe/libraries/javalib/java/util/Observable.java
diff -u kaffe/libraries/javalib/java/util/Observable.java:1.3 
kaffe/libraries/javalib/java/util/Observable.java:1.4
--- kaffe/libraries/javalib/java/util/Observable.java:1.3       Fri Oct 15 18:22:31 
1999
+++ kaffe/libraries/javalib/java/util/Observable.java   Wed Mar 17 02:53:12 2004
@@ -1,74 +1,180 @@
+/* Observable.java -- an object to be observed
+   Copyright (C) 1999, 2000, 2001, 2002 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. */
 
-/*
- * Java core library component.
- *
- * Copyright (c) 1999
- *     Archie L. Cobbs.  All rights reserved.
- * Copyright (c) 1999
- *     Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
- *
- * Author: Archie L. Cobbs <[EMAIL PROTECTED]>
- */
 
 package java.util;
 
-public class Observable {
-       private final ArrayList observers;
-       private boolean changed;
-
-       public Observable() {
-               observers = new ArrayList();
-               changed = false;
-       }
-
-       public synchronized void addObserver(Observer o) {
-               observers.add(o);
-       }
-
-       public synchronized void deleteObserver(Observer o) {
-               int index = observers.indexOf(o);
-               if (index != -1) {
-                       observers.remove(index);
-               }
-       }
-
-       public void notifyObservers() {
-               notifyObservers(null);
-       }
-
-       public synchronized void notifyObservers(Object arg) {
-               if (changed) {
-                       // Need to clone list to avoid any concurrent
-                       // modification exceptions.
-                       for (Iterator i = 
((ArrayList)(observers.clone())).listIterator();
-                           i.hasNext(); ) {
-                               ((Observer)i.next()).update(this, arg);
-                       }
-                       clearChanged();
-               }
-       }
-
-       public synchronized void deleteObservers() {
-               observers.clear();
-       }
-
-       protected void setChanged() {
-               changed = true;
-       }
-
-       protected void clearChanged() {
-               changed = false;
-       }
-
-       public boolean hasChanged() {
-               return changed;
-       }
-
-       public synchronized int countObservers() {
-               return observers.size();
-       }
+/**
+ * This class represents an object which is observable.  Other objects may
+ * register their intent to be notified when this object changes; and when
+ * this object does change, it will trigger the <code>update</code> method
+ * of each observer.
+ *
+ * Note that the <code>notifyObservers()</code> method of this class is
+ * unrelated to the <code>notify()</code> of Object.
+ *
+ * @author Warren Levy <[EMAIL PROTECTED]>
+ * @author Eric Blake <[EMAIL PROTECTED]>
+ * @see Observer
+ * @status updated to 1.4
+ */
+public class Observable
+{
+  /** Tracks whether this object has changed. */
+  private boolean changed;
+
+  /* List of the Observers registered as interested in this Observable. */
+  private LinkedHashSet observers;
+
+  /**
+   * Constructs an Observable with zero Observers.
+   */
+  public Observable()
+  {
+    observers = new LinkedHashSet();
+  }
+
+  /**
+   * Adds an Observer. If the observer was already added this method does
+   * nothing.
+   *
+   * @param observer Observer to add
+   * @throws NullPointerException if observer is null
+   */
+  public synchronized void addObserver(Observer observer)
+  {
+    observers.add(observer);
+  }
+
+  /**
+   * Reset this Observable's state to unchanged. This is called automatically
+   * by <code>notifyObservers</code> once all observers have been notified.
+   *
+   * @see #notifyObservers()
+   */
+  protected synchronized void clearChanged()
+  {
+    changed = false;
+  }
+
+  /**
+   * Returns the number of observers for this object.
+   *
+   * @return number of Observers for this
+   */
+  public synchronized int countObservers()
+  {
+    return observers.size();
+  }
+
+  /**
+   * Deletes an Observer of this Observable.
+   *
+   * @param victim Observer to delete
+   */
+  public synchronized void deleteObserver(Observer victim)
+  {
+    observers.remove(victim);
+  }
+
+  /**
+   * Deletes all Observers of this Observable.
+   */
+  public synchronized void deleteObservers()
+  {
+    observers.clear();
+  }
+
+  /**
+   * True if <code>setChanged</code> has been called more recently than
+   * <code>clearChanged</code>.
+   *
+   * @return whether or not this Observable has changed
+   */
+  public synchronized boolean hasChanged()
+  {
+    return changed;
+  }
+
+  /**
+   * If the Observable has actually changed then tell all Observers about it,
+   * then reset state to unchanged.
+   *
+   * @see #notifyObservers(Object)
+   * @see Observer#update(Observable, Object)
+   */
+  public void notifyObservers()
+  {
+    notifyObservers(null);
+  }
+
+  /**
+   * If the Observable has actually changed then tell all Observers about it,
+   * then reset state to unchanged. Note that though the order of
+   * notification is unspecified in subclasses, in Observable it is in the
+   * order of registration.
+   *
+   * @param obj argument to Observer's update method
+   * @see Observer#update(Observable, Object)
+   */
+  public void notifyObservers(Object obj)
+  {
+    if (! hasChanged())
+      return;
+    // Create clone inside monitor, as that is relatively fast and still
+    // important to keep threadsafe, but update observers outside of the
+    // lock since update() can call arbitrary code.
+    Set s;
+    synchronized (this)
+      {
+        s = (Set) observers.clone();
+      }
+    int i = s.size();
+    Iterator iter = s.iterator();
+    while (--i >= 0)
+      ((Observer) iter.next()).update(this, obj);
+    clearChanged();
+  }
+
+  /**
+   * Marks this Observable as having changed.
+   */
+  protected synchronized void setChanged()
+  {
+    changed = true;
+  }
 }
-
Index: kaffe/libraries/javalib/java/util/Properties.java
diff -u kaffe/libraries/javalib/java/util/Properties.java:1.21 
kaffe/libraries/javalib/java/util/Properties.java:1.22
--- kaffe/libraries/javalib/java/util/Properties.java:1.21      Thu Mar 28 11:24:13 
2002
+++ kaffe/libraries/javalib/java/util/Properties.java   Wed Mar 17 02:53:12 2004
@@ -1,345 +1,577 @@
+/* Properties.java -- a set of persistent properties
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 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. */
 
-/*
- * Java core library component.
- *
- * Copyright (c) 1997, 1998
- *      Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
- */
 
 package java.util;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.PrintStream;
 import java.io.PrintWriter;
-import java.io.PushbackInputStream;
-
-public class Properties extends Hashtable {
-       private static final long serialVersionUID = 4112578634029874840L;
-       protected Properties defaults;
-       private StringBuffer key, value;
-
-public Properties() {
-       this(null);
-}
-
-public Properties(Properties defaults) {
-       this.defaults=defaults;
-}
-
-private static String escape(String str, boolean isKey) {
-       StringBuffer sb = new StringBuffer();
-       for (int pos = 0; pos < str.length(); pos++) {
-               char ch = str.charAt(pos);
-               switch (ch) {
-               case '!':
-               case '#':
-                       if (pos == 0)
-                               sb.append("\\");
-                       sb.append(ch);
-                       break;
-               case ':':
-               case '=':
-               case ' ':
-                       if (!isKey) {
-                               sb.append(ch);
-                               break;
-                       }                       // fall through
-               case '\\':
-                       sb.append("\\" + ch);
-                       break;
-               case '\n':
-                       sb.append("\\n");
-                       break;
-               case '\t':
-                       sb.append("\\t");
-                       break;
-               case '\r':
-                       sb.append("\\r");
-                       break;
-               default:
-                       if (ch < 0x20 || ch > 0x7e) {
-                               sb.append("\\u");
-                               sb.append(Character.forDigit((ch >> 12) & 0xf, 16));
-                               sb.append(Character.forDigit((ch >> 8) & 0xf, 16));
-                               sb.append(Character.forDigit((ch >> 4) & 0xf, 16));
-                               sb.append(Character.forDigit(ch & 0xf, 16));
-                       } else
-                               sb.append(ch);
-                       break;
-               }
-       }
-
-       return sb.toString();
-}
-
-public String getProperty(String key) {
-       // Apparently we should use the superclass get method rather than
-       // our own because it may be overridden
-       // Software: HotJava
-  // if (System.out != null) System.out.println("getProperty: " + key);
-       if( key == null )
-               return null;
-       Object propSearch = super.get(key);
-       if (propSearch != null) {
-               return ((String)propSearch);
-       }
-       else if (defaults != null) {
-               return (defaults.getProperty(key));
-       }
-       else {
-               return (null);
-       }
-}
-
-public String getProperty(String key, String defaultValue) {
-       String result=getProperty(key);
-
-       if (result==null) return defaultValue; else return result;
-}
-
-public Object setProperty(String key, String value) {
-       return super.put(key, value);
-}
-
-public void list(PrintStream out) {
-       list(new PrintWriter(out, true));
-}
-
-public void list(PrintWriter out) {
-       try {
-               save(out, "Properties list");
-       } catch (IOException _) { 
-               System.err.println("unable to list properties");
-       }
-}
-
-public Enumeration propertyNames() {
-       SortedSet nameSet = new TreeSet();      // sort keys just for fun
-
-       // Add main properties
-       for (Enumeration e = keys(); e.hasMoreElements(); ) {
-               nameSet.add(e.nextElement());
-       }
-
-       // Add non-overridden default properties
-       if (defaults != null) {
-               for (Enumeration e = defaults.keys(); e.hasMoreElements(); ) {
-                       Object def = e.nextElement();
-                       if (!nameSet.contains(def))
-                               nameSet.add(def);
-               }
-       }
-
-       // Return enumeration of vector
-       return Collections.enumeration(nameSet);
-}
-
-public synchronized void load(InputStream in) throws IOException {
-       PushbackInputStream pin = new PushbackInputStream(in, 16);
-
-       while (readKeyAndValue(pin)) {
-               put(key.toString(), value.toString());
-       }
-       key = null;
-       value = null;
-       //pin.close(); ??
-}
-
-private boolean readKeyAndValue(PushbackInputStream in) throws IOException {
-       int ch;
-
-       while (true) {
-               // Eat initial white space
-               while ((ch = in.read()) != -1 && ch <= ' ');
-
-               // Skip comments
-               switch (ch) {
-                       case '#':
-                       case '!':
-                               while ((ch = in.read()) != -1 && ch != '\n');
-                               continue;
-                       case -1:
-                               return false;
-               }
-
-               // Initialize
-               this.key = new StringBuffer();
-               this.value = new StringBuffer();
-
-               // Read in key
-               boolean eatSeparator = false;
-getKey:                while (true) {
-                       switch (ch) {
-                       case '=':
-                       case ':':
-                               break getKey;
-                       case '\r':
-                               switch ((ch = in.read())) {
-                               case '\n':
-                                       break;
-                               case -1:
-                                       return true;
-                               default:
-                                       in.unread(ch);
-                                       break getKey;
-                               }                               // fall through
-                       case -1:
-                       case '\n':
-                               return true;
-                       default:
-                               if (ch <= ' ') {
-                                       eatSeparator = true;
-                                       break getKey;
-                               }
-                               in.unread(ch);
-                               key.append((char) getEscapedChar(in));
-                       }
-                       ch = in.read();
-               }
-
-               // Eat white space (and separator, if expecting) before value
-               while (true) {
-                       while ((ch = in.read()) <= ' ') {
-                               if (ch == -1 || ch == '\n')
-                                       return true;
-                       }
-                       if (eatSeparator && (ch == '=' || ch == ':')) {
-                               eatSeparator = false;
-                       } else {
-                               break;
-                       }
-               }
-
-               // Read in value
-               while (true) {
-                       switch (ch) {
-                       case '\r':
-                               switch ((ch = in.read())) {
-                               case -1:
-                                       value.append('\r');     // fall through
-                               case '\n':
-                                       return true;
-                               default:
-                                       in.unread(ch);
-                                       value.append('\r');
-                                       break;
-                               }
-                               break;
-                       case -1:
-                       case '\n':
-                               return true;
-                       default:
-                               in.unread(ch);
-                               value.append((char) getEscapedChar(in));
-                               break;
-                       }
-                       ch = in.read();
-               }
-       }
-}
-
-// Get next char, respecting backslash escape codes and end-of-line stuff
-private static int getEscapedChar(PushbackInputStream in) throws IOException {
-       int ch;
-       switch ((ch = in.read())) {
-       case '\\':
-               switch ((ch = in.read())) {
-               case '\r':
-                       switch ((ch = in.read())) {
-                       default:
-                               in.unread(ch);          // fall through
-                       case -1:
-                               in.unread('\r');
-                               return '\\';
-                       case '\n':
-                               break;
-                       }                               // fall through
-               case '\n':                              // line continuation
-                       while ((ch = in.read()) != -1 && ch <= ' ');
-                       in.unread(ch);
-                       return getEscapedChar(in);
-               case 'n':
-                       return '\n';
-               case 'r':
-                       return '\r';
-               case 't':
-                       return '\t';
-               case 'u':
-                       {
-                               int[] dig = new int[4];
-                               int n;
-                           getUnicode:
-                               {
-                                       int dval, cval = 0;
-                                       for (n = 0; n < 4; ) {
-                                               if ((dig[n] = in.read()) == -1)
-                                                       break getUnicode;
-                                               if ((dval = Character.digit(
-                                                   (char) dig[n++], 16)) == -1)
-                                                       break getUnicode;
-                                               cval = (cval << 4) | dval;
-                                       }
-                                       return cval;
-                               }
-                               // not unreachable, break getUnicode go here
-                               while (n > 0)
-                                   in.unread(dig[--n]);
-                               return 'u';
-                       }
-
-               // not fall through, previous switch always return
-               case -1:
-                       return '\\';
-               default:
-                       return ch;
-               }
-       // not fall through, previous switch always return
-       case '\r':
-               switch ((ch = in.read())) {
-               default:
-                       in.unread(ch);          // fall through
-               case -1:
-                       return '\r';
-               case '\n':
-                       break;
-               }                               // fall through
-       default:
-               return ch;
-       }
-}
-
-public synchronized void save(OutputStream out, String header) {
-       try {
-               store(out, header);
-       }
-       catch (IOException e) {
-               System.err.println("Unable to save properties: "+header);
-       }
-}
-
-public synchronized void store(OutputStream out, String header) throws IOException {
-       save(new PrintWriter(out, true), header);
-}
-
-// NB: use a PrintWriter here to get platform-specific line separator
-private synchronized void save(PrintWriter out, String header) throws IOException {
-       if (header != null) {
-               out.println("# " + escape(header, false));
-       }
-
-       Enumeration keys = propertyNames();
-
-       while (keys.hasMoreElements()) {
-               String key=(String)keys.nextElement();
-               out.println(escape(key, true)
-                       + "=" + escape(getProperty(key), false));
-       }
-       out.flush();    // shouldn't be necessary
-}
-}
+import java.io.PrintStream;
+import java.io.OutputStreamWriter;
 
+/**
+ * A set of persistent properties, which can be saved or loaded from a stream.
+ * A property list may also contain defaults, searched if the main list
+ * does not contain a property for a given key.
+ *
+ * An example of a properties file for the german language is given
+ * here.  This extends the example given in ListResourceBundle.
+ * Create a file MyResource_de.properties with the following contents
+ * and put it in the CLASSPATH.  (The character
+ * <code>\</code><code>u00e4</code> is the german umlaut)
+ *
+ * 
+<pre>s1=3
+s2=MeineDisk
+s3=3. M\<code></code>u00e4rz 96
+s4=Die Diskette ''{1}'' enth\<code></code>u00e4lt {0} in {2}.
+s5=0
+s6=keine Dateien
+s7=1
+s8=eine Datei
+s9=2
+s10={0,number} Dateien
+s11=Das Formatieren schlug fehl mit folgender Exception: {0}
+s12=FEHLER
+s13=Ergebnis
+s14=Dialog
+s15=Auswahlkriterium
+s16=1,3</pre>
+ *
+ * <p>Although this is a sub class of a hash table, you should never
+ * insert anything other than strings to this property, or several
+ * methods, that need string keys and values, will fail.  To ensure
+ * this, you should use the <code>get/setProperty</code> method instead
+ * of <code>get/put</code>.
+ *
+ * Properties are saved in ISO 8859-1 encoding, using Unicode escapes with
+ * a single <code>u</code> for any character which cannot be represented.
+ *
+ * @author Jochen Hoenicke
+ * @author Eric Blake <[EMAIL PROTECTED]>
+ * @see PropertyResourceBundle
+ * @status updated to 1.4
+ */
+public class Properties extends Hashtable
+{
+  // WARNING: Properties is a CORE class in the bootstrap cycle. See the
+  // comments in vm/reference/java/lang/Runtime for implications of this fact.
+
+  /**
+   * The property list that contains default values for any keys not
+   * in this property list.
+   *
+   * @serial the default properties
+   */
+  protected Properties defaults;
+
+  /**
+   * Compatible with JDK 1.0+.
+   */
+  private static final long serialVersionUID = 4112578634029874840L;
+
+  /**
+   * Creates a new empty property list with no default values.
+   */
+  public Properties()
+  {
+  }
+
+  /**
+   * Create a new empty property list with the specified default values.
+   *
+   * @param defaults a Properties object containing the default values
+   */
+  public Properties(Properties defaults)
+  {
+    this.defaults = defaults;
+  }
+
+  /**
+   * Adds the given key/value pair to this properties.  This calls
+   * the hashtable method put.
+   *
+   * @param key the key for this property
+   * @param value the value for this property
+   * @return The old value for the given key
+   * @see #getProperty(String)
+   * @since 1.2
+   */
+  public Object setProperty(String key, String value)
+  {
+    return put(key, value);
+  }
+
+  /**
+   * Reads a property list from an input stream.  The stream should
+   * have the following format: <br>
+   *
+   * An empty line or a line starting with <code>#</code> or
+   * <code>!</code> is ignored.  An backslash (<code>\</code>) at the
+   * end of the line makes the line continueing on the next line
+   * (but make sure there is no whitespace after the backslash).
+   * Otherwise, each line describes a key/value pair. <br>
+   *
+   * The chars up to the first whitespace, = or : are the key.  You
+   * can include this caracters in the key, if you precede them with
+   * a backslash (<code>\</code>). The key is followed by optional
+   * whitespaces, optionally one <code>=</code> or <code>:</code>,
+   * and optionally some more whitespaces.  The rest of the line is
+   * the resource belonging to the key. <br>
+   *
+   * Escape sequences <code>\t, \n, \r, \\, \", \', \!, \#, \ </code>(a
+   * space), and unicode characters with the
+   * <code>\\u</code><em>xxxx</em> notation are detected, and
+   * converted to the corresponding single character. <br>
+   *
+   * 
+<pre># This is a comment
+key     = value
+k\:5      \ a string starting with space and ending with newline\n
+# This is a multiline specification; note that the value contains
+# no white space.
+weekdays: Sunday,Monday,Tuesday,Wednesday,\\
+          Thursday,Friday,Saturday
+# The safest way to include a space at the end of a value:
+label   = Name:\\u0020</pre>
+   *
+   * @param in the input stream
+   * @throws IOException if an error occurred when reading the input
+   * @throws NullPointerException if in is null
+   */
+  public void load(InputStream inStream) throws IOException
+  {
+    // The spec says that the file must be encoded using ISO-8859-1.
+    BufferedReader reader =
+      new BufferedReader(new InputStreamReader(inStream, "ISO-8859-1"));
+    String line;
+
+    while ((line = reader.readLine()) != null)
+      {
+        char c = 0;
+        int pos = 0;
+        // If empty line or begins with a comment character, skip this line.
+        if (line.length() == 0
+           || line.charAt(0) == '#' || line.charAt(0) == '!')
+          continue;
+
+        while (pos < line.length()
+               && Character.isWhitespace(c = line.charAt(pos)))
+          pos++;
+
+        // If line is empty skip this line.
+        if (pos == line.length())
+          continue;
+
+        // The characters up to the next Whitespace, ':', or '='
+        // describe the key.  But look for escape sequences.
+        StringBuffer key = new StringBuffer();
+        while (pos < line.length()
+               && ! Character.isWhitespace(c = line.charAt(pos++))
+               && c != '=' && c != ':')
+          {
+            if (c == '\\')
+              {
+                if (pos == line.length())
+                  {
+                    // The line continues on the next line.
+                    line = reader.readLine();
+                    pos = 0;
+                    while (pos < line.length()
+                           && Character.isWhitespace(c = line.charAt(pos)))
+                      pos++;
+                  }
+                else
+                  {
+                    c = line.charAt(pos++);
+                    switch (c)

*** Patch too long, truncated ***

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to