1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
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
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
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 tests.support;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Reader;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Support_StringReader extends Reader {
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String str;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int markpos = -1;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int pos = 0;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int count;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Construct a StringReader on the String <code>str</code>. The size of
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the reader is set to the <code>length()</code> of the String and the
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Object to synchronize access through is set to <code>str</code>.
36f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param str
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the String to filter reads on.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_StringReader(String str) {
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(str);
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.str = str;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.count = str.length();
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method closes this StringReader. Once it is closed, you can no
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * longer read from it. Only the first invocation of this method has any
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * effect.
50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                str = null;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Answer a boolean indicating whether or not this StringReader is open.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isOpen() {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return str != null;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set a Mark position in this Reader. The parameter <code>readLimit</code>
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is ignored for StringReaders. Sending reset() will reposition the reader
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * back to the marked position provided the mark has not been invalidated.
72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readlimit
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            ignored for StringReaders.
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If an error occurs attempting mark this StringReader.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void mark(int readLimit) throws IOException {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (readLimit >= 0) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            synchronized (lock) {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (isOpen()) {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    markpos = pos;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IOException("StringReader is closed");
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Answers a boolean indicating whether or not this StringReader supports
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * mark() and reset(). This method always returns true.
97f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if mark() and reset() are supported,
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         <code>false</code> otherwise. This implementation always
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         returns <code>true</code>.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean markSupported() {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single character from this StringReader and returns the result as
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * an int. The 2 higher-order bytes are set to 0. If the end of reader was
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * encountered then return -1.
111f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character read or -1 if end of reader.
113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If the StringReader is already closed.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read() throws IOException {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (pos != count) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return str.charAt(pos++);
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return -1;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("StringReader is closed");
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most <code>count</code> characters from this StringReader and
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stores them at <code>offset</code> in the character array
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>buf</code>. Returns the number of characters actually read or -1
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * if the end of reader was encountered.
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            character array to store the read characters
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            offset in buf to store the read characters
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            maximum number of characters to read
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters read or -1 if end of reader.
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If the StringReader is closed.
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(char buf[], int offset, int count) throws IOException {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // avoid int overflow
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (0 <= offset && offset <= buf.length && 0 <= count
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && count <= buf.length - offset) {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            synchronized (lock) {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (isOpen()) {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (pos == this.count) {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return -1;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    int end = pos + count > this.count ? this.count : pos
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + count;
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    str.getChars(pos, end, buf, offset);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    int read = end - pos;
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    pos = end;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return read;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException("StringReader is closed");
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ArrayIndexOutOfBoundsException();
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Answers a <code>boolean</code> indicating whether or not this
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * StringReader is ready to be read without blocking. If the result is
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>true</code>, the next <code>read()</code> will not block. If
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the result is <code>false</code> this Reader may or may not block when
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>read()</code> is sent. The implementation in StringReader always
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns <code>true</code> even when it has been closed.
177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if the receiver will not block when
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         <code>read()</code> is called, <code>false</code> if unknown
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         or blocking will occur.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If an IO error occurs.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean ready() throws IOException {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("StringReader is closed");
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reset this StringReader's position to the last <code>mark()</code>
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * location. Invocations of <code>read()/skip()</code> will occur from
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this new location. If this Reader was not marked, the StringReader is
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reset to the beginning of the String.
200f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If this StringReader has already been closed.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() throws IOException {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pos = markpos != -1 ? markpos : 0;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException("StringReader is closed");
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Skips <code>count</code> number of characters in this StringReader.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Subsequent <code>read()</code>'s will not return these characters
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unless <code>reset()</code> is used.
219f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The number of characters to skip.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters actually skipped.
223f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception java.io.IOException
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                If this StringReader has already been closed.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long skip(long count) throws IOException {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isOpen()) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count <= 0) {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return 0;
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                long skipped = 0;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count < this.count - pos) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    pos = pos + (int) count;
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    skipped = count;
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    skipped = this.count - pos;
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    pos = this.count;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return skipped;
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("StringReader is closed");
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
248