LineNumberInputStream.java revision 858dd42310622fd1b77bfa0fbd85ec851b3925c1
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Wraps an existing {@link InputStream} and counts the line terminators
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encountered while reading the data. Line numbering starts at 0. Recognized
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line terminator sequences are {@code '\r'}, {@code '\n'} and {@code "\r\n"}.
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When using {@code read}, line terminator sequences are always translated into
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}.
26f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated Use {@link LineNumberReader}
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class LineNumberInputStream extends FilterInputStream {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int lineNumber;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int markedLineNumber = -1;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int lastChar = -1;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int markedLastChar;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code LineNumberInputStream} on the {@link InputStream}
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code in}. Line numbers are counted for all data read from this stream.
43f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
44858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson     * <p><strong>Warning:</strong> passing a null source creates an invalid
45858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson     * {@code LineNumberInputStream}. All operations on such a stream will fail.
46858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson     *
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param in
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The non-null input stream to count line numbers.
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public LineNumberInputStream(InputStream in) {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(in);
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
55582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * {@inheritDoc}
56582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
57582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Note that the source stream may just be a sequence of {@code "\r\n"} bytes
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * which are converted into {@code '\n'} by this stream. Therefore,
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code available} returns only {@code in.available() / 2} bytes as
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * result.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int available() throws IOException {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return in.available() / 2 + (lastChar == -1 ? 0 : 1);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the current line number for this stream. Numbering starts at 0.
69f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current line number.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLineNumber() {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return lineNumber;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a mark position in this stream. The parameter {@code readlimit}
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates how many bytes can be read before the mark is invalidated.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sending {@code reset()} will reposition this stream back to the marked
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position, provided that {@code readlimit} has not been surpassed.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The line number count will also be reset to the last marked
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * line number count.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation sets a mark in the filtered stream.
85f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readlimit
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes that can be read from this stream before
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the mark is invalidated.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void mark(int readlimit) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        in.mark(readlimit);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        markedLineNumber = lineNumber;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        markedLastChar = lastChar;
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single byte from the filtered stream and returns it as an integer
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the range from 0 to 255. Returns -1 if the end of this stream has been
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reached.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The line number count is incremented if a line terminator is encountered.
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code "\r\n"}. Line terminator sequences are always translated into
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code '\n'}.
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the byte read or -1 if the end of the filtered stream has been
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         reached.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the stream is closed or another IOException occurs.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
114f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    @SuppressWarnings("fallthrough")
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read() throws IOException {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int currentChar = lastChar;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (currentChar == -1) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            currentChar = in.read();
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastChar = -1;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        switch (currentChar) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            case '\r':
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                currentChar = '\n';
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastChar = in.read();
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (lastChar == '\n') {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    lastChar = -1;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // fall through
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            case '\n':
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lineNumber++;
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return currentChar;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most {@code length} bytes from the filtered stream and stores
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * them in the byte array {@code buffer} starting at {@code offset}.
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of bytes actually read or -1 if no bytes have been
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * read and the end of this stream has been reached.
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The line number count is incremented if a line terminator is encountered.
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code "\r\n"}. Line terminator sequences are always translated into
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code '\n'}.
147f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array in which to store the bytes read.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initial position in {@code buffer} to store the bytes read
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            from this stream.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of bytes to store in {@code buffer}.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually read or -1 if the end of the
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         filtered stream has been reached while reading.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code offset + length} is greater than the length of
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code buffer}.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is closed or another IOException occurs.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code buffer} is {@code null}.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(byte[] buffer, int offset, int length) throws IOException {
1685839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson        // Force buffer null check first!
1695839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson        if (offset > buffer.length || offset < 0) {
170b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new ArrayIndexOutOfBoundsException("Offset out of bounds: " + offset);
171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        }
1725839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson        if (length < 0 || length > buffer.length - offset) {
173b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new ArrayIndexOutOfBoundsException("Length out of bounds: " + length);
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < length; i++) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int currentChar;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                currentChar = read();
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i != 0) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return i;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (currentChar == -1) {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return i == 0 ? -1 : i;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            buffer[offset + i] = (byte) currentChar;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return length;
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this stream to the last marked location. It also resets the line
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * count to what is was when this stream was marked.
197f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is already closed, no mark has been set or the
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             mark is no longer valid because more than {@code readlimit}
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             bytes have been read since setting the mark.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() throws IOException {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        in.reset();
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lineNumber = markedLineNumber;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lastChar = markedLastChar;
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the line number of this stream to the specified
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code lineNumber}. Note that this may have side effects on the
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * line number associated with the last marked position.
216f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param lineNumber
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new lineNumber value.
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setLineNumber(int lineNumber) {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.lineNumber = lineNumber;
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Skips {@code count} number of bytes in this stream. Subsequent
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code read()}'s will not return these bytes unless {@code reset()} is
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used. This implementation skips {@code count} number of bytes in the
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * filtered stream and increments the line number count whenever line
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * terminator sequences are skipped.
232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes to skip.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually skipped.
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is closed or another IOException occurs.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #read()
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long skip(long count) throws IOException {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (count <= 0) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < count; i++) {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int currentChar = read();
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (currentChar == -1) {
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return i;
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return count;
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
256