Blame examples/manual/wc.lex

Packit f00812
%{
Packit f00812
Packit f00812
/*
Packit f00812
 * wc.lex : A simple example of using FLEX
Packit f00812
 *          to create a wc-like utility.
Packit f00812
 *
Packit f00812
 *	    See MISC/fastwc/ in the flex distribution for examples
Packit f00812
 *	    of how to write this scanner for maximum performance.
Packit f00812
 */   
Packit f00812
Packit f00812
int  numchars = 0;
Packit f00812
int  numwords = 0;
Packit f00812
int  numlines = 0;
Packit f00812
int  totchars = 0;
Packit f00812
int  totwords = 0;
Packit f00812
int  totlines = 0;
Packit f00812
Packit f00812
/*
Packit f00812
 * rules start from here
Packit f00812
 */
Packit f00812
Packit f00812
%}
Packit f00812
Packit f00812
%%
Packit f00812
Packit f00812
[\n]        { numchars++;  numlines++;         }
Packit f00812
[\r]        { numchars++;                      }
Packit f00812
[^ \t\n]+   { numwords++;  numchars += yyleng; }
Packit f00812
.           { numchars++;                      }
Packit f00812
Packit f00812
%%
Packit f00812
Packit f00812
/*
Packit f00812
 * additional C code start from here. This supplies
Packit f00812
 * all the argument processing etc.
Packit f00812
 */
Packit f00812
Packit f00812
int main(int argc, char *argv[])
Packit f00812
{
Packit f00812
  int  loop,first=1;
Packit f00812
  int  lflag = 0; /* 1 if we count # of lines      */
Packit f00812
  int  wflag = 0; /* 1 if we count # of words      */
Packit f00812
  int  cflag = 0; /* 1 if we count # of characters */
Packit f00812
  int  fflag = 0; /* 1 if we have a file name      */
Packit f00812
Packit f00812
  for(loop=1; loop
Packit f00812
     if(argv[loop][0] == '-'){
Packit f00812
	switch(argv[loop][1]){
Packit f00812
	case 'l':
Packit f00812
	   lflag = 1;
Packit f00812
	   break;
Packit f00812
	case 'w':
Packit f00812
	   wflag = 1;
Packit f00812
	   break;
Packit f00812
	case 'c':
Packit f00812
	   cflag = 1;
Packit f00812
	   break;
Packit f00812
	default:
Packit f00812
	   fprintf(stderr,"unknown option -%c\n",
Packit f00812
                   argv[loop][1]);
Packit f00812
	}
Packit f00812
     }
Packit f00812
  }
Packit f00812
  if(lflag == 0 && wflag == 0 && cflag == 0){
Packit f00812
    lflag = wflag = cflag = 1; /* default to all on */
Packit f00812
  }
Packit f00812
Packit f00812
  for(loop=1; loop
Packit f00812
    if(argv[loop][0] != '-'){
Packit f00812
      fflag = 1;
Packit f00812
      numlines = numchars = numwords = 0;  
Packit f00812
      if((yyin = fopen(argv[loop],"rb")) != NULL){
Packit f00812
        if(first){
Packit f00812
          first = 0;
Packit f00812
	} else {
Packit f00812
          YY_NEW_FILE;
Packit f00812
	}
Packit f00812
        (void) yylex();
Packit f00812
        fclose(yyin);
Packit f00812
        totwords += numwords;
Packit f00812
        totchars += numchars;
Packit f00812
        totlines += numlines;
Packit f00812
        printf("file  : %25s :",argv[loop]) ;
Packit f00812
        if(lflag){
Packit f00812
          fprintf(stdout,"lines %5d ",numlines); 
Packit f00812
        }
Packit f00812
        if(cflag){
Packit f00812
          fprintf(stdout,"characters %5d ",numchars); 
Packit f00812
        }
Packit f00812
        if(wflag){
Packit f00812
          fprintf(stdout,"words %5d ",numwords); 
Packit f00812
        }
Packit f00812
        fprintf(stdout,"\n");
Packit f00812
      }else{
Packit f00812
        fprintf(stderr,"wc : file not found %s\n",argv[loop]);
Packit f00812
      } 
Packit f00812
    }
Packit f00812
  }
Packit f00812
  if(!fflag){
Packit f00812
    fprintf(stderr,"usage : wc [-l -w -c] file [file...]\n");
Packit f00812
    fprintf(stderr,"-l = count lines\n");
Packit f00812
    fprintf(stderr,"-c = count characters\n");
Packit f00812
    fprintf(stderr,"-w = count words\n");
Packit f00812
    exit(1);
Packit f00812
  }
Packit f00812
  for(loop=0;loop<79; loop++){
Packit f00812
    fprintf(stdout,"-");
Packit f00812
  }
Packit f00812
  fprintf(stdout,"\n");
Packit f00812
  fprintf(stdout,"total : %25s  ","") ;
Packit f00812
  if(lflag){
Packit f00812
    fprintf(stdout,"lines %5d ",totlines); 
Packit f00812
  }
Packit f00812
  if(cflag){
Packit f00812
    fprintf(stdout,"characters %5d ",totchars); 
Packit f00812
  }
Packit f00812
  if(wflag){
Packit f00812
     fprintf(stdout,"words %5d ",totwords); 
Packit f00812
  }
Packit f00812
  fprintf(stdout,"\n");
Packit f00812
  return(0);
Packit f00812
}