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