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