[kaffe] Bug report (java.io.StreamTokenizer)
Ito Kazumitsu
kaz@maczuka.gcd.org
Tue Jul 1 06:19:02 2003
>>>>> ":" == Dalibor Topic <robilad@yahoo.com> writes:
:> --- Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp> wrote:
>> In message "Re: [kaffe] Bug report (java.io.StreamTokenizer)"
>> on 03/07/01, Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp> writes:
>> > (And I guess) BUT ONLY THE ATTRIBUTE MOST RECENTLY ASSIGNED IS EFFECTIVE.
>>
>> And additionally, THE NUMERIC ATTRIBUTE IS KEPT EFFECTIVE EVEN IF
>> OTHER ATTIBUTES ARE ASSIGNED.
>>
>> Applying the attached patch, I am getting the same results as Sun's.
:> great work, Ito! please check it in.
I thought I was getting the same results as Sun's, but finally,
I could not get exactly the same result.
Attached is my new test program that generates various patterns
of test cases and prints the results of them.
And I put the results at:
Sun's
http://www.jsdi.or.jp/kaffe/StreamTokenizerTest2.out.Sun
Kaffe's original java.io.StreamTokenizer
http://www.jsdi.or.jp/kaffe/StreamTokenizerTest2.out.Kaffe
Kaffe's patched java.io.StreamTokenizer
http://www.jsdi.or.jp/kaffe/StreamTokenizerTest2.out.Kaffe2
Further guessing on how Sun's StreamTokenizer is working is needed.
bash-2.05b$ cat StreamTokenizerTest2.java
import java.io.*;
public class StreamTokenizerTest2 {
public static void main(String[] args) throws Exception {
String[] a = new String[] {"S", "C", "Q", "W", "N"};
for (int i=1; i<=5; i++) {
Permutation.generate(a, i, new MainHandler());
}
}
private static class MainHandler extends Permutation.Handler {
public void doit(Object[] array) {
String[] args = new String[array.length + 1];
System.arraycopy(array, 0, args, 1, array.length);
args[0] = "1";
try {
for (int i=0; i<args.length; i++) {
System.out.print(args[i] + " ");
}
System.out.println();
test(args);
}
catch (Exception e) {}
}
}
private static void test(String[] args) throws Exception {
StreamTokenizer tok = new StreamTokenizer(new FileInputStream("StreamTokenizerTest2.txt"));
tok.resetSyntax();
int c = args[0].charAt(0);
for (int i=1; i<args.length; i++) {
if (args[i].equals("S")) tok.whitespaceChars(c, c);
else if (args[i].equals("C")) tok.commentChar(c);
else if (args[i].equals("Q")) tok.quoteChar(c);
else if (args[i].equals("N")) tok.parseNumbers();
else if (args[i].equals("W")) tok.wordChars(c, c);
}
while (true) {
int t = tok.nextToken();
if (t == StreamTokenizer.TT_NUMBER) {
System.out.println(tok.nval + ": " + t);
}
else {
System.out.println(tok.sval + ": " + t);
}
if (t == StreamTokenizer.TT_EOF) break;
}
}
}
bash-2.05b$ cat Permutation.java
public class Permutation {
public static void generate(Object[] array, int n, Handler h) {
int l = array.length;
if (n == 1) {
for (int i = 0; i < l; i++) {
h.doit(new Object[] {array[i]});
}
return;
}
final int N = n;
final Handler H = h;
for (int i = 0; i < l; i++) {
final Object OBJ = array[i];
Object[] a1 = new Object[l - 1];
System.arraycopy(array, 0, a1, 0, i);
System.arraycopy(array, i+1, a1, i, l-i-1);
class Handler1 extends Handler {
public void doit(Object[] a2) {
Object[] a3 = new Object[N];
System.arraycopy(a2, 0, a3, 1, N-1);
a3[0] = OBJ;
H.doit(a3);
}
};
generate(a1, n-1, new Handler1());
}
return;
}
public static class Handler {
public void doit(Object[] array) {}
}
}
bash-2.05b$ cat StreamTokenizerTest2.txt
121
bash-2.05b$