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 Reader} and counts the line terminators encountered 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * while reading the data. The line number starts at 0 and is incremented any 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * time {@code '\r'}, {@code '\n'} or {@code "\r\n"} is read. The class has an 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * internal buffer for its data. The size of the buffer defaults to 8 KB. 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class LineNumberReader extends BufferedReader { 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lineNumber; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int markedLineNumber = -1; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean lastWasCR; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean markedLastWasCR; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new LineNumberReader on the Reader {@code in}. The internal 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer gets the default size (8 KB). 39f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Reader that is buffered. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LineNumberReader(Reader in) { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new LineNumberReader on the Reader {@code in}. The size of 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the internal buffer is specified by the parameter {@code size}. 50f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Reader that is buffered. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size of the buffer to allocate. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code size <= 0}. 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LineNumberReader(Reader in, int size) { 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in, size); 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the current line number for this reader. Numbering starts at 0. 64f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current line number. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getLineNumber() { 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lineNumber; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this reader. The parameter {@code readlimit} 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates how many characters can be read before the mark is invalidated. 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sending {@code reset()} will reposition this reader back to the marked 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. The 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line number associated with this marked position is also stored so that 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it can be restored when {@code reset()} is called. 80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of characters that can be read from this stream 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before the mark is invalidated. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the mark in this reader. 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void mark(int readlimit) throws IOException { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.mark(readlimit); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLineNumber = lineNumber; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLastWasCR = lastWasCR; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single character from the source reader and returns it as an 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer with the two higher-order bytes set to 0. Returns -1 if the end 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the source reader has been reached. 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count is incremented if a line terminator is encountered. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "\r\n"}. Line terminator sequences are always translated into 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 107f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the character read or -1 if the end of the source reader has been 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the reader is closed or another IOException occurs. 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 113f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson @SuppressWarnings("fallthrough") 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ch = super.read(); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ch == '\n' && lastWasCR) { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ch = super.read(); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (ch) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\r': 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ch = '\n'; 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = true; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fall through 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\n': 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ch; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 135325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes * Reads up to {@code count} characters from the source reader and stores 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * them in the character array {@code buffer} starting at {@code offset}. 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of characters actually read or -1 if no characters 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have been read and the end of this reader has been reached. 139325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes * 140325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes * <p>The line number count is incremented if a line terminator is encountered. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 14255392539fea537abfb6581b474918f9d611fba27Jesse Wilson * {@code "\r\n"}. 143f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(char[] buffer, int offset, int count) throws IOException { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int read = super.read(buffer, offset, count); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (read == -1) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < read; i++) { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char ch = buffer[offset + i]; 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ch == '\r') { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = true; 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (ch == '\n') { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!lastWasCR) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return read; 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the next line of text available from this reader. A line is 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * represented by 0 or more characters followed by {@code '\r'}, 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}, {@code "\r\n"} or the end of the stream. The returned 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * string does not include the newline sequence. 177f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the contents of the line or {@code null} if no characters have 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been read before the end of the stream has been reached. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String readLine() throws IOException { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 18655392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (lastWasCR) { 18755392539fea537abfb6581b474918f9d611fba27Jesse Wilson chompNewline(); 18855392539fea537abfb6581b474918f9d611fba27Jesse Wilson lastWasCR = false; 18955392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 19055392539fea537abfb6581b474918f9d611fba27Jesse Wilson String result = super.readLine(); 19155392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (result != null) { 19255392539fea537abfb6581b474918f9d611fba27Jesse Wilson lineNumber++; 19355392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 19455392539fea537abfb6581b474918f9d611fba27Jesse Wilson return result; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this reader to the last marked location. It also resets the line 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count to what is was when this reader was marked. This implementation 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resets the source reader. 202f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is already closed, no mark has been set or the 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mark is no longer valid because more than {@code readlimit} 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes have been read since setting the mark. 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.reset(); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber = markedLineNumber; 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = markedLastWasCR; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the line number of this reader to the specified {@code lineNumber}. 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that this may have side effects on the line number associated with 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the last marked position. 223f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lineNumber 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new line number value. 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setLineNumber(int lineNumber) { 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.lineNumber = lineNumber; 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 236f9480f317cddcec859025833b748f096247a40aaElliott Hughes * Skips {@code charCount} characters in this reader. Subsequent calls to 237f9480f317cddcec859025833b748f096247a40aaElliott Hughes * {@code read} will not return these characters unless {@code reset} 238f9480f317cddcec859025833b748f096247a40aaElliott Hughes * is used. This implementation skips {@code charCount} number of characters in 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source reader and increments the line number count whenever line 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * terminator sequences are skipped. 241f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually skipped. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 244f9480f317cddcec859025833b748f096247a40aaElliott Hughes * if {@code charCount < 0}. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #read() 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 252f9480f317cddcec859025833b748f096247a40aaElliott Hughes public long skip(long charCount) throws IOException { 253f9480f317cddcec859025833b748f096247a40aaElliott Hughes if (charCount < 0) { 254a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IllegalArgumentException("charCount < 0: " + charCount); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 257f9480f317cddcec859025833b748f096247a40aaElliott Hughes for (int i = 0; i < charCount; i++) { 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (read() == -1) { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 262f9480f317cddcec859025833b748f096247a40aaElliott Hughes return charCount; 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 266