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
20b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughesimport java.util.Arrays;
21b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A specialized {@link Reader} for reading the contents of a char array.
24f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see CharArrayWriter
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CharArrayReader extends Reader {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The buffer for characters.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
31171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes    protected char[] buf;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The current buffer position.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int pos;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The current mark position.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int markedPos = -1;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ending index of the buffer.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int count;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a CharArrayReader on the char array {@code buf}. The size of
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the reader is set to the length of the buffer and the object to to read
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from is set to {@code buf}.
52f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the char array from which to read.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharArrayReader(char[] buf) {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.buf = buf;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.count = buf.length;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a CharArrayReader on the char array {@code buf}. The size of
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the reader is set to {@code length} and the start position from which to
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * read the buffer is set to {@code offset}.
65f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the char array from which to read.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first character in {@code buf} to read.
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of characters that can be read from {@code buf}.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code offset} is greater than the size of {@code buf} .
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharArrayReader(char[] buf, int offset, int length) {
7755392539fea537abfb6581b474918f9d611fba27Jesse Wilson        /*
7855392539fea537abfb6581b474918f9d611fba27Jesse Wilson         * The spec of this constructor is broken. In defining the legal values
7955392539fea537abfb6581b474918f9d611fba27Jesse Wilson         * of offset and length, it doesn't consider buffer's length. And to be
8055392539fea537abfb6581b474918f9d611fba27Jesse Wilson         * compatible with the broken spec, we must also test whether
8155392539fea537abfb6581b474918f9d611fba27Jesse Wilson         * (offset + length) overflows.
8255392539fea537abfb6581b474918f9d611fba27Jesse Wilson         */
8355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        if (offset < 0 || offset > buf.length || length < 0 || offset + length < 0) {
8455392539fea537abfb6581b474918f9d611fba27Jesse Wilson            throw new IllegalArgumentException();
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.buf = buf;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.pos = offset;
88f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        this.markedPos = offset;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* This is according to spec */
9155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        int bufferLength = buf.length;
9255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        this.count = offset + length < bufferLength ? length : bufferLength;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method closes this CharArrayReader. Once it is closed, you can no
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * longer read from it. Only the first invocation of this method has any
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * effect.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buf = null;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader is open.
111f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the reader is open, {@code false} otherwise.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isOpen() {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buf != null;
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader is closed.
120f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the reader is closed, {@code false} otherwise.
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isClosed() {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buf == null;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a mark position in this reader. The parameter {@code readLimit} is
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ignored for CharArrayReaders. Calling {@code reset()} will reposition the
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reader back to the marked position provided the mark has not been
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * invalidated.
132f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readLimit
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            ignored for CharArrayReaders.
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void mark(int readLimit) throws IOException {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
141b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            markedPos = pos;
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes    private void checkNotClosed() throws IOException {
147b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (isClosed()) {
148b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IOException("CharArrayReader is closed");
149b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        }
150b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes    }
151b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader supports the {@code mark()} and
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code reset()} methods.
155f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} for CharArrayReader.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean markSupported() {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single character from this reader and returns it as an integer
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the two higher-order bytes set to 0. Returns -1 if no more
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters are available from this reader.
169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character read as an int or -1 if the end of the reader has
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         been reached.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read() throws IOException {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
178b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (pos == count) {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return -1;
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return buf[pos++];
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most {@code count} characters from this CharArrayReader and
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stores them at {@code offset} in the character array {@code buf}.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of characters actually read or -1 if the end of reader
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * was encountered.
191f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the character array to store the characters read.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initial position in {@code buffer} to store the characters
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            read from this reader.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param len
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of characters to read.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return number of characters read or -1 if the end of the reader has been
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         reached.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code len < 0}, or if
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code offset + len} is bigger than the size of
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code buffer}.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(char[] buffer, int offset, int len) throws IOException {
210b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkOffsetAndCount(buffer.length, offset, len);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
212b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (pos < this.count) {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int bytesRead = pos + len > this.count ? this.count - pos : len;
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                System.arraycopy(this.buf, pos, buffer, offset, bytesRead);
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pos += bytesRead;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return bytesRead;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader is ready to be read without blocking.
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns {@code true} if the next {@code read} will not block. Returns
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code false} if this reader may or may not block when {@code read} is
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * called. The implementation in CharArrayReader always returns {@code true}
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * even when it has been closed.
229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this reader will not block when {@code read} is
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         called, {@code false} if unknown or blocking will occur.
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean ready() throws IOException {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
238b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pos != count;
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this reader's position to the last {@code mark()} location.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Invocations of {@code read()} and {@code skip()} will occur from this new
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * location. If this reader has not been marked, it is reset to the
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * beginning of the string.
248f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() throws IOException {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
255b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            pos = markedPos != -1 ? markedPos : 0;
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * Skips {@code charCount} characters in this reader. Subsequent calls to
262f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * {@code read} will not return these characters unless {@code reset}
263f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * is used. This method does nothing and returns 0 if {@code charCount <= 0}.
264f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters actually skipped.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
270f9480f317cddcec859025833b748f096247a40aaElliott Hughes    public long skip(long charCount) throws IOException {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
272b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            checkNotClosed();
273f9480f317cddcec859025833b748f096247a40aaElliott Hughes            if (charCount <= 0) {
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long skipped = 0;
277f9480f317cddcec859025833b748f096247a40aaElliott Hughes            if (charCount < this.count - pos) {
278f9480f317cddcec859025833b748f096247a40aaElliott Hughes                pos = pos + (int) charCount;
279f9480f317cddcec859025833b748f096247a40aaElliott Hughes                skipped = charCount;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                skipped = this.count - pos;
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pos = this.count;
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return skipped;
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
288