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    }