Programm gesucht: Lines of Code zählen



  • Hallo,

    der Betreff sagt es schon, ich suche ein Programm für Windows, mit dem ich LOCs zählen kann. Hab zwar gegoogled, aber nur Mist gefunden. Oder Shareware, mit der ich nur 10 Files zählen kann und ähnliches. Kennt jemand ein halbwegs vernünftiges Tool?

    MfG Jester

    P.S.: Ich will nicht über Software-Metriken diskutieren, sondern einfach nur die LOCs zählen.



  • Tjoa bei mir macht das immer glecih der compiler mit. Was für einen Compiler benutzt du denn?
    Ansonsten fürd ich einfach die semikolons im code zählen lassen, dass kommt schon so überschlagsmäßig hin







  • @mwoidt: den BCB4, der scheint das nicht zu können.

    @net: Danke, genau sowas hatte ich gesucht.

    @KdeE_: Ebenfalls danke, das hatte ich schon gefunden... aber keinen Bock auf CygWin.

    MfG Jester



  • habe gestern abend erst mir CCCC angeguckt, dass zeigt dir auch noch einiges mehr and und unterstützt C, C++, ADA und Java.



  • kingruedi schrieb:

    ...unterstützt....ADA.....

    dieses ada scheint ja immer mehr in mode zu kommen in letzter zeit



  • Weis ja nicht ob da gerade Ironie drin war, aber ADA kommt sicher nicht mehr in Mode, die Sprache ist uralt 🙂

    MfG SideWinder



  • jo, würde eher sagen ADA war wieder ziemlich schnell aus der Mode 😉 Ist eher bei Leuten mit Interesse an coolen/alten Sprachen interessant und Leute die alte Militär (oder Steuerungs) Software pflegen müssen 🙂



  • Zum zählen von Microsoft Visual Studio Projekte gibt es den Code Counter bei sourgeforge.net



  • 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
    

Anmelden zum Antworten