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