* * * * *
99 ways to program a hex, Part 18: Lua, recursion, callback
Yesterday's version [1] checked the input to see if it was a file or a string
and acted accordingly. That's fine, but perhaps a better way is to include a
callback function and some opaque piece of datum for that callback to work
on. That way, we can operate on more than just strings or files. It's open
ended on what we can support.
> #!/usr/bin/env lua
> -- ***************************************************************
> --
> -- Copyright 2010 by Sean Conner. All Rights Reserved.
> --
> -- This program is free software: you can redistribute it and/or modify
> -- it under the terms of the GNU General Public License as published by
> -- the Free Software Foundation, either version 3 of the License, or
> -- (at your option) any later version.
> --
> -- This program is distributed in the hope that it will be useful,
> -- but WITHOUT ANY WARRANTY; without even the implied warranty of
> -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -- GNU General Public License for more details.
> --
> -- You should have received a copy of the GNU General Public License
> -- along with this program. If not, see <
http://www.gnu.org/licenses/>.
> --
> -- Comments, questions and criticisms can be sent to:
[email protected]
> --
> -- ********************************************************************
>
> -- Style: Lua 5.1, recursion, callback
>
> function do_dump(fpout,offset,callback,data)
> local line = callback(data,offset)
> if line == nil then return end
> fpout:write(
> string.format("%08X: ",offset),
> line:gsub(".",function(c) return string.format("%02X ",c:byte()) end),
> string.rep(" ",3 * (16 - line:len())),
> line:gsub("%c","."),
> "\n"
> )
> return do_dump(fpout,offset + 16,callback,data)
> end
>
> -- **********************************************************************
>
> local function cb(data,offset)
> return data:read(16)
> end
>
> if #arg == 0 then
> print("-----stdin-----")
> do_dump(io.stdout,0,cb,io.stdin)
> else
> for i = 1 , #arg do
> local f = io.open(arg[1],"r")
> io.stdout:write("-----",arg[1],"-----","\n")
> do_dump(io.stdout,0,cb,f)
> f:close()
> end
> end
>
> os.exit(0)
>
* Part 17: Lua, recursion, runtime type checking [2]
* Part 19: Lua, recursion, closure as callback [3]
[1]
gopher://gopher.conman.org/0Phlog:2012/01/25.1
[2]
gopher://gopher.conman.org/0Phlog:2012/01/25.1
[3]
gopher://gopher.conman.org/0Phlog:2012/01/27.1
Email author at
[email protected]