FileDocCategorySizeDatePackage
StripJavaComments.javaAPI DocApache Ant 1.704713Wed Dec 13 06:16:20 GMT 2006org.apache.tools.ant.filters

StripJavaComments

public final class StripJavaComments extends BaseFilterReader implements ChainableReader
This is a Java comment and string stripper reader that filters those lexical tokens out for purposes of simple Java parsing. (if you have more complex Java parsing needs, use a real lexer). Since this class heavily relies on the single char read function, you are recommended to make it work on top of a buffered reader.

Fields Summary
private int
readAheadCh
The read-ahead character, used for effectively pushing a single character back. A value of -1 indicates that no character is in the buffer.
private boolean
inString
Whether or not the parser is currently in the middle of a string literal.
private boolean
quoted
Whether or not the last char has been a backslash.
Constructors Summary
public StripJavaComments()
Constructor for "dummy" instances.

see
BaseFilterReader#BaseFilterReader()


               
      
        super();
    
public StripJavaComments(Reader in)
Creates a new filtered reader.

param
in A Reader object providing the underlying stream. Must not be null.

        super(in);
    
Methods Summary
public java.io.Readerchain(java.io.Reader rdr)
Creates a new StripJavaComments using the passed in Reader for instantiation.

param
rdr A Reader object providing the underlying stream. Must not be null.
return
a new filter based on this configuration, but filtering the specified reader

        StripJavaComments newFilter = new StripJavaComments(rdr);
        return newFilter;
    
public intread()
Returns the next character in the filtered stream, not including Java comments.

return
the next character in the resulting stream, or -1 if the end of the resulting stream has been reached
exception
IOException if the underlying stream throws an IOException during reading

        int ch = -1;
        if (readAheadCh != -1) {
            ch = readAheadCh;
            readAheadCh = -1;
        } else {
            ch = in.read();
            if (ch == '"" && !quoted) {
                inString = !inString;
                quoted = false;
            } else if (ch == '\\") {
                quoted = !quoted;
            } else {
                quoted = false;
                if (!inString) {
                    if (ch == '/") {
                        ch = in.read();
                        if (ch == '/") {
                            while (ch != '\n" && ch != -1 && ch != '\r") {
                                ch = in.read();
                            }
                        } else if (ch == '*") {
                            while (ch != -1) {
                                ch = in.read();
                                if (ch == '*") {
                                    ch = in.read();
                                    while (ch == '*" && ch != -1) {
                                        ch = in.read();
                                    }

                                    if (ch == '/") {
                                        ch = read();
                                        break;
                                    }
                                }
                            }
                        } else {
                            readAheadCh = ch;
                            ch = '/";
                        }
                    }
                }
            }
        }

        return ch;