001 /* Copyright 2000, 2001, Compaq Computer Corporation */ 002 003 package javafe; 004 005 import java.io.IOException; 006 import javafe.ast.*; 007 import javafe.genericfile.*; 008 import javafe.parser.Lex; 009 import javafe.parser.Parse; 010 import javafe.util.CorrelatedReader; 011 import javafe.util.ErrorSet; 012 import javafe.util.FileCorrelatedReader; 013 014 public class CountLines 015 { 016 //@ requires \nonnullelements(argv); 017 public static void main(String[] argv) throws IOException { 018 String spc = " "; 019 String[] indent = new String[spc.length()]; 020 //@ assume indent.length == 12; 021 for(int i = 0; i < indent.length; i++) 022 indent[i] = spc.substring(0, indent.length - i); 023 024 Lex l = new Lex(null, true); 025 Parse p = new Parse(); 026 long total = 0; 027 028 try { 029 for(int i = 0; i<argv.length; i++) { 030 CorrelatedReader in = 031 new FileCorrelatedReader(new NormalGenericFile(argv[1])); 032 l.restart(in); 033 int thisFile = count( p.parseCompilationUnit(l, false) ); 034 in.close(); 035 036 String tf = Integer.toString(thisFile); 037 System.out.println(indent[Math.min(indent.length-1, tf.length())] 038 + tf + " " + argv[i]); 039 total += thisFile; 040 } 041 } catch(IOException e) { 042 e.printStackTrace(); 043 ErrorSet.fatal(e.getMessage()); 044 } 045 String tf = Long.toString(total); 046 System.out.println(indent[Math.min(indent.length-1, tf.length())] 047 + tf + " total"); 048 } 049 050 public static int count(/*@ non_null @*/ ASTNode n) { 051 int result = 0; 052 if (n instanceof TypeDecl || n instanceof TypeDeclElem|| n instanceof Stmt) 053 result = 1; 054 else result = 0; 055 056 for(int i = 0; i < n.childCount(); i++) { 057 Object c = n.childAt(i); 058 if (c instanceof ASTNode) 059 result += count((ASTNode)c); 060 } 061 062 return result; 063 } 064 }