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