summaryrefslogtreecommitdiff
path: root/examples/manual/wc.lex
diff options
context:
space:
mode:
Diffstat (limited to 'examples/manual/wc.lex')
-rw-r--r--examples/manual/wc.lex122
1 files changed, 122 insertions, 0 deletions
diff --git a/examples/manual/wc.lex b/examples/manual/wc.lex
new file mode 100644
index 0000000..7cae6a1
--- /dev/null
+++ b/examples/manual/wc.lex
@@ -0,0 +1,122 @@
+%{
+
+/*
+ * 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);
+}