Commit 86c9776b by Mark Wielaard Committed by Mark Wielaard

ArrayList.java: Remove RCS keywords from comments

    * java/util/ArrayList.java: Remove RCS keywords from comments
    * java/util/BasicMapEntry.java: idem
    * java/util/Dictionary.java: idem
    * java/util/HashSet.java: idem

    * java/util/EventObject.java: reindent
    * java/util/Properties.java: idem
    * java/util/SortedMap.java: idem

    * java/util/Enumeration.java: Merge with Classpath
    * java/util/EventListener.java: idem
    * java/util/Observable.java: idem
    * java/util/Observer.java: idem
    * java/util/Stack.java: idem

From-SVN: r40639
parent 80fc2e84
2001-03-19 Mark Wielaard <mark@klomp.org>
* java/util/ArrayList.java: Remove RCS keywords from comments
* java/util/BasicMapEntry.java: idem
* java/util/Dictionary.java: idem
* java/util/HashSet.java: idem
* java/util/EventObject.java: reindent
* java/util/Properties.java: idem
* java/util/SortedMap.java: idem
* java/util/Enumeration.java: Merge with Classpath
* java/util/EventListener.java: idem
* java/util/Observable.java: idem
* java/util/Observer.java: idem
* java/util/Stack.java: idem
2001-03-17 Tom Tromey <tromey@redhat.com> 2001-03-17 Tom Tromey <tromey@redhat.com>
* java/lang/natString.cc (rehash): Don't bother with memset; * java/lang/natString.cc (rehash): Don't bother with memset;
......
...@@ -40,7 +40,6 @@ import java.io.ObjectOutputStream; ...@@ -40,7 +40,6 @@ import java.io.ObjectOutputStream;
* to or removing from the end of a list, checking the size, &c. * to or removing from the end of a list, checking the size, &c.
* *
* @author Jon A. Zeppieri * @author Jon A. Zeppieri
* @version $Id: ArrayList.java,v 1.12 2000/12/17 07:54:39 cbj Exp $
* @see java.util.AbstractList * @see java.util.AbstractList
* @see java.util.List * @see java.util.List
*/ */
......
...@@ -33,8 +33,6 @@ package java.util; ...@@ -33,8 +33,6 @@ package java.util;
* Hashtable. * Hashtable.
* *
* @author Jon Zeppieri * @author Jon Zeppieri
* @version $Revision: 1.5 $
* @modified $Id: BasicMapEntry.java,v 1.5 2000/10/26 10:19:00 bryce Exp $
*/ */
class BasicMapEntry implements Map.Entry class BasicMapEntry implements Map.Entry
{ {
......
...@@ -40,8 +40,6 @@ package java.util; ...@@ -40,8 +40,6 @@ package java.util;
* in the Collections framework. * in the Collections framework.
* *
* @author Jon Zeppieri * @author Jon Zeppieri
* @version $Revision: 1.4 $
* @modified $Id: Dictionary.java,v 1.4 2000/10/26 10:19:00 bryce Exp $
*/ */
public abstract class Dictionary extends Object public abstract class Dictionary extends Object
{ {
......
/* Copyright (C) 1998, 1999 Free Software Foundation /* Enumeration.java -- Interface for enumerating lists of objects
Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
This file is part of libgcj. This file is part of GNU Classpath.
This software is copyrighted work licensed under the terms of the GNU Classpath is free software; you can redistribute it and/or modify
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for it under the terms of the GNU General Public License as published by
details. */ 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.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.util; package java.util;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date August 25, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1. * "The Java Language Specification", ISBN 0-201-63451-1.
* Status: Believed complete and correct * Status: Believed complete and correct
*/ */
/**
* Interface for lists of objects that can be returned in sequence. Successive
* objects are obtained by the nextElement method.
* <p>
* As of Java 1.2, the Iterator interface provides the same functionality, but
* with shorter method names and a new optional method to remove items from the
* list. If writing for 1.2, consider using Iterator instead. Enumerations over
* the new collections classes, for use with legacy APIs that require them, can
* be obtained by the enumeration method in class Collections.
*
* @author Warren Levy <warrenl@cygnus.com>
* @date August 25, 1998.
*/
public interface Enumeration public interface Enumeration
{ {
public boolean hasMoreElements(); /**
public Object nextElement() throws NoSuchElementException; * Tests whether there are elements remaining in the enumeration.
*
* @return true if there is at least one more element in the enumeration,
* that is, if the next call to nextElement will not throw a
* NoSuchElementException.
*/
boolean hasMoreElements();
/**
* Obtain the next element in the enumeration.
*
* @return the next element in the enumeration
* @exception NoSuchElementException if there are no more elements
*/
Object nextElement() throws NoSuchElementException;
} }
// EventListener.java - Listen for events from event source. /* An interface that all event listener interfaces must extend
Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999 Free Software Foundation 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.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
This file is part of libgcj.
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.util; package java.util;
/**
* @author Tom Tromey <tromey@cygnus.com>
* @date December 12, 1998
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* Status: Believed complete and correct. * Status: Believed complete and correct.
*/ */
/**
* Empty interface that is implemented by classes that need to receive
* events. Subinterfaces define methods that can be called to fire an
* event notification. Normally the name of these subinterfaces end in
* <code>Listener</code> and all method described by the subinterface
* take as argument an subclass of <code>EventObject</code>.
*
* @author Tom Tromey <tromey@cygnus.com>
* @date December 12, 1998
*/
public interface EventListener public interface EventListener
{ {
} }
/* EventObject.java - Represent events fired by objects. /* EventObject.java - Represent events fired by objects.
Copyright (C) 1999, 2000 Free Software Foundation, Inc. Copyright (C) 1999, 2000 Free Software Foundation, Inc.
This file is part of GNU Classpath. This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
any later version. any later version.
GNU Classpath is distributed in the hope that it will be useful, but GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details. General Public License for more details.
You should have received a copy of the GNU General Public License 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 along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. 02111-1307 USA.
As a special exception, if you link this library with other files to As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License. resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */ executable file might be covered by the GNU General Public License. */
package java.util; package java.util;
......
...@@ -45,8 +45,6 @@ import java.io.ObjectOutputStream; ...@@ -45,8 +45,6 @@ import java.io.ObjectOutputStream;
* HashSet is a part of the JDK1.2 Collections API. * HashSet is a part of the JDK1.2 Collections API.
* *
* @author Jon Zeppieri * @author Jon Zeppieri
* @version $Revision: 1.3 $
* @modified $Id: HashSet.java,v 1.3 2001/02/15 05:12:05 bryce Exp $
*/ */
public class HashSet extends AbstractSet public class HashSet extends AbstractSet
implements Set, Cloneable, Serializable implements Set, Cloneable, Serializable
......
/* Copyright (C) 1998, 1999 Free Software Foundation /* java.util.Observable
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of libgcj. 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.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.util; package java.util;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date September 2, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct. * Status: Believed complete and correct.
*/ */
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date September 2, 1998.
*/
public class Observable public class Observable
{ {
/* tracks whether this object has changed */ /** tracks whether this object has changed */
private boolean changed; private boolean changed;
/* list of the Observers registered as interested in this Observable */ /* list of the Observers registered as interested in this Observable */
private Vector observerVec; private Vector observers;
/* TBD: This might be better implemented as an Observer[] /* TBD: This might be better implemented as an Observer[]
* but that would mean writing more code rather than making use of * but that would mean writing more code rather than making use of
...@@ -34,63 +53,101 @@ public class Observable ...@@ -34,63 +53,101 @@ public class Observable
* we may decide to make the tradeoff and reimplement with an Observer[]. * we may decide to make the tradeoff and reimplement with an Observer[].
*/ */
/**
* Constructs an Observable with zero Observers.
*/
public Observable() public Observable()
{ {
changed = false; changed = false;
observerVec = new Vector(); observers = new Vector();
} }
public synchronized void addObserver(Observer obs) /**
* Adds an Observer. If the observer was already added this method does
* nothing.
*
* @param observer Observer to add.
*/
public synchronized void addObserver(Observer observer)
{ {
// JDK 1.2 spec says not to add this if it is already there if (!observers.contains(observer))
if (!observerVec.contains(obs)) observers.addElement(observer);
observerVec.addElement(obs);
} }
/**
* Reset this Observable's state to unchanged.
*/
protected synchronized void clearChanged() protected synchronized void clearChanged()
{ {
changed = false; changed = false;
} }
/**
* @return Number of Observers for this Observable.
*/
public synchronized int countObservers() public synchronized int countObservers()
{ {
return observerVec.size(); return observers.size();
} }
public synchronized void deleteObserver(Observer obs) /**
* Deletes an Observer of this Observable.
*
* @param victim Observer to delete.
*/
public synchronized void deleteObserver(Observer victim)
{ {
observerVec.removeElement(obs); observers.removeElement(victim);
} }
/**
* Deletes all Observers of this Observable.
*/
public synchronized void deleteObservers() public synchronized void deleteObservers()
{ {
observerVec.removeAllElements(); observers.removeAllElements();
} }
/**
* @return Whether or not this Observable has changed.
*/
public synchronized boolean hasChanged() public synchronized boolean hasChanged()
{ {
return changed; return changed;
} }
/**
* If the Observable has actually changed then tell all Observers about it,
* then resets state to unchanged.
*/
public void notifyObservers() public void notifyObservers()
{ {
notifyObservers(null); notifyObservers(null);
} }
public void notifyObservers(Object arg) /**
* If the Observable has actually changed then tell all Observers about it,
* then resets 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 Arguement to Observer's update method.
*/
public void notifyObservers(Object obj)
{ {
if (changed) if (!hasChanged())
{ return;
/* The JDK 1.2 spec states that though the order of notification Vector ob1 = (Vector) observers.clone();
* is unspecified in subclasses, in Observable it is in the order
* of registration. for (int i = 0; i < ob1.size(); i++)
*/ ((Observer) ob1.elementAt(i)).update(this, obj);
for (int i = 0, numObs = observerVec.size(); i < numObs; i++)
((Observer) (observerVec.elementAt(i))).update(this, arg); clearChanged();
changed = false;
}
} }
/**
* Marks this Observable as having changed.
*/
protected synchronized void setChanged() protected synchronized void setChanged()
{ {
changed = true; changed = true;
......
/* Copyright (C) 1998, 1999 Free Software Foundation /* Implemented when a class wants to be informed of changes in Observable
objects.
Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
This file is part of libgcj. 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.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.util; package java.util;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date August 25, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct * Status: Believed complete and correct
*/ */
/**
* Interface that is implemented when a class wants to be informed of changes
* in Observable objects.
*
* @see java.util.Observable
* @author Warren Levy <warrenl@cygnus.com>
* @date August 25, 1998.
*/
public interface Observer public interface Observer
{ {
public void update(Observable observed, Object arg); public void update(Observable observable, Object arg);
} }
...@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify ...@@ -7,7 +7,7 @@ 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
any later version. any later version.
GNU Classpath is distributed in the hope that it will be useful, but GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
...@@ -62,427 +62,477 @@ import java.io.*; ...@@ -62,427 +62,477 @@ import java.io.*;
* *
* @see PropertyResourceBundle * @see PropertyResourceBundle
* @author Jochen Hoenicke */ * @author Jochen Hoenicke */
public class Properties extends Hashtable { public class Properties extends Hashtable
/** {
* The property list that contains default values for any keys not /**
* in this property list. * The property list that contains default values for any keys not
*/ * in this property list.
protected Properties defaults; */
protected Properties defaults;
private static final long serialVersionUID = 4112578634029874840L;
private static final long serialVersionUID = 4112578634029874840L; /**
* Creates a new empty property list.
*/
public Properties()
{
this.defaults = null;
}
/** /**
* Creates a new empty property list. * Create a new empty property list with the specified default values.
*/ * @param defaults a Properties object containing the default values.
public Properties() { */
this.defaults = null; public Properties(Properties defaults)
} {
this.defaults = defaults;
}
/**
* 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>\</code><code>u</code>xxxx 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:\<code></code>u0020
* </pre>
*
* @param in the input stream
* @exception IOException if an error occured when reading
* from the input. */
public void load(InputStream inStream) throws IOException
{
BufferedReader reader =
new BufferedReader(new InputStreamReader(inStream));
String line;
/** while ((line = reader.readLine()) != null)
* Create a new empty property list with the specified default values. {
* @param defaults a Properties object containing the default values. char c = 0;
*/ int pos = 0;
public Properties(Properties defaults) { while (pos < line.length()
this.defaults = defaults; && Character.isWhitespace(c = line.charAt(pos)))
} pos++;
/** // If line is empty or begins with a comment character,
* Reads a property list from an input stream. The stream should // skip this line.
* have the following format: <br> if (pos == line.length() || c == '#' || c == '!')
* continue;
* 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>\</code><code>u</code>xxxx 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:\<code></code>u0020
* </pre>
*
* @param in the input stream
* @exception IOException if an error occured when reading
* from the input. */
public void load(InputStream inStream) throws IOException {
BufferedReader reader =
new BufferedReader(new InputStreamReader(inStream));
String line;
while ((line = reader.readLine()) != null) {
char c = 0;
int pos = 0;
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
// If line is empty or begins with a comment character, // The characaters up to the next Whitespace, ':', or '='
// skip this line. // describe the key. But look for escape sequences.
if (pos == line.length() || c == '#' || c == '!') StringBuffer key = new StringBuffer();
continue; 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)
{
case 'n':
key.append('\n');
break;
case 't':
key.append('\t');
break;
case 'r':
key.append('\r');
break;
case 'u':
if (pos + 4 <= line.length())
{
char uni = (char) Integer.parseInt
(line.substring(pos, pos + 4), 16);
key.append(uni);
} // else throw exception?
break;
default:
key.append(c);
break;
}
}
}
else
key.append(c);
}
// The characaters up to the next Whitespace, ':', or '=' boolean isDelim = (c == ':' || c == '=');
// describe the key. But look for escape sequences. while (pos < line.length()
StringBuffer key = new StringBuffer(); && Character.isWhitespace(c = line.charAt(pos)))
while (pos < line.length() pos++;
&& !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) {
case 'n':
key.append('\n');
break;
case 't':
key.append('\t');
break;
case 'r':
key.append('\r');
break;
case 'u':
if (pos+4 <= line.length()) {
char uni = (char) Integer.parseInt
(line.substring(pos, pos+4), 16);
key.append(uni);
} // else throw exception?
break;
default:
key.append(c);
break;
}
}
} else
key.append(c);
}
boolean isDelim = (c == ':' || c == '=');
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
if (!isDelim && (c == ':' || c == '=')) { if (!isDelim && (c == ':' || c == '='))
pos++; {
while (pos < line.length() pos++;
&& Character.isWhitespace(c = line.charAt(pos))) while (pos < line.length()
pos++; && Character.isWhitespace(c = line.charAt(pos)))
} pos++;
}
StringBuffer element = new StringBuffer(line.length()-pos); StringBuffer element = new StringBuffer(line.length() - pos);
while (pos < line.length()) { while (pos < line.length())
c = line.charAt(pos++); {
if (c == '\\') { c = line.charAt(pos++);
if (pos == line.length()) { if (c == '\\')
// The line continues on the next line. {
line = reader.readLine(); if (pos == line.length())
pos = 0; {
while (pos < line.length() // The line continues on the next line.
&& Character.isWhitespace(c = line.charAt(pos))) line = reader.readLine();
pos++; pos = 0;
element.ensureCapacity(line.length()-pos+element.length()); while (pos < line.length()
} else { && Character.isWhitespace(c = line.charAt(pos)))
c = line.charAt(pos++); pos++;
switch (c) { element.ensureCapacity(line.length() - pos +
case 'n': element.length());
element.append('\n'); }
break; else
case 't': {
element.append('\t'); c = line.charAt(pos++);
break; switch (c)
case 'r': {
element.append('\r'); case 'n':
break; element.append('\n');
case 'u': break;
if (pos+4 <= line.length()) { case 't':
char uni = (char) Integer.parseInt element.append('\t');
(line.substring(pos, pos+4), 16); break;
element.append(uni); case 'r':
} // else throw exception? element.append('\r');
break; break;
default: case 'u':
element.append(c); if (pos + 4 <= line.length())
break; {
} char uni = (char) Integer.parseInt
} (line.substring(pos, pos + 4), 16);
} else element.append(uni);
element.append(c); } // else throw exception?
} break;
put(key.toString(), element.toString()); default:
} element.append(c);
} break;
}
}
}
else
element.append(c);
}
put(key.toString(), element.toString());
}
}
/** /**
* Calls <code>store(OutputStream out, String header)</code> and * Calls <code>store(OutputStream out, String header)</code> and
* ignores the IOException that may be thrown. * ignores the IOException that may be thrown.
* @deprecated use store instead. * @deprecated use store instead.
* @exception ClassCastException if this property contains any key or * @exception ClassCastException if this property contains any key or
* value that isn't a string. * value that isn't a string.
*/ */
public void save(OutputStream out, String header) { public void save(OutputStream out, String header)
try { {
store(out,header); try
} catch (IOException ex) { {
} store(out, header);
} }
catch (IOException ex)
/** {
* Writes the key/value pairs to the given output stream. <br> }
* }
* If header is not null, this method writes a comment containing
* the header as first line to the stream. The next line (or first /**
* line if header is null) contains a comment with the current date. * Writes the key/value pairs to the given output stream. <br>
* Afterwards the key/value pairs are written to the stream in the *
* following format. <br> * If header is not null, this method writes a comment containing
* * the header as first line to the stream. The next line (or first
* Each line has the form <code>key = value</code>. Newlines, * line if header is null) contains a comment with the current date.
* Returns and tabs are written as <code>\n,\t,\r</code> resp. * Afterwards the key/value pairs are written to the stream in the
* The characters <code>\, !, #, =</code> and <code>:</code> are * following format. <br>
* preceeded by a backslash. Spaces are preceded with a backslash, *
* if and only if they are at the beginning of the key. Characters * Each line has the form <code>key = value</code>. Newlines,
* that are not in the ascii range 33 to 127 are written in the * Returns and tabs are written as <code>\n,\t,\r</code> resp.
* <code>\</code><code>u</code>xxxx Form. * The characters <code>\, !, #, =</code> and <code>:</code> are
* * preceeded by a backslash. Spaces are preceded with a backslash,
* @param out the output stream * if and only if they are at the beginning of the key. Characters
* @param header the header written in the first line, may be null. * that are not in the ascii range 33 to 127 are written in the
* @exception ClassCastException if this property contains any key or * <code>\</code><code>u</code>xxxx Form.
* value that isn't a string. *
*/ * @param out the output stream
public void store(OutputStream out, String header) throws IOException { * @param header the header written in the first line, may be null.
PrintWriter writer = new PrintWriter(out); * @exception ClassCastException if this property contains any key or
if (header != null) * value that isn't a string.
writer.println("#"+header); */
writer.println("#"+new Date().toString()); public void store(OutputStream out, String header) throws IOException
list(writer); {
writer.flush(); PrintWriter writer = new PrintWriter(out);
} if (header != null)
writer.println("#" + header);
/** writer.println("#" + new Date().toString());
* Adds the given key/value pair to this properties. This calls list(writer);
* the hashtable method put. writer.flush();
* @param key the key for this property }
* @param value the value for this property
* @return The old value for the given key. /**
* @since JDK1.2 */ * Adds the given key/value pair to this properties. This calls
public Object setProperty(String key, String value) { * the hashtable method put.
return put(key,value); * @param key the key for this property
} * @param value the value for this property
* @return The old value for the given key.
* @since JDK1.2 */
public Object setProperty(String key, String value)
{
return put(key, value);
}
/** /**
* Gets the property with the specified key in this property list. * Gets the property with the specified key in this property list.
* If the key is not found, the default property list is searched. * If the key is not found, the default property list is searched.
* If the property is not found in default or the default of * If the property is not found in default or the default of
* default, null is returned. * default, null is returned.
* @param key The key for this property. * @param key The key for this property.
* @param defaulValue A default value * @param defaulValue A default value
* @return The value for the given key, or null if not found. * @return The value for the given key, or null if not found.
* @exception ClassCastException if this property contains any key or * @exception ClassCastException if this property contains any key or
* value that isn't a string. * value that isn't a string.
*/ */
public String getProperty(String key) { public String getProperty(String key)
return getProperty(key, null); {
} return getProperty(key, null);
}
/** /**
* Gets the property with the specified key in this property list. If * Gets the property with the specified key in this property list. If
* the key is not found, the default property list is searched. If the * the key is not found, the default property list is searched. If the
* property is not found in default or the default of default, the * property is not found in default or the default of default, the
* specified defaultValue is returned. * specified defaultValue is returned.
* @param key The key for this property. * @param key The key for this property.
* @param defaulValue A default value * @param defaulValue A default value
* @return The value for the given key. * @return The value for the given key.
* @exception ClassCastException if this property contains any key or * @exception ClassCastException if this property contains any key or
* value that isn't a string. * value that isn't a string.
*/ */
public String getProperty(String key, String defaultValue) { public String getProperty(String key, String defaultValue)
Properties prop = this; {
// Eliminate tail recursion. Properties prop = this;
do { // Eliminate tail recursion.
String value = (String) prop.get(key); do
if (value != null) {
return value; String value = (String) prop.get(key);
prop = prop.defaults; if (value != null)
} while (prop != null); return value;
return defaultValue; prop = prop.defaults;
} }
while (prop != null);
return defaultValue;
}
private final void addHashEntries (Hashtable base) { private final void addHashEntries(Hashtable base)
if (defaults != null) {
defaults.addHashEntries(base); if (defaults != null)
Enumeration keys = keys (); defaults.addHashEntries(base);
while (keys.hasMoreElements()) Enumeration keys = keys();
base.put(keys.nextElement(), base); while (keys.hasMoreElements())
} base.put(keys.nextElement(), base);
}
/** /**
* Returns an enumeration of all keys in this property list, including * Returns an enumeration of all keys in this property list, including
* the keys in the default property list. * the keys in the default property list.
*/ */
public Enumeration propertyNames () { public Enumeration propertyNames()
// We make a new Hashtable that holds all the keys. Then we {
// return an enumeration for this hash. We do this because we // We make a new Hashtable that holds all the keys. Then we
// don't want modifications to be reflected in the enumeration // return an enumeration for this hash. We do this because we
// (per JCL), and because there doesn't seem to be a // don't want modifications to be reflected in the enumeration
// particularly better way to ensure that duplicates are // (per JCL), and because there doesn't seem to be a
// ignored. // particularly better way to ensure that duplicates are
Hashtable t = new Hashtable (); // ignored.
addHashEntries (t); Hashtable t = new Hashtable();
return t.keys(); addHashEntries(t);
} return t.keys();
}
/** /**
* Formats a key/value pair for output in a properties file. * Formats a key/value pair for output in a properties file.
* See store for a description of the format. * See store for a description of the format.
* @param key the key. * @param key the key.
* @param value the value. * @param value the value.
* @see #store * @see #store
*/ */
private String formatForOutput(String key, String value) { private String formatForOutput(String key, String value)
// This is a simple approximation of the expected line size. {
StringBuffer result = new StringBuffer(key.length()+value.length()+16); // This is a simple approximation of the expected line size.
boolean head = true; StringBuffer result =
for (int i=0; i< key.length(); i++) { new StringBuffer(key.length() + value.length() + 16);
char c = key.charAt(i); boolean head = true;
switch (c) { for (int i = 0; i < key.length(); i++)
case '\n': {
result.append("\\n"); char c = key.charAt(i);
break; switch (c)
case '\r': {
result.append("\\r"); case '\n':
break; result.append("\\n");
case '\t': break;
result.append("\\t"); case '\r':
break; result.append("\\r");
case '\\': break;
result.append("\\\\"); case '\t':
break; result.append("\\t");
case '!': break;
result.append("\\!"); case '\\':
break; result.append("\\\\");
case '#': break;
result.append("\\#"); case '!':
break; result.append("\\!");
case '=': break;
result.append("\\="); case '#':
break; result.append("\\#");
case ':': break;
result.append("\\:"); case '=':
break; result.append("\\=");
case ' ': break;
result.append("\\ "); case ':':
break; result.append("\\:");
default: break;
if (c < 32 || c > '~') { case ' ':
String hex = Integer.toHexString(c); result.append("\\ ");
result.append("\\u0000".substring(0, 6-hex.length())); break;
result.append(hex); default:
} else if (c < 32 || c > '~')
result.append(c); {
} String hex = Integer.toHexString(c);
if (c != 32) result.append("\\u0000".substring(0, 6 - hex.length()));
head = false; result.append(hex);
} }
result.append('='); else
head=true; result.append(c);
for (int i=0; i< value.length(); i++) { }
char c = value.charAt(i); if (c != 32)
switch (c) { head = false;
case '\n': }
result.append("\\n"); result.append('=');
break; head = true;
case '\r': for (int i = 0; i < value.length(); i++)
result.append("\\r"); {
break; char c = value.charAt(i);
case '\t': switch (c)
result.append("\\t"); {
break; case '\n':
case '\\': result.append("\\n");
result.append("\\\\"); break;
break; case '\r':
case '!': result.append("\\r");
result.append("\\!"); break;
break; case '\t':
case '#': result.append("\\t");
result.append("\\#"); break;
break; case '\\':
case ' ': result.append("\\\\");
result.append(head ? "\\ ": " "); break;
break; case '!':
default: result.append("\\!");
if (c < 32 || c > '~') { break;
String hex = Integer.toHexString(c); case '#':
result.append("\\u0000".substring(0, 6-hex.length())); result.append("\\#");
result.append(hex); break;
} else case ' ':
result.append(c); result.append(head ? "\\ " : " ");
} break;
if (c != 32) default:
head = false; if (c < 32 || c > '~')
} {
return result.toString(); String hex = Integer.toHexString(c);
} result.append("\\u0000".substring(0, 6 - hex.length()));
result.append(hex);
}
else
result.append(c);
}
if (c != 32)
head = false;
}
return result.toString();
}
/** /**
* Writes the key/value pairs to the given print stream. They are * Writes the key/value pairs to the given print stream. They are
* written in the way, described in the method store. * written in the way, described in the method store.
* @param out the stream, where the key/value pairs are written to. * @param out the stream, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or * @exception ClassCastException if this property contains any key or
* value that isn't a string. * value that isn't a string.
* @see #store * @see #store
*/ */
public void list(PrintStream out) { public void list(PrintStream out)
Enumeration keys = keys(); {
Enumeration elts = elements(); Enumeration keys = keys();
while (keys.hasMoreElements()) { Enumeration elts = elements();
String key = (String) keys.nextElement(); while (keys.hasMoreElements())
String elt = (String) elts.nextElement(); {
String output = formatForOutput(key,elt); String key = (String) keys.nextElement();
out.println(output); String elt = (String) elts.nextElement();
} String output = formatForOutput(key, elt);
} out.println(output);
}
}
/** /**
* Writes the key/value pairs to the given print writer. They are * Writes the key/value pairs to the given print writer. They are
* written in the way, described in the method store. * written in the way, described in the method store.
* @param out the writer, where the key/value pairs are written to. * @param out the writer, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or * @exception ClassCastException if this property contains any key or
* value that isn't a string. * value that isn't a string.
* @see #store * @see #store
* @see #list(java.io.PrintStream) * @see #list(java.io.PrintStream)
* @since JDK1.1 * @since JDK1.1
*/ */
public void list(PrintWriter out) { public void list(PrintWriter out)
Enumeration keys = keys(); {
Enumeration elts = elements(); Enumeration keys = keys();
while (keys.hasMoreElements()) { Enumeration elts = elements();
String key = (String) keys.nextElement(); while (keys.hasMoreElements())
String elt = (String) elts.nextElement(); {
String output = formatForOutput(key,elt); String key = (String) keys.nextElement();
out.println(output); String elt = (String) elts.nextElement();
} String output = formatForOutput(key, elt);
} out.println(output);
}
}
} }
...@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify ...@@ -7,7 +7,7 @@ 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
any later version. any later version.
GNU Classpath is distributed in the hope that it will be useful, but GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
...@@ -30,7 +30,8 @@ executable file might be covered by the GNU General Public License. */ ...@@ -30,7 +30,8 @@ executable file might be covered by the GNU General Public License. */
package java.util; package java.util;
public interface SortedMap extends Map { public interface SortedMap extends Map
{
Comparator comparator(); Comparator comparator();
Object firstKey(); Object firstKey();
SortedMap headMap(Object toKey); SortedMap headMap(Object toKey);
......
/* Copyright (C) 1998, 1999 Free Software Foundation /* Stack.java - Class that provides a Last In First Out (LIFO)
datatype, known more commonly as a Stack
Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
This file is part of libgcj. 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.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.util; package java.util;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date August 20, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct * Status: Believed complete and correct
*/ */
/**
* Stack provides a Last In First Out (LIFO) data type, commonly known
* as a Stack.
*
* Stack itself extends Vector and provides the additional methods
* for stack manipulation (push, pop, peek).
*
* @author Warren Levy <warrenl@cygnus.com>
* @date August 20, 1998.
*/
public class Stack extends Vector public class Stack extends Vector
{ {
// Could use Vector methods internally for the following methods // Could use Vector methods internally for the following methods
// but have used Vector fields directly for efficiency (i.e. this // but have used Vector fields directly for efficiency (i.e. this
// often reduces out duplicate bounds checking). // often reduces out duplicate bounds checking).
public boolean empty() private static final long serialVersionUID = 1224463164541339165L;
/**
* This constructor creates a new Stack, initially empty
*/
public Stack()
{ {
return elementCount == 0; super();
} }
public synchronized Object peek() /**
* Pushes an Object onto the top of the stack. This method is effectively
* the same as addElement(item)
*
* @param item the Object to push onto the stack
* @returns the Object pushed onto the stack
* @see java.util.Vector#addElement(java.util.Object)
*/
public Object push(Object item)
{ {
if (elementCount == 0) // When growing the Stack, use the Vector routines in case more
throw new EmptyStackException(); // memory is needed.
// Note: spec indicates that this method *always* returns obj passed in!
return elementData[elementCount - 1]; addElement(item);
return item;
} }
/**
* Pops an item from the stack and returns it. The item popped is
* removed from the Stack
*
* @returns the Object popped from the stack
*/
public synchronized Object pop() public synchronized Object pop()
{ {
if (elementCount == 0) if (elementCount == 0)
...@@ -49,28 +96,44 @@ public class Stack extends Vector ...@@ -49,28 +96,44 @@ public class Stack extends Vector
return obj; return obj;
} }
public Object push(Object obj) /**
* Returns the top Object on the stack without removing it
*
* @returns the top Object on the stack
*/
public synchronized Object peek()
{ {
// When growing the Stack, use the Vector routines in case more if (elementCount == 0)
// memory is needed. throw new EmptyStackException();
// Note: spec indicates that this method *always* returns obj passed in!
addElement(obj); return elementData[elementCount - 1];
return obj;
} }
public synchronized int search(Object obj) /**
* Tests if the stack is empty
*
* @returns true if the stack contains no items, false otherwise
*/
public boolean empty()
{ {
// Return the position of obj on the stack as measured from the top; return elementCount == 0;
// i.e. the top element is 1, the next element down is 2, etc. }
// If obj is not on the stack, return -1
/**
* Returns the position of an Object on the stack, with the top
* most Object being at position 1, and each Object deeper in the
* stack at depth + 1
*
* @param o The object to search for
* @returns The 1 based depth of the Object, or -1 if the Object
* is not on the stack.
*/
public synchronized int search(Object o)
{
for (int i = elementCount-1; i >=0; --i) for (int i = elementCount-1; i >=0; --i)
if (elementData[i].equals(obj)) if (elementData[i].equals(o))
return elementCount - i; return elementCount - i;
return -1; return -1;
} }
private static final long serialVersionUID = 1224463164541339165L;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment