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
This commit is contained in:
Mark Wielaard 2001-03-19 23:00:18 +00:00 committed by Mark Wielaard
parent 80fc2e84d9
commit 86c9776ba2
13 changed files with 802 additions and 533 deletions

View file

@ -40,7 +40,6 @@ import java.io.ObjectOutputStream;
* to or removing from the end of a list, checking the size, &c.
*
* @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.List
*/

View file

@ -33,8 +33,6 @@ package java.util;
* Hashtable.
*
* @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
{

View file

@ -40,8 +40,6 @@ package java.util;
* in the Collections framework.
*
* @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
{

View file

@ -1,24 +1,65 @@
/* 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
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
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. */
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
* "The Java Language Specification", ISBN 0-201-63451-1.
* 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 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;
}

View file

@ -1,24 +1,47 @@
// 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;
/**
* @author Tom Tromey <tromey@cygnus.com>
* @date December 12, 1998
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* 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
{
}

View file

@ -1,28 +1,28 @@
/* EventObject.java - Represent events fired by objects.
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
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 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.
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.
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. */
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;

View file

@ -45,8 +45,6 @@ import java.io.ObjectOutputStream;
* HashSet is a part of the JDK1.2 Collections API.
*
* @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
implements Set, Cloneable, Serializable

View file

@ -1,30 +1,49 @@
/* 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;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date September 2, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct.
*/
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date September 2, 1998.
*/
public class Observable
{
/* tracks whether this object has changed */
/** tracks whether this object has changed */
private boolean changed;
/* 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[]
* but that would mean writing more code rather than making use of
@ -34,63 +53,101 @@ public class Observable
* we may decide to make the tradeoff and reimplement with an Observer[].
*/
/**
* Constructs an Observable with zero Observers.
*/
public Observable()
{
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 (!observerVec.contains(obs))
observerVec.addElement(obs);
if (!observers.contains(observer))
observers.addElement(observer);
}
/**
* Reset this Observable's state to unchanged.
*/
protected synchronized void clearChanged()
{
changed = false;
}
/**
* @return Number of Observers for this Observable.
*/
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()
{
observerVec.removeAllElements();
observers.removeAllElements();
}
/**
* @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 resets state to unchanged.
*/
public void notifyObservers()
{
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)
{
/* The JDK 1.2 spec states that though the order of notification
* is unspecified in subclasses, in Observable it is in the order
* of registration.
*/
for (int i = 0, numObs = observerVec.size(); i < numObs; i++)
((Observer) (observerVec.elementAt(i))).update(this, arg);
changed = false;
}
if (!hasChanged())
return;
Vector ob1 = (Vector) observers.clone();
for (int i = 0; i < ob1.size(); i++)
((Observer) ob1.elementAt(i)).update(this, obj);
clearChanged();
}
/**
* Marks this Observable as having changed.
*/
protected synchronized void setChanged()
{
changed = true;

View file

@ -1,24 +1,48 @@
/* 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;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date August 25, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* 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 void update(Observable observed, Object arg);
public void update(Observable observable, Object arg);
}

View file

@ -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
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
@ -62,427 +62,477 @@ import java.io.*;
*
* @see PropertyResourceBundle
* @author Jochen Hoenicke */
public class Properties extends Hashtable {
/**
* The property list that contains default values for any keys not
* in this property list.
*/
protected Properties defaults;
public class Properties extends Hashtable
{
/**
* The property list that contains default values for any keys not
* in this property list.
*/
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.
*/
public Properties()
{
this.defaults = null;
}
/**
* 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;
}
/**
* 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;
/**
* 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;
}
while ((line = reader.readLine()) != null)
{
char c = 0;
int pos = 0;
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
/**
* 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) {
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,
// skip this line.
if (pos == line.length() || c == '#' || c == '!')
continue;
// If line is empty or begins with a comment character,
// skip this line.
if (pos == line.length() || c == '#' || c == '!')
continue;
// The characaters 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)
{
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 '='
// 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) {
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++;
boolean isDelim = (c == ':' || c == '=');
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
if (!isDelim && (c == ':' || c == '=')) {
pos++;
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
}
if (!isDelim && (c == ':' || c == '='))
{
pos++;
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
pos++;
}
StringBuffer element = new StringBuffer(line.length()-pos);
while (pos < line.length()) {
c = line.charAt(pos++);
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++;
element.ensureCapacity(line.length()-pos+element.length());
} else {
c = line.charAt(pos++);
switch (c) {
case 'n':
element.append('\n');
break;
case 't':
element.append('\t');
break;
case 'r':
element.append('\r');
break;
case 'u':
if (pos+4 <= line.length()) {
char uni = (char) Integer.parseInt
(line.substring(pos, pos+4), 16);
element.append(uni);
} // else throw exception?
break;
default:
element.append(c);
break;
}
}
} else
element.append(c);
}
put(key.toString(), element.toString());
}
}
StringBuffer element = new StringBuffer(line.length() - pos);
while (pos < line.length())
{
c = line.charAt(pos++);
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++;
element.ensureCapacity(line.length() - pos +
element.length());
}
else
{
c = line.charAt(pos++);
switch (c)
{
case 'n':
element.append('\n');
break;
case 't':
element.append('\t');
break;
case 'r':
element.append('\r');
break;
case 'u':
if (pos + 4 <= line.length())
{
char uni = (char) Integer.parseInt
(line.substring(pos, pos + 4), 16);
element.append(uni);
} // else throw exception?
break;
default:
element.append(c);
break;
}
}
}
else
element.append(c);
}
put(key.toString(), element.toString());
}
}
/**
* Calls <code>store(OutputStream out, String header)</code> and
* ignores the IOException that may be thrown.
* @deprecated use store instead.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public void save(OutputStream out, String header) {
try {
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.
* Afterwards the key/value pairs are written to the stream in the
* following format. <br>
*
* Each line has the form <code>key = value</code>. Newlines,
* Returns and tabs are written as <code>\n,\t,\r</code> resp.
* The characters <code>\, !, #, =</code> and <code>:</code> are
* preceeded by a backslash. Spaces are preceded with a backslash,
* if and only if they are at the beginning of the key. Characters
* that are not in the ascii range 33 to 127 are written in the
* <code>\</code><code>u</code>xxxx Form.
*
* @param out the output stream
* @param header the header written in the first line, may be null.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public void store(OutputStream out, String header) throws IOException {
PrintWriter writer = new PrintWriter(out);
if (header != null)
writer.println("#"+header);
writer.println("#"+new Date().toString());
list(writer);
writer.flush();
}
/**
* 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.
* @since JDK1.2 */
public Object setProperty(String key, String value) {
return put(key,value);
}
/**
* Calls <code>store(OutputStream out, String header)</code> and
* ignores the IOException that may be thrown.
* @deprecated use store instead.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public void save(OutputStream out, String header)
{
try
{
store(out, header);
}
catch (IOException ex)
{
}
}
/**
* 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 property is not found in default or the default of
* default, null is returned.
* @param key The key for this property.
* @param defaulValue A default value
* @return The value for the given key, or null if not found.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public String getProperty(String key) {
return getProperty(key, null);
}
/**
* 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.
* Afterwards the key/value pairs are written to the stream in the
* following format. <br>
*
* Each line has the form <code>key = value</code>. Newlines,
* Returns and tabs are written as <code>\n,\t,\r</code> resp.
* The characters <code>\, !, #, =</code> and <code>:</code> are
* preceeded by a backslash. Spaces are preceded with a backslash,
* if and only if they are at the beginning of the key. Characters
* that are not in the ascii range 33 to 127 are written in the
* <code>\</code><code>u</code>xxxx Form.
*
* @param out the output stream
* @param header the header written in the first line, may be null.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public void store(OutputStream out, String header) throws IOException
{
PrintWriter writer = new PrintWriter(out);
if (header != null)
writer.println("#" + header);
writer.println("#" + new Date().toString());
list(writer);
writer.flush();
}
/**
* 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
* property is not found in default or the default of default, the
* specified defaultValue is returned.
* @param key The key for this property.
* @param defaulValue A default value
* @return The value for the given key.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public String getProperty(String key, String defaultValue) {
Properties prop = this;
// Eliminate tail recursion.
do {
String value = (String) prop.get(key);
if (value != null)
return value;
prop = prop.defaults;
} while (prop != null);
return defaultValue;
}
/**
* 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.
* @since JDK1.2 */
public Object setProperty(String key, String value)
{
return put(key, value);
}
private final void addHashEntries (Hashtable base) {
if (defaults != null)
defaults.addHashEntries(base);
Enumeration keys = keys ();
while (keys.hasMoreElements())
base.put(keys.nextElement(), base);
}
/**
* 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 property is not found in default or the default of
* default, null is returned.
* @param key The key for this property.
* @param defaulValue A default value
* @return The value for the given key, or null if not found.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public String getProperty(String key)
{
return getProperty(key, null);
}
/**
* Returns an enumeration of all keys in this property list, including
* the keys in the default property list.
*/
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
// don't want modifications to be reflected in the enumeration
// (per JCL), and because there doesn't seem to be a
// particularly better way to ensure that duplicates are
// ignored.
Hashtable t = new Hashtable ();
addHashEntries (t);
return t.keys();
}
/**
* 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
* property is not found in default or the default of default, the
* specified defaultValue is returned.
* @param key The key for this property.
* @param defaulValue A default value
* @return The value for the given key.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
*/
public String getProperty(String key, String defaultValue)
{
Properties prop = this;
// Eliminate tail recursion.
do
{
String value = (String) prop.get(key);
if (value != null)
return value;
prop = prop.defaults;
}
while (prop != null);
return defaultValue;
}
/**
* Formats a key/value pair for output in a properties file.
* See store for a description of the format.
* @param key the key.
* @param value the value.
* @see #store
*/
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);
boolean head = true;
for (int i=0; i< key.length(); i++) {
char c = key.charAt(i);
switch (c) {
case '\n':
result.append("\\n");
break;
case '\r':
result.append("\\r");
break;
case '\t':
result.append("\\t");
break;
case '\\':
result.append("\\\\");
break;
case '!':
result.append("\\!");
break;
case '#':
result.append("\\#");
break;
case '=':
result.append("\\=");
break;
case ':':
result.append("\\:");
break;
case ' ':
result.append("\\ ");
break;
default:
if (c < 32 || c > '~') {
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;
}
result.append('=');
head=true;
for (int i=0; i< value.length(); i++) {
char c = value.charAt(i);
switch (c) {
case '\n':
result.append("\\n");
break;
case '\r':
result.append("\\r");
break;
case '\t':
result.append("\\t");
break;
case '\\':
result.append("\\\\");
break;
case '!':
result.append("\\!");
break;
case '#':
result.append("\\#");
break;
case ' ':
result.append(head ? "\\ ": " ");
break;
default:
if (c < 32 || c > '~') {
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();
}
private final void addHashEntries(Hashtable base)
{
if (defaults != null)
defaults.addHashEntries(base);
Enumeration keys = keys();
while (keys.hasMoreElements())
base.put(keys.nextElement(), base);
}
/**
* Writes the key/value pairs to the given print stream. They are
* written in the way, described in the method store.
* @param out the stream, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
* @see #store
*/
public void list(PrintStream out) {
Enumeration keys = keys();
Enumeration elts = elements();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String elt = (String) elts.nextElement();
String output = formatForOutput(key,elt);
out.println(output);
}
}
/**
* Returns an enumeration of all keys in this property list, including
* the keys in the default property list.
*/
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
// don't want modifications to be reflected in the enumeration
// (per JCL), and because there doesn't seem to be a
// particularly better way to ensure that duplicates are
// ignored.
Hashtable t = new Hashtable();
addHashEntries(t);
return t.keys();
}
/**
* Writes the key/value pairs to the given print writer. They are
* written in the way, described in the method store.
* @param out the writer, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
* @see #store
* @see #list(java.io.PrintStream)
* @since JDK1.1
*/
public void list(PrintWriter out) {
Enumeration keys = keys();
Enumeration elts = elements();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String elt = (String) elts.nextElement();
String output = formatForOutput(key,elt);
out.println(output);
}
}
/**
* Formats a key/value pair for output in a properties file.
* See store for a description of the format.
* @param key the key.
* @param value the value.
* @see #store
*/
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);
boolean head = true;
for (int i = 0; i < key.length(); i++)
{
char c = key.charAt(i);
switch (c)
{
case '\n':
result.append("\\n");
break;
case '\r':
result.append("\\r");
break;
case '\t':
result.append("\\t");
break;
case '\\':
result.append("\\\\");
break;
case '!':
result.append("\\!");
break;
case '#':
result.append("\\#");
break;
case '=':
result.append("\\=");
break;
case ':':
result.append("\\:");
break;
case ' ':
result.append("\\ ");
break;
default:
if (c < 32 || c > '~')
{
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;
}
result.append('=');
head = true;
for (int i = 0; i < value.length(); i++)
{
char c = value.charAt(i);
switch (c)
{
case '\n':
result.append("\\n");
break;
case '\r':
result.append("\\r");
break;
case '\t':
result.append("\\t");
break;
case '\\':
result.append("\\\\");
break;
case '!':
result.append("\\!");
break;
case '#':
result.append("\\#");
break;
case ' ':
result.append(head ? "\\ " : " ");
break;
default:
if (c < 32 || c > '~')
{
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
* written in the way, described in the method store.
* @param out the stream, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
* @see #store
*/
public void list(PrintStream out)
{
Enumeration keys = keys();
Enumeration elts = elements();
while (keys.hasMoreElements())
{
String key = (String) keys.nextElement();
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
* written in the way, described in the method store.
* @param out the writer, where the key/value pairs are written to.
* @exception ClassCastException if this property contains any key or
* value that isn't a string.
* @see #store
* @see #list(java.io.PrintStream)
* @since JDK1.1
*/
public void list(PrintWriter out)
{
Enumeration keys = keys();
Enumeration elts = elements();
while (keys.hasMoreElements())
{
String key = (String) keys.nextElement();
String elt = (String) elts.nextElement();
String output = formatForOutput(key, elt);
out.println(output);
}
}
}

View file

@ -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
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
@ -30,7 +30,8 @@ executable file might be covered by the GNU General Public License. */
package java.util;
public interface SortedMap extends Map {
public interface SortedMap extends Map
{
Comparator comparator();
Object firstKey();
SortedMap headMap(Object toKey);

View file

@ -1,42 +1,89 @@
/* 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;
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date August 20, 1998.
*/
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* 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
{
// Could use Vector methods internally for the following methods
// but have used Vector fields directly for efficiency (i.e. this
// 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)
throw new EmptyStackException();
// When growing the Stack, use the Vector routines in case more
// 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()
{
if (elementCount == 0)
@ -49,28 +96,44 @@ public class Stack extends Vector
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
// memory is needed.
// Note: spec indicates that this method *always* returns obj passed in!
if (elementCount == 0)
throw new EmptyStackException();
addElement(obj);
return obj;
return elementData[elementCount - 1];
}
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;
// i.e. the top element is 1, the next element down is 2, etc.
// If obj is not on the stack, return -1
return elementCount == 0;
}
/**
* 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)
if (elementData[i].equals(obj))
return elementCount - i;
if (elementData[i].equals(o))
return elementCount - i;
return -1;
}
private static final long serialVersionUID = 1224463164541339165L;
}