$ cat wc
#!/usr/local/bin/lua
local BUFSIZE = 2^13     -- 8K
    local f = io.input(arg[1])   -- open input file
    local cc, lc, wc = 0, 0, 0   -- char, line, and word counts
    while true do
      local lines, rest = f:read(BUFSIZE, "*line")
      if not lines then break end
      if rest then lines = lines .. rest .. '\n' end
      cc = cc + string.len(lines)
      -- count words in the chunk
      local _,t = string.gsub(lines, "%S+", "")
      wc = wc + t
      -- count newlines in the chunk
      _,t = string.gsub(lines, "\n", "\n")
      lc = lc + t
    end
    print(lc, wc, cc)

This works well. You can test it.

I will herewith explain the lines for you to get a better idea.

This example I lifted from the standard lua manual.

Let us look at first 6 lines:

local BUFSIZE = 2^13     -- 8K
    local f = io.input(arg[1])   -- open input file
    local cc, lc, wc = 0, 0, 0   -- char, line, and word counts
    while true do
      local lines, rest = f:read(BUFSIZE, "*line")
      if not lines then break end

First line stores the buffer size in the variable BUFSIZE.

In lua print(x) is same as =x. So let us check.

> =2^13
8192
>

So it is same as
local BUFSIZE = 8192

which we usually do using C as

#define BUFSIZE 8192 and we use
char buf[BUFSIZE];

"local" is an access specifier. We can omit it.

   local f = io.input(arg[1])   -- open input file

This line opens the file given in standard input(argv[1]) as the comment says.

    local cc, lc, wc = 0, 0, 0   -- char, line, and word counts
This line initializes the 3 areas of interest for us, char counts,
word counts and line counts.

Unlike C lua can assign multiple variables in the same line.

Next 3 lines,

while true do
      local lines, rest = f:read(BUFSIZE, "*line")
      if not lines then break end

start the while loop(infinite loop with a break condition within) and
   the other lines read the input file line by line storing the lines in
 the variable lines and the if condition is the termination condition
 for the while loop which is infinite.

We are done with first 6 lines.

Let us look at the rest of the code:

 if rest then lines = lines .. rest .. '\n' end
      cc = cc + string.len(lines)
      -- count words in the chunk
      local _,t = string.gsub(lines, "%S+", "")
      wc = wc + t
      -- count newlines in the chunk
      _,t = string.gsub(lines, "\n", "\n")
      lc = lc + t
    end
    print(lc, wc, cc)

The first line uses the lua concatenation operator ".." to concatenate
the lines with
 the "rest" variable which we used above. I really don't understand this line.

Let us look at the next line. I know this much that it is an if
condition in one line.

    cc = cc + string.len(lines)
      -- count words in the chunk

These two lines increment the character count. As string.len(foo)
returns the characters in foo string.

Since we initializes cc(character count to zero), this line gets us
the total char count in input file.

 local _,t = string.gsub(lines, "%S+", "")
      wc = wc + t

These two lines count the words by splitting the line into words using
the string library we saw two days ago.

-- count newlines in the chunk
      _,t = string.gsub(lines, "\n", "\n")
      lc = lc + t

This chunk counts the newlines by using the same gsub() method. Since
lines variable contains the whole
file, this will give us the total line count in lc.

end
    print(lc, wc, cc)

The end is for the while() infinite loop and print() prints our computed values.

-Girish

--
Gayatri Hitech
http://gayatri-hitech.com


-- 
Gayatri Hitech
http://gayatri-hitech.com
_______________________________________________
ILUGC Mailing List:
http://www.ae.iitm.ac.in/mailman/listinfo/ilugc

Reply via email to