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