/* * Copyright (c) 2009-2012 Panxiaobo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.googlecode.dex2jar.util; import com.googlecode.dex2jar.DexOpcodes; import com.googlecode.dex2jar.DexType; import com.googlecode.dex2jar.Field; import com.googlecode.dex2jar.Method; /** * @author <a href="mailto:pxb1988@gmail.com">Panxiaobo</a> * @version $Rev$ */ public class Escape implements DexOpcodes { static boolean contain(int a, int b) { return (a & b) != 0; } public static String classAcc(int acc) { if (acc == 0) { return "0"; } StringBuilder sb = new StringBuilder(); if (contain(acc, ACC_PUBLIC)) { sb.append("ACC_PUBLIC|"); } if (contain(acc, ACC_PRIVATE)) { sb.append("ACC_PRIVATE|"); } if (contain(acc, ACC_PROTECTED)) { sb.append("ACC_PROTECTED|"); } if (contain(acc, ACC_STATIC)) { sb.append("ACC_STATIC|"); } if (contain(acc, ACC_FINAL)) { sb.append("ACC_FINAL|"); } if (contain(acc, ACC_INTERFACE)) { sb.append("ACC_INTERFACE|"); } if (contain(acc, ACC_ABSTRACT)) { sb.append("ACC_ABSTRACT|"); } if (contain(acc, ACC_SYNTHETIC)) { sb.append("ACC_SYNTHETIC|"); } if (contain(acc, ACC_ANNOTATION)) { sb.append("ACC_ANNOTATION|"); } if (contain(acc, ACC_ENUM)) { sb.append("ACC_ENUM|"); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } public static String methodAcc(int acc) { if (acc == 0) { return "0"; } StringBuilder sb = new StringBuilder(); if (contain(acc, ACC_PUBLIC)) { sb.append("ACC_PUBLIC|"); } if (contain(acc, ACC_PRIVATE)) { sb.append("ACC_PRIVATE|"); } if (contain(acc, ACC_PROTECTED)) { sb.append("ACC_PROTECTED|"); } if (contain(acc, ACC_STATIC)) { sb.append("ACC_STATIC|"); } if (contain(acc, ACC_FINAL)) { sb.append("ACC_FINAL|"); } if (contain(acc, ACC_BRIDGE)) { sb.append("ACC_BRIDGE|"); } if (contain(acc, ACC_VARARGS)) { sb.append("ACC_VARARGS|"); } if (contain(acc, ACC_NATIVE)) { sb.append("ACC_NATIVE|"); } if (contain(acc, ACC_ABSTRACT)) { sb.append("ACC_ABSTRACT|"); } if (contain(acc, ACC_STRICT)) { sb.append("ACC_STRICT|"); } if (contain(acc, ACC_SYNTHETIC)) { sb.append("ACC_SYNTHETIC|"); } if (contain(acc, ACC_CONSTRUCTOR)) { sb.append("ACC_CONSTRUCTOR|"); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } public static String fieldAcc(int acc) { if (acc == 0) { return "0"; } StringBuilder sb = new StringBuilder(); if (contain(acc, ACC_PUBLIC)) { sb.append("ACC_PUBLIC|"); } if (contain(acc, ACC_PRIVATE)) { sb.append("ACC_PRIVATE|"); } if (contain(acc, ACC_PROTECTED)) { sb.append("ACC_PROTECTED|"); } if (contain(acc, ACC_STATIC)) { sb.append("ACC_STATIC|"); } if (contain(acc, ACC_FINAL)) { sb.append("ACC_FINAL|"); } if (contain(acc, ACC_VOLATILE)) { sb.append("ACC_VOLATILE|"); } if (contain(acc, ACC_TRANSIENT)) { sb.append("ACC_TRANSIENT|"); } if (contain(acc, ACC_SYNTHETIC)) { sb.append("ACC_SYNTHETIC|"); } if (contain(acc, ACC_ENUM)) { sb.append("ACC_ENUM|"); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } public static String v(Field f) { return String.format("new Field(%s,%s,%s)", v(f.getOwner()), v(f.getName()), v(f.getType())); } public static String v(Method m) { return String.format("new Method(%s,%s,%s,%s)", v(m.getOwner()), v(m.getName()), v(m.getParameterTypes()), v(m.getReturnType())); } public static String v(String s) { if (s == null) { return "null"; } return "\"" + Utf8Utils.escapeString(s) + "\""; } public static String v(DexType t) { return "new DexType(" + v(t.desc) + ")"; } public static String v(int[] vs) { StringBuilder sb = new StringBuilder("new int[]{ "); boolean first = true; for (int obj : vs) { if (first) { first = false; } else { sb.append(","); } sb.append(obj); } return sb.append("}").toString(); } public static String v(byte[] vs) { StringBuilder sb = new StringBuilder("new byte[]{ "); boolean first = true; for (byte obj : vs) { if (first) { first = false; } else { sb.append(","); } sb.append("(byte)").append(obj); } return sb.append("}").toString(); } public static String v(String[] vs) { if (vs == null) { return "null"; } StringBuilder sb = new StringBuilder("new String[]{ "); boolean first = true; for (String obj : vs) { if (first) { first = false; } else { sb.append(","); } sb.append(v(obj)); } return sb.append("}").toString(); } public static String v(Object[] vs) { StringBuilder sb = new StringBuilder("new Object[]{ "); boolean first = true; for (Object obj : vs) { if (first) { first = false; } else { sb.append(","); } sb.append(v(obj)); } return sb.append("}").toString(); } public static String v(Object obj) { if (obj == null) { return "null"; } if (obj instanceof String) { return v((String) obj); } if (obj instanceof DexType) { return v((DexType) obj); } if(obj instanceof Method){ return v((Method)obj); } if (obj instanceof Field) { return v((Field) obj); } if (obj instanceof Integer) { return " Integer.valueOf(" + obj + ")"; } if (obj instanceof Long) { return "Long.valueOf(" + obj + "L)"; } if (obj instanceof Float) { return "Float.valueOf(" + obj + "F)"; } if (obj instanceof Double) { return "Double.valueOf(" + obj + "D)"; } if (obj instanceof Short) { return "Short.valueOf((short)" + obj + ")"; } if (obj instanceof Byte) { return "Byte.valueOf((byte)" + obj + ")"; } if (obj instanceof Character) { return "Character.valueOf('" + obj + "')"; } if (obj instanceof Boolean) { return "Boolean.valueOf(" + obj + ")"; } return null; } }