https://invisible-island.net/c_count/
c_count - C-language line counter
c_count [options] [file-specifications]
C_count counts lines and statements in C-language source files. It
provides related statistics on the amount of whitespace, comments and
code. C_count also shows the presence of unbalanced (or nested)
comments, unbalanced quotation marks and illegal characters.
C_count reads one or more C-language source files and displays simple
statistics about them. It counts statements (i.e., sequences of tokens
terminated with semicolon) and measures the relative amount of
commentary. C_count ignores semicolons where they appear in comments
or in quoted literals.
A count of semicolons is a reasonable way of counting C statements.
Note, however, that it does not count preprocessor definitions as C
statements.
The statistics summary shows you the relative amount of commentary.
This is the ratio of the alphanumeric characters in comments to the
total of characters in the code (ignoring tabs and other whitespace
which are not inside quotes). C_count only counts alphanumeric
characters, thus ignoring punctuation used as fillers. It also
suppresses RCS and DEC/CMS history comments from this ratio.
C_count counts the number of tokens (names and constants) in the source
files and gives this total, as well as their average length.
C_count provides you not only with measurements, but also diagnostics
in the form of a set of flags shown next to each file name:
" file contains an unbalanced quote (").
? file contains illegal characters (e.g., nonprinting,
nonwhitespace characters such as an escape). C_count also flags
tabs inside quotes. Depending on the context, these may
indicate a problem with the source code.
* file contains unterminated or nested comments. This usually
indicates a problem with the source code.
+ file contains unterminated curly-braces. This may be a problem
with the source code, or a limitation of c_count. For example,
the source may contain ifdef'd chunks with curly braces such as
#ifdef FOO
if (first_condition) {
#elif defined(BAR)
if (alternate_condition) {
#else
if (default_condition) {
#endif
If the closing curly brace is not ifdef'd to match, c_count will
report the mismatch as an unterminated block.
> file contains identifiers longer than specified by the -w
option.
Unbalanced quotes may be legal. When c_count was first created, the C
preprocessor permitted one to define symbols which contain an
unbalanced quote mark, for example:
#define WARN (void)printf("** warning:
...
WARN item
Rather than duplicate all of the complexity of the C preprocessor,
c_count permits you to specify symbols which contain unbalanced quote
marks.
Command line options of c_count are:
-b display block-level statistics. The total number of top-level
blocks (or statements), the maximum blocklevel, counting the top
as 1, and the weighted average blocklevel for code.
-c display character-level statistics.
-d show each token as c_count parses it from the input stream.
-i display identifier-level statistics.
-j annotate summary in technical format (i.e., "physical source
statements" and "logical source statements" for "lines" and
"statements" respectively).
-l display line-level statistics.
-n suppress summary statistics.
-o file
write the report to the specified file, rather than to the
standard output.
-p display statistics on a per-file basis.
-q define
define tokens which may evaluate with an unbalanced quote mark
'"'. For example,
-q WARN
tells c_count that the token "WARN" contains a quote mark.
-s display specialized statistics (e.g., code:comment ratio).
-t generate output in spreadsheet format (e.g., comma-separated
columns). If you set any of the options "-c", "-i", "-l" or
"-s", c_count generates these statistics. Otherwise it
generates only the lines/statements.
-V print the version number.
-v direct c_count not only to print a summary line for each file,
but also to print a running summary showing each source line,
together with the current line and statement numbers, as well as
the cumulative flags. Repeating the option causes c_count to
also show block (curly-brace) levels.
-w LEN specify the length for identifiers beyond which we should report
an error. If this option is not given, c_count reports
identifiers longer than 31 characters.
C_count reads one or more C language source files and writes its
statistics to standard output. If you do not give any file names,
c_count reads a list of file names from standard input.
The special filename "-" directs c_count to read the file itself from
the standard input.
Following is an example of the use of c_count, showing the detailed
types of information which it reports. The percentages add up to 100%,
since overlapping data are discounted.
~/src/count (5) c_count *.[ch] */*.[ch]
1165 418 |c_count.c
17 0 |config.h
1 0 |patchlev.h
103 3 |system.h
87 33 |porting/getopt.c
8 4 |porting/getopt.h
107 31 |porting/wildcard.c
5 0?" |testing/test1.c
6 2? |testing/test2.c
20 1 |testing/test3.c
----------------
1519 492?" total lines/statements
228 lines had comments 15.0 %
7 lines had history 0.5 %
45 comments are inline -3.0 %
142 lines were blank 9.3 %
170 lines for preprocessor 11.2 %
1017 lines containing code 67.0 %
1519 total lines 100.0 %
6355 comment-chars 18.1 %
105 history-chars 0.3 %
1277 nontext-comment-chars 3.6 %
7427 whitespace-chars 21.2 %
2882 preprocessor-chars 8.2 %
16984 statement-chars 48.5 %
35030 total characters 100.0 %
2698 tokens, average length 4.99
0.32 ratio of comment:code
3 ?:illegal characters found
2 ":lines with unterminated quotes
70 top-level blocks/statements
7 maximum blocklevel
2.67 ratio of blocklevel:code
If you use the "-p" option, c_count prints the detailed information for
each file, as well as for all files together.
C_count runs in a POSIX environment. Execute it on VAX/VMS by defining
it as a foreign command.
C_count is a single binary module, that uses no auxiliary files (e.g.,
C_COUNT.EXE on VAX/VMS).
Thomas Dickey.
wc (1) C-language line counter 2024-04-29 C_COUNT(1)