Click here to Skip to main content
Licence 
First Posted 4 Aug 2001
Views 113,043
Downloads 1,517
Bookmarked 31 times

Counting Lines in a MS VC++ 6.0 project

By _declspec | 4 Aug 2001
A program that counts the lines (source, comments, blank) in every file included in a MS VC++ 6.0 project
1 vote, 6.7%
1

2
2 votes, 13.3%
3
4 votes, 26.7%
4
8 votes, 53.3%
5
4.33/5 - 26 votes
1 removed
μ 4.08, σa 2.01 [?]

Sample Image - LineCounter.gif

Introduction

Ever wondered how many lines a project you have worked on for a month (or maybe for a year!)? Well, we did this for you :)

This program (LineCounter) was developed with one purpose only: to count your lines!

The program is able to count source code, comments (both styles: "// comment" and "/* comment */"), and blank lines. It shows the results in a couple of editboxes, and has a preview window (right click on the list).

The program opens the project file (.dsp) and throws it through the parsing code. After parsing is done the list of project files is steped-by-step and lines are counted.

That's it! The source code is pretty self explanatory, so I guess you'll manage.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

_declspec



United States United States

Member


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 3 Pinmemberjyl_hrb22:41 17 Apr '11  
Questionhow to use the code counter in perl? Pinmembermoaweah naser21:27 17 Jul '07  
AnswerRe: how to use the code counter in perl? PinmemberAS-codeproject13:09 14 Aug '07  
GeneralSome Modifications I would suggest PinmemberRay Steel14:44 13 Oct '04  
void CLineCounterDlg::OnFileCount()
{
...
// Handle non asolute paths a little better
char dev = 0;
if (*(dir+1) == ':')
dev = *dir;
while (item)
{
filename = new char[dir_size + strlen(item->filename) + 1];
if (*item->filename == '\\' && dev)
sprintf(filename, "%c:%s", dev, item->filename);
else if (*(item->filename+1) == ':')
strcpy(filename, item->filename);
else
sprintf(filename, "%s%s", dir, item->filename);
ProcessFile(filename, item);
**********************************************
_counter_data count(const char* _filedata_, unsigned int _datalen_)
{
...
// put all the count logic into 'isgoodline' bool _recall_ = false,
_ignore_cmnt_ = false;
 
do
{
_this_line = NULL;
_this_line = findline(_file_data + _last_, _size_);
if (_this_line)
{
char *_token_line = new char[_size_ + 1];
unsigned long _token_size = tokenize(_file_data + _last_, _size_, _token_line);
_last_+=_size_ + 2; // "\r\n"
if (!_token_line || _token_size <= 0)
{
data._blank_++;
delete [] _token_line;
continue;
}
 
isgoodline(data, _token_line, _token_size, _recall_, _ignore_cmnt_);
delete [] _token_line;
}
} while(_this_line);
 
*************************************************
 
void isgoodline(_counter_data &data, char *_token_line, unsigned long _token_size, bool &_recall_, bool &_ignore_cmnt_)
{
bool _save_recall_ = _recall_;
bool ret = false;
int _line_sz = _token_size;

char *_start_ = NULL;
char *_end_ = NULL;
char *_eol = _token_line + _token_size,
_eol_char;

if (!_token_line)
return;
 
// null terminate the line
_eol_char = *_eol;
*_eol = 0;
if (!_recall_)
{
_ignore_cmnt_ = false;
_start_ = strstr(_token_line, "//");
 
if (_start_)
{
if (strncmp(_token_line, "//", 2))
{
// comment not at beginning of line
if (strlen(_start_) == 2)
{
// empty comment
data._lines_++;
}
else
{
data._lines_++; // code before the comment
data._comnt_++;
}
}
else
{
// comment at beginning of line
if (strlen(_start_) == 2)
{
// empty comment
data._blank_++;
}
else
data._comnt_++;
}
}
else
{
_start_ = strstr(_token_line, "/*");
if (_start_)
{
_end_ = (char*) strstr(_start_+2, "*/");
if (_end_)
{
if (strncmp(_token_line, "/*", 2))
{
// comment not at beginning of line
data._lines_++; // code before the comment
if (strlen(_start_) != 4)
data._comnt_++; // not empty comment
}
else if (strlen(_start_) != 4)
data._comnt_++; // not empty comment
else
data._blank_++; // empty comment
}
else
{
_recall_ = true; // start of multiline comment
if (strlen(_start_) == 2)
data._blank_++;
else
data._comnt_++; // not empty comment
}
}
else
data._lines_++;
}
}
else
{
// look for CVS tag inside multiline comment
// and ignore all the comments after it (in this block)
if (!_ignore_cmnt_ && strstr(_token_line, "$Log$"))
_ignore_cmnt_ = true;
_end_ = (char*) strstr(_token_line, "*/");
if (_end_)
{
_recall_ = false;
if (strncmp(_token_line, "*/", 2))
{
// comment not at beginning of line
if (!_ignore_cmnt_)
data._comnt_++;
else
data._blank_++;
}
else
data._blank_++;
}
else if (!_ignore_cmnt_)
data._comnt_++;
else
data._blank_++;
}
*_eol = _eol_char;
}
**********************************************
 
Also the way the percentage of comments to total lines is kind of irrelevant. Its more useful to
measure % comments to # of source lines.
 
But this was real useful to me to get a quick handle on a project I work on and create a spreadsheet from the results.
 
Thanks
 
Ray
Generalthis is definitely a useful tool, and... PinmemberZhefu Zhang9:10 2 Dec '03  
GeneralRe: this is definitely a useful tool, and... PinsussAnonymous23:05 16 Sep '04  
Generalyour program is not counting lines correctly Pinmemberevilman10:33 1 Feb '03  
Questionwhy? PinmemberIvan Tsygoulyov0:24 25 Dec '02  
GeneralMmmmh... PinmemberRage5:45 26 Nov '02  
Questiondoes anyone really need this? Pinmemberkokie10:03 19 May '02  
AnswerRe: does anyone really need this? PinmemberDoug Kimzey10:27 20 May '02  
GeneralRe: does anyone really need this? PinmemberPerFnurt16:24 6 Feb '04  
AnswerRe: does anyone really need this? PinmemberAnonymous14:45 28 May '02  
AnswerRe: does anyone really need this? PinmemberNelno16:27 18 Dec '02  
GeneralRe: does anyone really need this? PinmemberDimitris Vassiliades9:40 19 Mar '03  
GeneralIt is not bad, Indeed it is much useful than that upstair guy whose article is 3- pt PinmemberZhefu Zhang12:11 11 Nov '03  
GeneralHmm, .dsw PinmemberRazvan Marcus4:19 12 Dec '01  
GeneralGood work PinmemberRejeesh.T.S0:09 9 Aug '01  
QuestionAnd those constructions? PinmemberAnonymous12:19 6 Aug '01  
GeneralTeacher caught me using Java... PinmemberStephen Kellett12:01 6 Aug '01  
GeneralRe: Teacher caught me using Java... Pinmemberck12:20 6 Aug '01  
GeneralRe: Teacher caught me using Java... PinmemberPaul Evans6:41 25 Mar '03  
QuestionIt's a dupe? PinmemberGeorge17:46 5 Aug '01  
AnswerRe: It's a dupe? Pinmember_declspec22:25 5 Aug '01  
GeneralRe: It's a dupe? PinmemberBrian V Shifrin13:06 6 Aug '01  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120210.1 | Last Updated 5 Aug 2001
Article Copyright 2001 by _declspec
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid