1 /** 2 * Copyright 2007 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.tonicsystems.jarjar; 18 19 import com.tonicsystems.jarjar.util.*; 20 import java.io.*; 21 import org.objectweb.asm.*; 22 23 class StringDumper 24 { StringDumper()25 public StringDumper() { 26 } 27 run(String classPath, PrintWriter pw)28 public void run(String classPath, PrintWriter pw) throws IOException { 29 StringReader stringReader = new DumpStringReader(pw); 30 ClassPathIterator cp = new ClassPathIterator(classPath); 31 try { 32 while (cp.hasNext()) { 33 ClassPathEntry entry = cp.next(); 34 InputStream in = entry.openStream(); 35 try { 36 new ClassReader(in).accept(stringReader, 0); 37 } catch (Exception e) { 38 System.err.println("Error reading " + entry.getName() + ": " + e.getMessage()); 39 } finally { 40 in.close(); 41 } 42 pw.flush(); 43 } 44 } catch (RuntimeIOException e) { 45 throw (IOException)e.getCause(); 46 } finally { 47 cp.close(); 48 } 49 } 50 51 private static class DumpStringReader extends StringReader 52 { 53 private final PrintWriter pw; 54 private String className; 55 DumpStringReader(PrintWriter pw)56 public DumpStringReader(PrintWriter pw) { 57 this.pw = pw; 58 } 59 visitString(String className, String value, int line)60 public void visitString(String className, String value, int line) { 61 if (value.length() > 0) { 62 if (!className.equals(this.className)) { 63 this.className = className; 64 pw.println(className.replace('/', '.')); 65 } 66 pw.print("\t"); 67 if (line >= 0) 68 pw.print(line + ": "); 69 pw.print(escapeStringLiteral(value)); 70 pw.println(); 71 } 72 } 73 }; 74 escapeStringLiteral(String value)75 private static String escapeStringLiteral(String value) { 76 StringBuilder sb = new StringBuilder(); 77 sb.append("\""); 78 char[] chars = value.toCharArray(); 79 for (int i = 0, size = chars.length; i < size; i++) { 80 char ch = chars[i]; 81 switch (ch) { 82 case '\n': sb.append("\\n"); break; 83 case '\r': sb.append("\\r"); break; 84 case '\b': sb.append("\\b"); break; 85 case '\f': sb.append("\\f"); break; 86 case '\t': sb.append("\\t"); break; 87 case '\"': sb.append("\\\""); break; 88 case '\\': sb.append("\\\\"); break; 89 default: 90 sb.append(ch); 91 } 92 } 93 sb.append("\""); 94 return sb.toString(); 95 } 96 } 97