這是一個簡單的java腳本,它提供了我正在尋找的輸出。 通過自定義文件頂部的兩個REGEX,它可以用來生成其他模式出現的統計信息。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
public class MethodCallCount {
// This is the regex which is applied to each line to test if there is a method call on it.
private static String REGEX_METHODCALL = "(?:\\s*)([a-zA-Z0-9_]+)\\((.*)";
// Only looks in files with .c extention
private static String REGEX_FILEEXTS = ".*.c";
private static boolean VERBOSE_OUTPUT = false;
private static Map<String,Integer> patternMap = new HashMap<String,Integer>();
// Process all files and directories under dir
public static void visitAllDirsAndFiles(File dir) {
if(!dir.isDirectory()) {
if(dir.getName().matches(REGEX_FILEEXTS)) {
if(VERBOSE_OUTPUT) { System.out.println("Processing File: " + dir.getName()); }
processFile(dir);
}
}
else if(!dir.getName().equals(".svn")) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllDirsAndFiles(new File(dir, children[i]));
}
}
}
// Process only directories under dir
public static void visitAllDirs(File dir) {
if (dir.isDirectory()) {
processFile(dir);
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllDirs(new File(dir, children[i]));
}
}
}
// Process only files under dir
public static void visitAllFiles(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllFiles(new File(dir, children[i]));
}
} else {
processFile(dir);
}
}
public static void processMethod(String pMethod) {
if(VERBOSE_OUTPUT) { System.out.println("found: " + pMethod); }
if(patternMap.containsKey(pMethod)) {
Integer cnt = patternMap.get(pMethod);
cnt = cnt + 1;
patternMap.put(pMethod, cnt);
}
else {
patternMap.put(pMethod.toString(), 1);
}
}
public static void processLine(String pLine) {
Pattern methodMatcher = Pattern.compile(REGEX_METHODCALL);
java.util.regex.Matcher matcher = methodMatcher.matcher(pLine);
if(matcher.matches()) {
if(VERBOSE_OUTPUT) { System.out.println("processing " + matcher.group(1)); }
processMethod(matcher.group(1));
processLine(matcher.group(2));
}
}
public static void processFile(File pFile) {
BufferedReader fin;
try {
fin = new BufferedReader(new InputStreamReader(new FileInputStream(pFile)));
String l = null;
while((l=fin.readLine()) != null) {
processLine(l);
}
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args[0] is the directory to run this on. Otherwise current directory is used.
*/
public static void main(String[] args) {
String searchDirPath = System.getProperty("user.dir");
if(args.length > 0) {
searchDirPath = args[0];
}
else {
System.out.println("No argument specified... searching for *.map in: " + searchDirPath);
}
File searchDir = new File(searchDirPath);
visitAllDirsAndFiles(searchDir);
// Print Stats.
int callCnt = 0;
Set<String> patternSet = patternMap.keySet();
for(String p : patternSet) {
System.out.println(patternMap.get(p) + "\t" + p);
callCnt += patternMap.get(p);
}
System.out.println("Unique Methods: " + patternMap.size());
System.out.println("Calls Detected: " + callCnt);
System.out.println("Copy and paste output above into excel and then sort columns");
System.out.println("DONE.");
}
}
您使用的工具是什麼?許多會生成一個調用圖作爲輸出的一部分。 – Dingo 2009-05-21 11:16:58
我正在使用HiTech PICC-18 STD。你說得對,我可以得到一個通話圖。我想這使得它稍微容易一些,因爲現在我在一個文件中擁有所有的信息......但是我仍然會使用一個簡單的腳本來創建彙總表。 – blak3r 2009-05-21 22:03:04