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