xref: /netbsd-src/external/bsd/flex/dist/examples/manual/wc.lex (revision 3c3a7b7603b4ed4cb76dd5c5a3e781ddca2349bb)
1*3c3a7b76Schristos %{
2*3c3a7b76Schristos 
3*3c3a7b76Schristos /*
4*3c3a7b76Schristos  * wc.lex : A simple example of using FLEX
5*3c3a7b76Schristos  *          to create a wc-like utility.
6*3c3a7b76Schristos  *
7*3c3a7b76Schristos  *	    See MISC/fastwc/ in the flex distribution for examples
8*3c3a7b76Schristos  *	    of how to write this scanner for maximum performance.
9*3c3a7b76Schristos  */
10*3c3a7b76Schristos 
11*3c3a7b76Schristos int  numchars = 0;
12*3c3a7b76Schristos int  numwords = 0;
13*3c3a7b76Schristos int  numlines = 0;
14*3c3a7b76Schristos int  totchars = 0;
15*3c3a7b76Schristos int  totwords = 0;
16*3c3a7b76Schristos int  totlines = 0;
17*3c3a7b76Schristos 
18*3c3a7b76Schristos /*
19*3c3a7b76Schristos  * rules start from here
20*3c3a7b76Schristos  */
21*3c3a7b76Schristos 
22*3c3a7b76Schristos %}
23*3c3a7b76Schristos 
24*3c3a7b76Schristos %%
25*3c3a7b76Schristos 
26*3c3a7b76Schristos [\n]        { numchars++;  numlines++;         }
27*3c3a7b76Schristos [\r]        { numchars++;                      }
28*3c3a7b76Schristos [^ \t\n]+   { numwords++;  numchars += yyleng; }
29*3c3a7b76Schristos .           { numchars++;                      }
30*3c3a7b76Schristos 
31*3c3a7b76Schristos %%
32*3c3a7b76Schristos 
33*3c3a7b76Schristos /*
34*3c3a7b76Schristos  * additional C code start from here. This supplies
35*3c3a7b76Schristos  * all the argument processing etc.
36*3c3a7b76Schristos  */
37*3c3a7b76Schristos 
38*3c3a7b76Schristos int main(int argc, char *argv[])
39*3c3a7b76Schristos {
40*3c3a7b76Schristos   int  loop,first=1;
41*3c3a7b76Schristos   int  lflag = 0; /* 1 if we count # of lines      */
42*3c3a7b76Schristos   int  wflag = 0; /* 1 if we count # of words      */
43*3c3a7b76Schristos   int  cflag = 0; /* 1 if we count # of characters */
44*3c3a7b76Schristos   int  fflag = 0; /* 1 if we have a file name      */
45*3c3a7b76Schristos 
46*3c3a7b76Schristos   for(loop=1; loop<argc; loop++){
47*3c3a7b76Schristos      if(argv[loop][0] == '-'){
48*3c3a7b76Schristos 	switch(argv[loop][1]){
49*3c3a7b76Schristos 	case 'l':
50*3c3a7b76Schristos 	   lflag = 1;
51*3c3a7b76Schristos 	   break;
52*3c3a7b76Schristos 	case 'w':
53*3c3a7b76Schristos 	   wflag = 1;
54*3c3a7b76Schristos 	   break;
55*3c3a7b76Schristos 	case 'c':
56*3c3a7b76Schristos 	   cflag = 1;
57*3c3a7b76Schristos 	   break;
58*3c3a7b76Schristos 	default:
59*3c3a7b76Schristos 	   fprintf(stderr,"unknown option -%c\n",
60*3c3a7b76Schristos                    argv[loop][1]);
61*3c3a7b76Schristos 	}
62*3c3a7b76Schristos      }
63*3c3a7b76Schristos   }
64*3c3a7b76Schristos   if(lflag == 0 && wflag == 0 && cflag == 0){
65*3c3a7b76Schristos     lflag = wflag = cflag = 1; /* default to all on */
66*3c3a7b76Schristos   }
67*3c3a7b76Schristos 
68*3c3a7b76Schristos   for(loop=1; loop<argc; loop++){
69*3c3a7b76Schristos     if(argv[loop][0] != '-'){
70*3c3a7b76Schristos       fflag = 1;
71*3c3a7b76Schristos       numlines = numchars = numwords = 0;
72*3c3a7b76Schristos       if((yyin = fopen(argv[loop],"rb")) != NULL){
73*3c3a7b76Schristos         if(first){
74*3c3a7b76Schristos           first = 0;
75*3c3a7b76Schristos 	} else {
76*3c3a7b76Schristos           YY_NEW_FILE;
77*3c3a7b76Schristos 	}
78*3c3a7b76Schristos         (void) yylex();
79*3c3a7b76Schristos         fclose(yyin);
80*3c3a7b76Schristos         totwords += numwords;
81*3c3a7b76Schristos         totchars += numchars;
82*3c3a7b76Schristos         totlines += numlines;
83*3c3a7b76Schristos         printf("file  : %25s :",argv[loop]) ;
84*3c3a7b76Schristos         if(lflag){
85*3c3a7b76Schristos           fprintf(stdout,"lines %5d ",numlines);
86*3c3a7b76Schristos         }
87*3c3a7b76Schristos         if(cflag){
88*3c3a7b76Schristos           fprintf(stdout,"characters %5d ",numchars);
89*3c3a7b76Schristos         }
90*3c3a7b76Schristos         if(wflag){
91*3c3a7b76Schristos           fprintf(stdout,"words %5d ",numwords);
92*3c3a7b76Schristos         }
93*3c3a7b76Schristos         fprintf(stdout,"\n");
94*3c3a7b76Schristos       }else{
95*3c3a7b76Schristos         fprintf(stderr,"wc : file not found %s\n",argv[loop]);
96*3c3a7b76Schristos       }
97*3c3a7b76Schristos     }
98*3c3a7b76Schristos   }
99*3c3a7b76Schristos   if(!fflag){
100*3c3a7b76Schristos     fprintf(stderr,"usage : wc [-l -w -c] file [file...]\n");
101*3c3a7b76Schristos     fprintf(stderr,"-l = count lines\n");
102*3c3a7b76Schristos     fprintf(stderr,"-c = count characters\n");
103*3c3a7b76Schristos     fprintf(stderr,"-w = count words\n");
104*3c3a7b76Schristos     exit(1);
105*3c3a7b76Schristos   }
106*3c3a7b76Schristos   for(loop=0;loop<79; loop++){
107*3c3a7b76Schristos     fprintf(stdout,"-");
108*3c3a7b76Schristos   }
109*3c3a7b76Schristos   fprintf(stdout,"\n");
110*3c3a7b76Schristos   fprintf(stdout,"total : %25s  ","") ;
111*3c3a7b76Schristos   if(lflag){
112*3c3a7b76Schristos     fprintf(stdout,"lines %5d ",totlines);
113*3c3a7b76Schristos   }
114*3c3a7b76Schristos   if(cflag){
115*3c3a7b76Schristos     fprintf(stdout,"characters %5d ",totchars);
116*3c3a7b76Schristos   }
117*3c3a7b76Schristos   if(wflag){
118*3c3a7b76Schristos      fprintf(stdout,"words %5d ",totwords);
119*3c3a7b76Schristos   }
120*3c3a7b76Schristos   fprintf(stdout,"\n");
121*3c3a7b76Schristos   return(0);
122*3c3a7b76Schristos }
123