|
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 |
}
|