annotate trunk/src/cmd/Statistics.d @ 401:fcdf7ac5ad27

Improved statistics generation. Now multiple files can be passed to the stats/statistics command. Whitespace characters are counted correctly as well.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 22 Sep 2007 19:49:54 +0200
parents 33b566df6af4
children ea8c7459f1c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
1 /++
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
2 Author: Aziz Köksal
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
3 License: GPL3
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
4 +/
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
5 module cmd.Statistics;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
6 import dil.Token;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
7 import dil.File;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
8 import dil.Lexer;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 364
diff changeset
9 import common;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
10
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
11 struct Statistics
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
12 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
13 uint whitespaceCount;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
14 uint wsTokenCount;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
15 uint keywordCount;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
16 uint identCount;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
17 uint numberCount;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
18 uint commentCount;
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
19 uint linesOfCode;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
20
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
21 void opAddAssign(Statistics s)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
22 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
23 this.whitespaceCount += s.whitespaceCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
24 this.wsTokenCount += s.wsTokenCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
25 this.keywordCount += s.keywordCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
26 this.identCount += s.identCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
27 this.numberCount += s.numberCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
28 this.commentCount += s.commentCount;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
29 this.linesOfCode += s.linesOfCode;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
30 }
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
31 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
32
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
33 void execute(string[] filePaths)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
34 {
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
35 Statistics[] stats;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
36 foreach (filePath; filePaths)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
37 stats ~= getStatistics(filePath);
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
38
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
39 Statistics total;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
40
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
41 foreach (i, ref stat; stats)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
42 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
43 total += stat;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
44 Stdout.formatln(
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
45 "----\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
46 "File: {0}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
47 "Whitespace character count: {1}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
48 "Whitespace token count: {2}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
49 "Keyword count: {3}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
50 "Identifier count: {4}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
51 "Number count: {5}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
52 "Comment count: {6}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
53 "Lines of code: {7}",
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
54 filePaths[i],
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
55 stat.whitespaceCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
56 stat.wsTokenCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
57 stat.keywordCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
58 stat.identCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
59 stat.numberCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
60 stat.commentCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
61 stat.linesOfCode
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
62 );
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
63 }
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
64
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
65 if (filePaths.length > 1)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
66 Stdout.formatln(
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
67 "--------------------------------------------------------------------------------\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
68 "Total:\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
69 "Whitespace character count: {0}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
70 "Whitespace token count: {1}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
71 "Keyword count: {2}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
72 "Identifier count: {3}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
73 "Number count: {4}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
74 "Comment count: {5}\n"
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
75 "Lines of code: {6}",
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
76 total.whitespaceCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
77 total.wsTokenCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
78 total.keywordCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
79 total.identCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
80 total.numberCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
81 total.commentCount,
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
82 total.linesOfCode
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
83 );
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
84 }
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
85
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
86 Statistics getStatistics(string filePath)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
87 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
88 auto sourceText = loadFile(filePath);
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
89 auto lx = new Lexer(sourceText, filePath);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
90
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
91 auto token = lx.getTokens();
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
92
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
93 Statistics stats;
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
94
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
95 stats.linesOfCode = lx.loc;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
96 // Traverse linked list.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
97 while (token.type != TOK.EOF)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
98 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
99 token = token.next;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
100
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
101 // Count whitespace characters
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
102 if (token.ws !is null)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
103 stats.whitespaceCount += countWhitespaceCharacters(token.ws, token.start);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
104
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
105 switch (token.type)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
106 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
107 case TOK.Identifier:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
108 stats.identCount++;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
109 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
110 case TOK.Comment:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
111 stats.commentCount++;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
112 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
113 case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
114 TOK.Float32, TOK.Float64, TOK.Float80,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
115 TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
116 stats.numberCount++;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
117 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
118 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
119 if (token.isKeyword)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
120 stats.keywordCount++;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
121 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
122
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
123 if (token.isWhitespace)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
124 stats.wsTokenCount++;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
125 }
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
126 return stats;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
127 }
401
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
128
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
129 /// Counts newlines, \t, \v, \f and ' ' as whitespace characters.
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
130 uint countWhitespaceCharacters(char* p, char* end)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
131 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
132 uint count;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
133 Loop:
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
134 while (1)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
135 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
136 switch (*p)
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
137 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
138 case '\r':
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
139 if (p[1] == '\n')
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
140 ++p;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
141 case '\n':
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
142 ++p;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
143 ++count;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
144 break;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
145 case LS[0]:
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
146 if (p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2]))
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
147 {
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
148 p += 3;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
149 ++count;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
150 break;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
151 }
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
152 default:
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
153 if (!dil.Lexer.isspace(*p))
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
154 break Loop; // Exit loop.
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
155 ++p;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
156 ++count;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
157 }
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
158 }
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
159 assert(p is end);
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
160 return count;
fcdf7ac5ad27 Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
161 }