1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.io;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// BEGIN android-added
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// ENd android-added
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A specialized {@link Writer} that writes characters to a {@code StringBuffer}
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in a sequential manner, appending them in the process. The result can later
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be queried using the {@link #StringWriter(int)} or {@link #toString()}
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * methods.
293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see StringReader
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class StringWriter extends Writer {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private StringBuffer buf;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code StringWriter} which has a {@link StringBuffer}
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * allocated with the default size of 16 characters. The {@code
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringBuffer} is also the {@code lock} used to synchronize access to this
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * writer.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringWriter() {
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super();
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf = new StringBuffer(16);
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        lock = buf;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code StringWriter} which has a {@link StringBuffer}
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * allocated with a size of {@code initialSize} characters. The {@code
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringBuffer} is also the {@code lock} used to synchronize access to this
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * writer.
533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param initialSize
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the intial size of the target string buffer.
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringWriter(int initialSize) {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (initialSize < 0) {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf = new StringBuffer(initialSize);
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        lock = buf;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has no effect. In contrast to most {@code Writer} subclasses,
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the other methods in {@code StringWriter} do not throw an {@code IOException} if
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code close()} has been called.
693819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if an error occurs while closing this writer.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void close() throws IOException {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* empty */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has no effect.
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void flush() {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* empty */
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets a reference to this writer's internal {@link StringBuffer}. Any
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * changes made to the returned buffer are reflected in this writer.
893819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a reference to this writer's internal {@code StringBuffer}.
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringBuffer getBuffer() {
933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return buf;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets a copy of the contents of this writer as a string.
983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this writer's contents as a string.
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
1033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return buf.toString();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes {@code count} characters starting at {@code offset} in {@code buf}
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to this writer's {@code StringBuffer}.
1093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param cbuf
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the non-null character array to write.
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the first character in {@code cbuf} to write.
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param count
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the maximum number of characters to write.
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IndexOutOfBoundsException
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code offset < 0} or {@code count < 0}, or if {@code
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             offset + count} is greater than the size of {@code buf}.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(char[] cbuf, int offset, int count) {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // avoid int overflow
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-changed
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception priorities (in case of multiple errors) differ from
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // RI, but are spec-compliant.
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // removed redundant check, added null check, used (offset | count) < 0
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // instead of (offset < 0) || (count < 0) to safe one operation
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cbuf == null) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((offset | count) < 0 || count > cbuf.length - offset) {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-changed
1353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (count == 0) {
1363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            return;
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        buf.append(cbuf, offset, count);
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes one character to this writer's {@code StringBuffer}. Only the two
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * least significant bytes of the integer {@code oneChar} are written.
1443819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oneChar
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character to write to this writer's {@code StringBuffer}.
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(int oneChar) {
1503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        buf.append((char) oneChar);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes the characters from the specified string to this writer's {@code
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringBuffer}.
1563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param str
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the non-null string containing the characters to write.
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(String str) {
1623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        buf.append(str);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes {@code count} characters from {@code str} starting at {@code
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * offset} to this writer's {@code StringBuffer}.
1683819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param str
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the non-null string containing the characters to write.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the first character in {@code str} to write.
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param count
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of characters from {@code str} to write.
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws StringIndexOutOfBoundsException
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code offset < 0} or {@code count < 0}, or if {@code
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             offset + count} is greater than the length of {@code str}.
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(String str, int offset, int count) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String sub = str.substring(offset, offset + count);
1823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        buf.append(sub);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends the character {@code c} to this writer's {@code StringBuffer}.
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method works the same way as {@link #write(int)}.
1883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character to append to the target stream.
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this writer.
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringWriter append(char c) {
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        write(c);
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends the character sequence {@code csq} to this writer's {@code
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringBuffer}. This method works the same way as {@code
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringWriter.write(csq.toString())}. If {@code csq} is {@code null}, then
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the string "null" is written to the target stream.
2043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param csq
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character sequence appended to the target.
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this writer.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringWriter append(CharSequence csq) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (null == csq) {
2123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            write(TOKEN_NULL);
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
2143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            write(csq.toString());
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends a subsequence of the character sequence {@code csq} to this
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * writer's {@code StringBuffer}. This method works the same way as {@code
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * StringWriter.writer(csq.subsequence(start, end).toString())}. If {@code
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * csq} is {@code null}, then the specified subsequence of the string "null"
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * will be written to the target.
2253819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param csq
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character sequence appended to the target.
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the first char in the character sequence appended
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            to the target.
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the character following the last character of the
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            subsequence appended to the target.
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this writer.
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IndexOutOfBoundsException
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code start > end}, {@code start < 0}, {@code end < 0} or
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             either {@code start} or {@code end} are greater or equal than
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             the length of {@code csq}.
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StringWriter append(CharSequence csq, int start, int end) {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (null == csq) {
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            csq = TOKEN_NULL;
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String output = csq.subSequence(start, end).toString();
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        write(output, 0, output.length());
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
250