From 119ddb08056d3ac73123f889bfd576766cdb6cc1 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sun, 14 Jun 2009 01:21:43 +0000 Subject: [PATCH] Added misc accessors, and a utility method to return an escaped string git-svn-id: https://smali.googlecode.com/svn/trunk@147 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../main/java/org/jf/dexlib/FieldIdItem.java | 4 ++ .../main/java/org/jf/dexlib/MethodIdItem.java | 4 ++ .../java/org/jf/dexlib/util/Utf8Utils.java | 54 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java b/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java index 80122d74..d466e76c 100644 --- a/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java @@ -95,4 +95,8 @@ public class FieldIdItem extends IndexedItem { public TypeIdItem getFieldType() { return fieldTypeReferenceField.getReference(); } + + public TypeIdItem getContainingClass() { + return classTypeReferenceField.getReference(); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java b/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java index 6b2be41a..dbf32bf5 100644 --- a/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java @@ -89,6 +89,10 @@ public class MethodIdItem extends IndexedItem { return prototypeReferenceField.getReference().getParameterRegisterCount() + (isStatic?0:1); } + public TypeIdItem getContainingClass() { + return classTypeReferenceField.getReference(); + } + /** * Return the number of parameters, not including the "this" parameter, if any * @return The number of parameters, not including the "this" parameter, if any diff --git a/dexlib/src/main/java/org/jf/dexlib/util/Utf8Utils.java b/dexlib/src/main/java/org/jf/dexlib/util/Utf8Utils.java index 8e4df613..f189be10 100644 --- a/dexlib/src/main/java/org/jf/dexlib/util/Utf8Utils.java +++ b/dexlib/src/main/java/org/jf/dexlib/util/Utf8Utils.java @@ -161,4 +161,58 @@ public final class Utf8Utils { throw new IllegalArgumentException("bad utf-8 byte " + Hex.u1(value) + " at offset " + Hex.u4(offset)); } + + public static String escapeString(String value) { + int len = value.length(); + StringBuilder sb = new StringBuilder(len * 3 / 2); + + for (int i = 0; i < len; i++) { + char c = value.charAt(i); + if ((c >= ' ') && (c < 0x7f)) { + if ((c == '\'') || (c == '\"') || (c == '\\')) { + sb.append('\\'); + } + sb.append(c); + } else if (c <= 0x7f) { + switch (c) { + case '\n': sb.append("\\n"); break; + case '\r': sb.append("\\r"); break; + case '\t': sb.append("\\t"); break; + default: { + /* + * Represent the character as an octal escape. + * If the next character is a valid octal + * digit, disambiguate by using the + * three-digit form. + */ + char nextChar = + (i < (len - 1)) ? value.charAt(i + 1) : 0; + boolean displayZero = + (nextChar >= '0') && (nextChar <= '7'); + sb.append('\\'); + for (int shift = 6; shift >= 0; shift -= 3) { + char outChar = (char) (((c >> shift) & 7) + '0'); + if ((outChar != '0') || displayZero) { + sb.append(outChar); + displayZero = true; + } + } + if (! displayZero) { + // Ironic edge case: The original value was 0. + sb.append('0'); + } + break; + } + } + } else { + sb.append("\\u"); + sb.append(Character.forDigit(c >> 12, 16)); + sb.append(Character.forDigit((c >> 8) & 0x0f, 16)); + sb.append(Character.forDigit((c >> 4) & 0x0f, 16)); + sb.append(Character.forDigit(c & 0x0f, 16)); + } + } + + return sb.toString(); + } }