[kaffe] Bug report (java.io.StreamTokenizer)

Ito Kazumitsu ito.kazumitsu@hitachi-cable.co.jp
Mon Jun 30 18:11:01 2003


In message "Re: [kaffe] Bug report (java.io.StreamTokenizer)"
    on 03/07/01, Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp> writes:

> (From the API doc) Each byte read from the input stream is regarded
> as a character in the range '\u0000' through '\u00FF'. The character
> value is used to look up five possible attributes of the character:
> white space, alphabetic, numeric, string quote, and comment character.
> Each character can have zero or more of these attributes.
> (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.

--- java/io/StreamTokenizer.java.orig	Tue Feb 19 09:47:49 2002
+++ java/io/StreamTokenizer.java	Tue Jul  1 10:02:54 2003
@@ -74,6 +74,7 @@
 
 public void commentChar(int ch) {
 	if (ch >= 0 && ch <= 255) {
+		ordinaryCharKeepNumeric(ch);
 		lookup(ch).isComment = true;
 	}
 }
@@ -430,11 +431,24 @@
 	}
 }
 
+private void ordinaryCharKeepNumeric(int c) {
+	if (c >= 0 && c <= 255) {
+		TableEntry e = lookup(c);
+		e.isAlphabetic = false;
+		e.isStringQuote = false;
+		e.isComment = false;
+		e.isWhitespace = false;
+	}
+}
+
 public void parseNumbers() {
 	for (int letter = '0'; letter <= '9'; letter++) {
+		ordinaryChar(letter);
 		lookup(letter).isNumeric = true;
 	}
+	ordinaryChar('.');
 	lookup('.').isNumeric = true;
+	ordinaryChar('-');
 	lookup('-').isNumeric = true;
 }
 
@@ -444,6 +458,7 @@
 
 public void quoteChar(int ch) {
 	if (ch >= 0 && ch <= 255) {
+		ordinaryCharKeepNumeric(ch);
 		lookup(ch).isStringQuote = true;
 	}
 }
@@ -545,10 +560,8 @@
 	}
 
 	for (int letter = low; letter <= hi; letter++) {
-		TableEntry e = lookup(letter);
-		e.isWhitespace = true;
-		e.isAlphabetic = false;
-		e.isNumeric = false;
+		ordinaryCharKeepNumeric(letter);
+		lookup(letter).isWhitespace = true;
 	}    
 }
 
@@ -562,6 +575,7 @@
 	}
 
 	for (int letter = low; letter <= hi; letter++) {
+		ordinaryCharKeepNumeric(letter);
 		lookup(letter).isAlphabetic = true;
 	}    
 }