%{ /* * 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); }