%{

/*
* wc.lex : A simple example of using FLEX
*          to create a wc-like utility.
*
*          See MISC/fastwc/ in the flex distribution for examples
*          of how to write this scanner for maximum performance.
*/

int  numchars = 0;
int  numwords = 0;
int  numlines = 0;
int  totchars = 0;
int  totwords = 0;
int  totlines = 0;

/*
* rules start from here
*/

%}

%%

[\n]        { numchars++;  numlines++;         }
[\r]        { numchars++;                      }
[^ \t\n]+   { numwords++;  numchars += yyleng; }
          { numchars++;                      }

%%

/*
* additional C code start from here. This supplies
* all the argument processing etc.
*/

int main(int argc, char *argv[])
{
 int  loop,first=1;
 int  lflag = 0; /* 1 if we count # of lines      */
 int  wflag = 0; /* 1 if we count # of words      */
 int  cflag = 0; /* 1 if we count # of characters */
 int  fflag = 0; /* 1 if we have a file name      */

 for(loop=1; loop<argc; loop++){
    if(argv[loop][0] == '-'){
       switch(argv[loop][1]){
       case 'l':
          lflag = 1;
          break;
       case 'w':
          wflag = 1;
          break;
       case 'c':
          cflag = 1;
          break;
       default:
          fprintf(stderr,"unknown option -%c\n",
                  argv[loop][1]);
       }
    }
 }
 if(lflag == 0 && wflag == 0 && cflag == 0){
   lflag = wflag = cflag = 1; /* default to all on */
 }

 for(loop=1; loop<argc; loop++){
   if(argv[loop][0] != '-'){
     fflag = 1;
     numlines = numchars = numwords = 0;
     if((yyin = fopen(argv[loop],"rb")) != NULL){
       if(first){
         first = 0;
       } else {
         YY_NEW_FILE;
       }
       (void) yylex();
       fclose(yyin);
       totwords += numwords;
       totchars += numchars;
       totlines += numlines;
       printf("file  : %25s :",argv[loop]) ;
       if(lflag){
         fprintf(stdout,"lines %5d ",numlines);
       }
       if(cflag){
         fprintf(stdout,"characters %5d ",numchars);
       }
       if(wflag){
         fprintf(stdout,"words %5d ",numwords);
       }
       fprintf(stdout,"\n");
     }else{
       fprintf(stderr,"wc : file not found %s\n",argv[loop]);
     }
   }
 }
 if(!fflag){
   fprintf(stderr,"usage : wc [-l -w -c] file [file...]\n");
   fprintf(stderr,"-l = count lines\n");
   fprintf(stderr,"-c = count characters\n");
   fprintf(stderr,"-w = count words\n");
   exit(1);
 }
 for(loop=0;loop<79; loop++){
   fprintf(stdout,"-");
 }
 fprintf(stdout,"\n");
 fprintf(stdout,"total : %25s  ","") ;
 if(lflag){
   fprintf(stdout,"lines %5d ",totlines);
 }
 if(cflag){
   fprintf(stdout,"characters %5d ",totchars);
 }
 if(wflag){
    fprintf(stdout,"words %5d ",totwords);
 }
 fprintf(stdout,"\n");
 return(0);
}