Home | History | Annotate | Line # | Download | only in manual
      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