G
Jester schrieb:
Hallo,
der Betreff sagt es schon, ich suche ein Programm für Windows, mit dem ich LOCs zählen kann.
Was verstehst du denn genau unter einer LOC? Ist folgendes eine LOC?
}
Für Java habe ich mir vor einiger Zeit mal ein sehr simples Progrämmchen in der Art geschrieben:
import java.io.*;
import java.util.*;
public class MetricsViewer
{
private static long sizeClassFiles = 0;
private static long sizeJavaFiles = 0;
private static int javaFiles = 0;
private static int classFiles = 0;
private static int emptyLines = 0;
private static int commentLines = 0;
private static int codeLines = 0;
private static int semicolons = 0;
private static int annotationCount = 0;
private static HashMap<String,Integer> keyWordMap = new HashMap<String,Integer>();
static
{
keyWordMap.put("for",0);
keyWordMap.put("if",0);
keyWordMap.put("else",0);
keyWordMap.put("while",0);
keyWordMap.put("switch",0);
keyWordMap.put("case",0);
keyWordMap.put("try",0);
keyWordMap.put("catch",0);
keyWordMap.put("finally",0);
keyWordMap.put("enum",0);
keyWordMap.put("class",0);
keyWordMap.put("interface",0);
keyWordMap.put("static",0);
keyWordMap.put("final",0);
keyWordMap.put("assert",0);
keyWordMap.put("throw",0);
keyWordMap.put("throws",0);
keyWordMap.put("return",0);
keyWordMap.put("public",0);
keyWordMap.put("private",0);
keyWordMap.put("protected",0);
keyWordMap.put("continue",0);
keyWordMap.put("break",0);
}
public static void main (final String [] args)
{
for (final String s : args)
{
searchFile (new File (s));
}
System.out.println();
System.out.println("number of Java-Files : " + javaFiles);
System.out.println("number of Class-Files : " + classFiles);
System.out.println("size of Java-Files : " + sizeJavaFiles);
System.out.println("size of Class-Files : " + sizeClassFiles);
System.out.println();
System.out.println("empty lines : " + emptyLines);
System.out.println("comment lines : " + commentLines);
System.out.println("code lines : " + codeLines);
System.out.println("all lines : " + (emptyLines+commentLines+codeLines));
System.out.println();
System.out.println("; : " + semicolons);
System.out.println("@ : " + annotationCount);
System.out.println();
printKeyWordMap();
}
public static void searchFile (final File file)
{
if (file.isDirectory())
{
for (final File f : file.listFiles())
{
searchFile (f);
}
}
else
{
final String path = file.getPath();
try
{
if (path.endsWith(".java")) searchJavaFile (file);
if (path.endsWith(".class")) searchClassFile (file);
}
catch (IOException e)
{
}
}
}
public static void searchJavaFile(final File file) throws IOException
{
System.out.println (file);
sizeJavaFiles += file.length();
++javaFiles;
final BufferedReader reader = new BufferedReader (new FileReader (file));
boolean comment = false;
while (reader.ready())
{
final String line = reader.readLine();
// EMPTY LINES
final String trimLine = line.trim();
if (trimLine.equals(""))
{
++emptyLines;
continue;
}
// COMMENT LINES
if (trimLine.startsWith("//"))
{
++commentLines;
continue;
}
if (trimLine.startsWith("/*"))
{
comment = true;
}
if (comment)
{
++commentLines;
if (trimLine.endsWith("*/"))
{
comment = false;
}
continue;
}
//CODE LINES
++codeLines;
final char [] chars = line.toCharArray();
for (final char c : chars)
{
if (c == ';') ++semicolons;
if (c == '@') ++annotationCount;
}
final String [] tokens = line.split("[\\(\\)\n\r\t ;,\\.\\{\\}@]");
for (final String token : tokens)
{
Integer number = keyWordMap.get(token);
if (number != null)
{
keyWordMap.put(token,++number);
}
}
}
}
public static void searchClassFile(final File file)
{
System.out.println (file);
sizeClassFiles += file.length();
++classFiles;
}
public static void printKeyWordMap()
{
int offset = 0;
for (String keyWord : keyWordMap.keySet())
{
int number = keyWordMap.get(keyWord);
String outString = keyWord + " : " + number;
if (offset == 0)
{
offset = outString.length();
System.out.print(outString);
}
else if (offset < 25)
{
StringBuilder builder = new StringBuilder (30);
for (;offset < 25 ; ++offset)
{
builder.append(" ");
}
System.out.print(builder.toString());
System.out.print(outString);
offset += outString.length();
}
else
{
StringBuilder builder = new StringBuilder (30);
for (;offset < 50 ; ++offset)
{
builder.append(" ");
}
System.out.print(builder.toString());
System.out.println(outString);
offset = 0;
}
}
System.out.println();
}
}
Beispiel-Output:
[...]
number of Java-Files : 51
number of Class-Files : 67
size of Java-Files : 87962
size of Class-Files : 94723
empty lines : 329
comment lines : 46
code lines : 2606
all lines : 2981
; : 1170
@ : 75
continue : 12 throw : 47 catch : 23
case : 0 class : 58 while : 10
final : 523 enum : 1 public : 286
finally : 0 throws : 3 else : 12
interface : 10 return : 254 if : 173
break : 1 protected : 25 private : 99
try : 18 switch : 0 assert : 82
for : 46 static : 57