1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.util;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStream;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStreamWriter;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.StringWriter;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Writer;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class that takes a combined output destination and provides two
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * output writers, one of which ends up writing to the left column and
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one which goes on the right.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class TwoColumnOutput {
3199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} underlying writer for final output */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final Writer out;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code > 0;} the left column width */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final int leftWidth;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} pending left column output */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final StringBuffer leftBuf;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} pending right column output */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final StringBuffer rightBuf;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} left column writer */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final IndentingWriter leftColumn;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} right column writer */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final IndentingWriter rightColumn;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Turns the given two strings (with widths) and spacer into a formatted
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * two-column string.
52de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param s1 {@code non-null;} first string
5499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param width1 {@code > 0;} width of the first column
5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param spacer {@code non-null;} spacer string
5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param s2 {@code non-null;} second string
5799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param width2 {@code > 0;} width of the second column
5899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-formatted string
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String toString(String s1, int width1, String spacer,
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                  String s2, int width2) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len1 = s1.length();
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len2 = s2.length();
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringWriter sw = new StringWriter((len1 + len2) * 3);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TwoColumnOutput twoOut =
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new TwoColumnOutput(sw, width1, width2, spacer);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            twoOut.getLeft().write(s1);
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            twoOut.getRight().write(s2);
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException ex) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException("shouldn't happen", ex);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        twoOut.flush();
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sw.toString();
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
82de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param out {@code non-null;} writer to send final output to
8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param leftWidth {@code > 0;} width of the left column, in characters
8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param rightWidth {@code > 0;} width of the right column, in characters
8699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param spacer {@code non-null;} spacer string to sit between the two columns
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TwoColumnOutput(Writer out, int leftWidth, int rightWidth,
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                           String spacer) {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (out == null) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("out == null");
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (leftWidth < 1) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("leftWidth < 1");
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (rightWidth < 1) {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("rightWidth < 1");
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (spacer == null) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("spacer == null");
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringWriter leftWriter = new StringWriter(1000);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringWriter rightWriter = new StringWriter(1000);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.out = out;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.leftWidth = leftWidth;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.leftBuf = leftWriter.getBuffer();
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.rightBuf = rightWriter.getBuffer();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.leftColumn = new IndentingWriter(leftWriter, leftWidth);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.rightColumn =
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new IndentingWriter(rightWriter, rightWidth, spacer);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
120de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
12199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param out {@code non-null;} stream to send final output to
12299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param leftWidth {@code >= 1;} width of the left column, in characters
12399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param rightWidth {@code >= 1;} width of the right column, in characters
12499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param spacer {@code non-null;} spacer string to sit between the two columns
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TwoColumnOutput(OutputStream out, int leftWidth, int rightWidth,
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                           String spacer) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(new OutputStreamWriter(out), leftWidth, rightWidth, spacer);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the writer to use to write to the left column.
133de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
13499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the left column writer
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Writer getLeft() {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return leftColumn;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the writer to use to write to the right column.
142de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the right column writer
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Writer getRight() {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return rightColumn;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Flushes the output. If there are more lines of pending output in one
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * column, then the other column will get filled with blank lines.
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void flush() {
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            appendNewlineIfNecessary(leftBuf, leftColumn);
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            appendNewlineIfNecessary(rightBuf, rightColumn);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            outputFullLines();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            flushLeft();
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            flushRight();
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException ex) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException(ex);
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Outputs to the final destination as many full line pairs as
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * there are in the pending output, removing those lines from
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * their respective buffers. This method terminates when at
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * least one of the two column buffers is empty.
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void outputFullLines() throws IOException {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (;;) {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int leftLen = leftBuf.indexOf("\n");
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (leftLen < 0) {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int rightLen = rightBuf.indexOf("\n");
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (rightLen < 0) {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (leftLen != 0) {
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                out.write(leftBuf.substring(0, leftLen));
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (rightLen != 0) {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                writeSpaces(out, leftWidth - leftLen);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                out.write(rightBuf.substring(0, rightLen));
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.write('\n');
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            leftBuf.delete(0, leftLen + 1);
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rightBuf.delete(0, rightLen + 1);
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Flushes the left column buffer, printing it and clearing the buffer.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the buffer is already empty, this does nothing.
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void flushLeft() throws IOException {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        appendNewlineIfNecessary(leftBuf, leftColumn);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (leftBuf.length() != 0) {
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rightColumn.write('\n');
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            outputFullLines();
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Flushes the right column buffer, printing it and clearing the buffer.
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the buffer is already empty, this does nothing.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void flushRight() throws IOException {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        appendNewlineIfNecessary(rightBuf, rightColumn);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (rightBuf.length() != 0) {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            leftColumn.write('\n');
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            outputFullLines();
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends a newline to the given buffer via the given writer, but
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * only if it isn't empty and doesn't already end with one.
228de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
22999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param buf {@code non-null;} the buffer in question
23099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param out {@code non-null;} the writer to use
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static void appendNewlineIfNecessary(StringBuffer buf,
233de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro                                                 Writer out)
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IOException {
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = buf.length();
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((len != 0) && (buf.charAt(len - 1) != '\n')) {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.write('\n');
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes the given number of spaces to the given writer.
244de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
24599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param out {@code non-null;} where to write
24699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param amt {@code >= 0;} the number of spaces to write
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static void writeSpaces(Writer out, int amt) throws IOException {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (amt > 0) {
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.write(' ');
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            amt--;
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
255