Animation plugin works beautifully.
[potpourri.git] / ncsl.c
blob7b3d674ff0508c7b34e634fa76f03409ae36caca
1 /*% cc -o # %
2 * ncsl -- count non-comment source lines
3 * Deletes comments, white space and braces then counts non-empty lines.
4 * Flag -t causes { and } not to be ignored.
5 * Flag -b causes C++ comments //...\n to be ignored
6 */
7 #include <stdio.h>
8 int tflag; /* don't ignore Trivial lines */
9 int bflag; /* ignore Bjarne-style comments */
10 int getnc(FILE *f){ /* get non-comment */
11 int c;
13 for(;;){
14 c=getc(f);
15 if(c!='/') return c;
16 c=getc(f);
17 if(bflag && c=='/'){
18 do{
19 c=getc(f);
20 if(c==EOF) return EOF;
21 }while(c!='\n');
22 ungetc(c, f);
24 else{
25 if(c!='*'){
26 ungetc(c, f);
27 return '/';
29 for(;;){
30 do{
31 c=getc(f);
32 if(c==EOF) return EOF;
33 }while(c!='*');
34 c=getc(f);
35 if(c=='/') break;
36 ungetc(c, f);
41 int getnwnc(FILE *f){ /* get non-whitespace, non-comment */
42 int c;
45 c=getnc(f);
46 while(c==' ' || c=='\t' || (!tflag && (c=='{' || c=='}')));
47 return c;
49 int count(FILE *f){
50 int c, lastc, nline;
52 nline=0;
53 lastc=getnwnc(f);
54 while((c=getnwnc(f))!=EOF){
55 if(c=='\n' && lastc!='\n') nline++;
56 lastc=c;
58 return nline;
60 main(int argc, char *argv[]){
61 int total, i, n, error;
62 char *c;
63 FILE *f;
64 char *cmd;
66 error=0;
67 cmd=argv[0];
68 while(argc>1 && argv[1][0]=='-'){
69 for(c=argv[1]+1;*c;c++) switch(*c){
70 case 'b': bflag++; break;
71 case 't': tflag++; break;
72 default:
73 fprintf(stderr, "Usage: %s -[bt] [file ...]\n", cmd);
74 exit(1);
76 --argc;
77 argv++;
79 switch(argc){
80 case 1:
81 printf("%d\n", count(stdin));
82 break;
83 case 2:
84 f=fopen(argv[1], "r");
85 if(f==0){
86 perror(argv[1]);
87 error=1;
89 else{
90 printf("%d\n", count(f));
91 fclose(f);
93 break;
94 default:
95 total=0;
96 for(i=1;i!=argc;i++){
97 f=fopen(argv[i], "r");
98 if(f==0){
99 perror(argv[i]);
100 error=1;
102 else{
103 n=count(f);
104 fclose(f);
105 printf("%s: %d\n", argv[i], n);
106 total+=n;
109 printf("total %d\n", total);
110 break;
112 exit(error);