183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com/* 2a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * Copyright (C) 2007 The Android Open Source Project 383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * 4a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * Licensed under the Apache License, Version 2.0 (the "License"); 5a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * you may not use this file except in compliance with the License. 6a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * You may obtain a copy of the License at 783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * 8a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * http://www.apache.org/licenses/LICENSE-2.0 9a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * 10a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * Unless required by applicable law or agreed to in writing, software 11a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * distributed under the License is distributed on an "AS IS" BASIS, 12a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * See the License for the specific language governing permissions and 14a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * limitations under the License. 1583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 1683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 17128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com/* 18128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com * As per the Apache license requirements, this file has been modified 19128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com * from its original state. 20128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com * 21128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com * Such modifications are Copyright (C) 2010 Ben Gruver, and are released 22128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com * under the original license 23128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com */ 24128e8279c3cf44cc1d1c8f263035ba8e4044d5c6JesusFreke@JesusFreke.com 2583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.compackage org.jf.dexlib.Util; 2683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 2783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.comimport java.io.FilterWriter; 2883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.comimport java.io.IOException; 2983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.comimport java.io.Writer; 3083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 3183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com/** 3283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * Writer that wraps another writer and passes width-limited and 3383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * optionally-prefixed output to its subordinate. When lines are 3483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * wrapped they are automatically indented based on the start of the 3583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * line. 3683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 3783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.compublic final class IndentingWriter extends FilterWriter { 3883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** null-ok; optional prefix for every line */ 3983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private final String prefix; 4083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 4183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** > 0; the maximum output width */ 4283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private final int width; 4383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 4483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** > 0; the maximum indent */ 4583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private final int maxIndent; 4683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 4783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** >= 0; current output column (zero-based) */ 4883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private int column; 4983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 5083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** whether indent spaces are currently being collected */ 5183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private boolean collectingIndent; 5283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 5383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** >= 0; current indent amount */ 5483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private int indent; 5583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 5683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** 5783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * Constructs an instance. 58a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * 5983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * @param out non-null; writer to send final output to 6083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * @param width >= 0; the maximum output width (not including 6183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * <code>prefix</code>), or <code>0</code> for no maximum 6283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * @param prefix non-null; the prefix for each line 6383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 6483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com public IndentingWriter(Writer out, int width, String prefix) { 6583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com super(out); 6683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 6783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (out == null) { 6883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com throw new NullPointerException("out == null"); 6983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 7083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 7183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (width < 0) { 7283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com throw new IllegalArgumentException("width < 0"); 7383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 7483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 7583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (prefix == null) { 7683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com throw new NullPointerException("prefix == null"); 7783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 7883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 7983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com this.width = (width != 0) ? width : Integer.MAX_VALUE; 8083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com this.maxIndent = width >> 1; 8183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com this.prefix = (prefix.length() == 0) ? null : prefix; 8283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 8383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com bol(); 8483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 8583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 8683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** 8783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * Constructs a no-prefix instance. 88a7139f6586c9bb8452e4c648ce582f8fbc626740JesusFreke@JesusFreke.com * 8983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * @param out non-null; writer to send final output to 9083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * @param width >= 0; the maximum output width (not including 9183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * <code>prefix</code>), or <code>0</code> for no maximum 9283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 9383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com public IndentingWriter(Writer out, int width) { 9483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com this(out, width, ""); 9583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 9683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 9783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** {@inheritDoc} */ 9883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com @Override 9983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com public void write(int c) throws IOException { 10083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com synchronized (lock) { 10183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (collectingIndent) { 10283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (c == ' ') { 10383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com indent++; 10483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (indent >= maxIndent) { 10583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com indent = maxIndent; 10683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com collectingIndent = false; 10783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 10883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } else { 10983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com collectingIndent = false; 11083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 11183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 11283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 11383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if ((column == width) && (c != '\n')) { 11483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com out.write('\n'); 11583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com column = 0; 11683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /* 11783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * Note: No else, so this should fall through to the next 11883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * if statement. 11983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 12083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 12183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 12283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (column == 0) { 12383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (prefix != null) { 12483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com out.write(prefix); 12583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 12683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 12783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (!collectingIndent) { 12883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com for (int i = 0; i < indent; i++) { 12983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com out.write(' '); 13083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 13183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com column = indent; 13283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 13383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 13483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 13583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com out.write(c); 13683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 13783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com if (c == '\n') { 13883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com bol(); 13983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } else { 14083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com column++; 14183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 14283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 14383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 14483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 14583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** {@inheritDoc} */ 14683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com @Override 14783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com public void write(char[] cbuf, int off, int len) throws IOException { 14883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com synchronized (lock) { 14983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com while (len > 0) { 15083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com write(cbuf[off]); 15183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com off++; 15283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com len--; 15383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 15483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 15583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 15683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 15783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** {@inheritDoc} */ 15883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com @Override 15983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com public void write(String str, int off, int len) throws IOException { 16083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com synchronized (lock) { 16183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com while (len > 0) { 16283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com write(str.charAt(off)); 16383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com off++; 16483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com len--; 16583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 16683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 16783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 16883b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com 16983b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com /** 17083b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com * Indicates that output is at the beginning of a line. 17183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com */ 17283b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com private void bol() { 17383b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com column = 0; 17483b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com collectingIndent = (maxIndent != 0); 17583b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com indent = 0; 17683b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com } 17783b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com} 178