/*
* IncrementRange.java
* Copyright (C) 2000-2001 Stuart Yeates
*
* This program 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 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
// the package we're in
package org.greenstone.gsdl3.selfContained;
// java standard library classes used
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
/**
* Class IncrementRange increments strings and streams over a limited range of Characters.
*
*
* @author stuart yeates (s.yeates@cs.waikato.ac.nz) at the New Zealand Digital Library
* @version $Revision: 5663 $
* @see Increment
*
*/
final public class IncrementRange
extends Increment
implements Cloneable, Serializable
{
/**
* Create an IncrementRange which counts between first and last inclusive
*
* @param first the first character in the range
* @param last the last character in the range
* @see Increment
*/
IncrementRange(char first, char last){
this.first = first;
this.last = last;
}
/**
* Create a default IncrementRange
*
* @see Increment
*/
IncrementRange(){
}
/**
* Create a IncrementRange over all Unicode characters
*
* @see Increment
*/
IncrementRange(boolean b){
if (true) {
this.first = Character.MIN_VALUE;
this.last = Character.MAX_VALUE;
}
}
/** the last character in out range */
private char first = ' ';
/** the last character in out range */
private char last = 'z';
/**
* Increment a stream of characters, reading from the reader and writing the incremented characters to the writer
*
* @exception java.io.Error if any of the characters in the string are outside the range of first-last
* @param str the string to be incremented
* @return the incremented string
* @see Increment
*/
long incrementStream(Reader rdr, Writer wtr) {
try {
long count = 0; // the return value
int i = rdr.read();
boolean carry = true;
while (i != -1) {
char c = (char) i;
// check the validity of the character we're about to increment
if (c < first || c > last)
throw new Error("Character '" + c + "' is ouside range");
if (c == last) {
if (carry == true) {
wtr.write(first);
carry = true;
} else {
wtr.write(c);
carry = false;
}
} else {
if (carry == true) {
wtr.write(++c);
carry = false;
} else {
wtr.write(c);
carry = false;
}
}
count++;
// read the next character
i = rdr.read();
}
if (carry == true) {
wtr.write(first);
count++;
}
return count;
} catch (IOException e) {
System.err.println("IOException in incrementStream()");
throw new Error(e.toString());
}
}
/**
* Increment a string of characters
*
* @exception java.lang.Error if any of the characters in the string are outside the range of first-last
* @param str the string to be incremented
* @return the incremented string
* @see Increment
*/
public final String incrementString(String str) {
StringBuffer buffer = new StringBuffer();
if (str.equals("")) {
buffer.append(first);
return buffer.toString();
} else {
boolean carry = true;
for (int i=0;i last)
throw new Error("Character '" + c + "' is ouside range");
if (c == last) {
if (carry == true) {
buffer.append(first);
carry = true;
} else {
buffer.append(c);
carry = false;
}
} else {
if (carry == true) {
buffer.append(++c);
carry = false;
} else {
buffer.append(c);
carry = false;
}
}
}
if (carry == true)
buffer.append(first);
}
return buffer.toString();
}
/**
* Test the incrementing of strings (never returns)
*/
public static void testStringIncrement() throws IOException
{
IncrementRange n = new IncrementRange ();
try {
String tmp = "";
System.out.println(stringToHex(tmp));
while (true) {
//checkStr(tmp);
tmp = n.incrementString(tmp);
n.checkStr(tmp);
}
} catch (Exception e) {
System.out.println("Caught exception: " + e);
}
}
/**
* Test the incrementing of streams (never returns)
*
*/
public static void testStreamIncrement()
{
IncrementRange n = new IncrementRange ();
try {
long counter = 0;
String tmp = "";
System.out.println(stringToHex(tmp));
while (true) {
//checkStr(tmp);
String tmp2 = n.incrementString(tmp);
StringWriter wtr = new StringWriter();
n.incrementStream(new StringReader(tmp),wtr);
if (!tmp2.equals(wtr.toString()))
throw new Exception("Error: \"" + tmp2 +
"\" and \"" + tmp2 +
"\"");
counter++;
if (counter % 1000000 == 0)
System.out.println(counter + " " + tmp);
tmp = tmp2;
}
} catch (Exception e) {
System.out.println("Caught exception: " + e);
}
}
/**
* Tests stream incrementing
*
*
*/
public static void main(String args[])
{
testStreamIncrement();
}
}