aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README27
-rw-r--r--loc.131
-rw-r--r--loc.c21
3 files changed, 44 insertions, 35 deletions
diff --git a/README b/README
index 24bc05c..5ac0881 100644
--- a/README
+++ b/README
@@ -2,25 +2,28 @@ NAME
loc - count number of lines of code
SYNOPSIS
- loc [file] ...
+ loc [-s] [file] ...
DESCRIPTION
loc counts the number of lines of code for each specified
file. loc will treat each file as a C source code or C header
- file. If file is -, the standard input is read.
-
- If no file is specified, the standard input is read, and
- the number of lines of code is output on the format
-
- "%zu\n", <#lines of code>
-
- If exactly one file is specified, its number of lines of
- code is output on the format
-
- "%zu\n", <#lines of code>
+ file. If file is -, or if a file is not specified, the
+ standard input is read.
If more than one file is specified, each successfully
line counted file will have its of lines of code output on
the format
"%s:%*s%zu\n", <file>, <some positive integer>, "", <#lines of code>
+
+ The total for all processed files, is printed on the last
+ line with the format
+
+ "%zu\n", <#total lines of code>
+
+ If exactly one or no files are specified, this will be the
+ only line output.
+
+OPTIONS
+ -s
+ Only output the last line. (The total over all files.)
diff --git a/loc.1 b/loc.1
index 8c87eeb..efbfd2e 100644
--- a/loc.1
+++ b/loc.1
@@ -13,30 +13,27 @@ will treat each file as a C source code or C header file. If
.I file
is
.BR - ,
-the standard input is read.
+or if a file is not specified, the standard input is read.
.PP
-If no
+If more than one
.I file
-is specified, the standard input is read, and the number
-of lines of code is output on the format
+is specified, each successfully line counted file will have
+its of lines of code output on the format
.nf
- \fB"%zu\n"\fP, <\fI#lines of code\fP>
+ \fB"%s:%*s%zu\n"\fP, <\fIfile\fP>, <\fIsome positive integer\fP>, \fB""\fP, <\fI#lines of code\fP>
.fi
.PP
-If exactly one
-.I file
-is specified, its number of lines of code is output on the format
+The total for all processed files, is printed on the last
+line with the format
.nf
- \fB"%zu\n"\fP, <\fI#lines of code\fP>
+ \fB"%zu\n"\fP, <\fI#total lines of code\fP>
.fi
.PP
-If more than one
-.I file
-is specified, each successfully line counted file will have
-its of lines of code output on the format
-.nf
-
- \fB"%s:%*s%zu\n"\fP, <\fIfile\fP>, <\fIsome positive integer\fP>, \fB""\fP, <\fI#lines of code\fP>
-.fi
+If exactly one or no files are specified, this will be the
+only line output.
+.SH OPTIONS
+.TP
+.B \-s
+Only output the last line. (The total over all files.)
diff --git a/loc.c b/loc.c
index 8c49152..dc47107 100644
--- a/loc.c
+++ b/loc.c
@@ -21,7 +21,7 @@ struct result {
static void
usage(void)
{
- fprintf(stderr, "usage: %s [file] ...\n", argv0);
+ fprintf(stderr, "usage: %s [-s] [file] ...\n", argv0);
exit(1);
}
@@ -140,11 +140,15 @@ zuwidth(size_t num)
int
main(int argc, char *argv[])
{
- ssize_t n;
+ ssize_t n, total = 0;
struct result *res;
int i, fd, maxleft = 0, maxright = 0, maxwidth, left, right, ret = 0;
+ int sum_only = 0;
ARGBEGIN {
+ case 's':
+ sum_only = 1;
+ break;
default:
usage();
} ARGEND;
@@ -181,12 +185,17 @@ main(int argc, char *argv[])
}
}
maxwidth = maxleft + maxright;
- for (i = 0; i < argc; i++)
- if (res[i].n < 0)
+ for (i = 0; i < argc; i++) {
+ if (res[i].n < 0) {
ret = 1;
- else
- printf("%s:%*s %zi\n", argv[i], maxwidth - res[i].width, "", res[i].n);
+ } else {
+ if (!sum_only)
+ printf("%s:%*s %zi\n", argv[i], maxwidth - res[i].width, "", res[i].n);
+ total += res[i].n;
+ }
+ }
free(res);
+ printf("%zi\n", total);
}
if (fflush(stdin) || ferror(stdin) || fclose(stdin))