ArrayInitializerFormatter.java revision ca6acfdd6b3400ad6e29d45c29b0ec40ea92a968
12be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka/* 22be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project 32be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 42be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 52be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * you may not use this file except in compliance with the License. 62be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * You may obtain a copy of the License at 72be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 82be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 92be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 102be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 112be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 122be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * See the License for the specific language governing permissions and 142be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * limitations under the License. 152be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka */ 162be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 17ca6acfdd6b3400ad6e29d45c29b0ec40ea92a968Tadashi G. Takaokapackage com.android.inputmethod.keyboard.tools; 182be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 192be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.io.PrintStream; 202be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 212be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokapublic class ArrayInitializerFormatter { 222be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private final PrintStream mOut; 232be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private final int mMaxWidth; 242be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private final String mIndent; 252be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 262be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private int mCurrentIndex = 0; 272be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private String mFixedElement; 282be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private final StringBuilder mBuffer = new StringBuilder(); 292be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private int mBufferedLen; 302be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private int mBufferedIndex = Integer.MIN_VALUE; 312be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 322be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public ArrayInitializerFormatter(PrintStream out, int width, String indent) { 332be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mOut = out; 342be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mMaxWidth = width - indent.length(); 352be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mIndent = indent; 362be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 372be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 382be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public void flush() { 392be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (mBuffer.length() == 0) { 402be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return; 412be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 422be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final int lastIndex = mCurrentIndex - 1; 432be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (mBufferedIndex == lastIndex) { 442be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mOut.format("%s/* %d */ %s\n", mIndent, mBufferedIndex, mBuffer); 452be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } else if (mBufferedIndex == lastIndex - 1) { 462be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String[] elements = mBuffer.toString().split(" "); 472be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mOut.format("%s/* %d */ %s\n" 482be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka + "%s/* %d */ %s\n", 492be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mIndent, mBufferedIndex, elements[0], 502be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mIndent, lastIndex, elements[1]); 512be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } else { 522be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mOut.format("%s/* %d~ */\n" 532be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka + "%s%s\n" 542be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka + "%s/* ~%d */\n", mIndent, mBufferedIndex, 552be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mIndent, mBuffer, 562be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mIndent, lastIndex); 572be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 582be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.setLength(0); 592be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBufferedLen = 0; 602be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 612be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 622be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public void outCommentLines(String lines) { 632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka flush(); 642be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mOut.print(lines); 652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mFixedElement = null; 662be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 672be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 682be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public void outElement(String element) { 692be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (!element.equals(mFixedElement)) { 702be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka flush(); 712be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBufferedIndex = mCurrentIndex; 722be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 732be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final int nextLen = mBufferedLen + " ".length() + element.length(); 742be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (mBufferedLen != 0 && nextLen < mMaxWidth) { 752be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.append(' '); 762be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.append(element); 772be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBufferedLen = nextLen; 782be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } else { 792be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (mBufferedLen != 0) { 802be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.append('\n'); 812be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.append(mIndent); 822be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 832be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBuffer.append(element); 842be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mBufferedLen = element.length(); 852be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 862be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mCurrentIndex++; 872be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka mFixedElement = element; 882be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 892be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka} 90