* * * * *

   99 ways to program a hex, Part 17: Lua, recursion, runtime type checking

Since Lua [1] is a dynamically typed language (“values have types, not
variables”) we can check the type of a variable at runtime and behave
accordingly. Before, we were restricted with just dumping a file, but we
could also dump strings (which in Lua can be pure binary data). So today's
version checks what type the input is; if it's a file, we read data from
there, otherwise if the input is a string, we pull the next blob of data out
of it.

Granted, we don't actually use that feature here, but we can more easily
reuse do_dump() elsewhere.

> #!/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, runtime type checking
>
> function do_dump(fpin,fpout,offset)
>   local line
>
>   if type(fpin) == 'string' then
>     if offset > string.len(fpin) then return end
>     line = fpin:sub(offset + 1,offset + 16)
>   else
>     line = fpin:read(16)
>     if line == nil then return end
>   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(fpin,fpout,offset + 16)
> end
>
> -- **********************************************************************
>
> if #arg == 0 then
>   print("-----stdin-----")
>   do_dump(io.stdin,io.stdout,0)
> else
>   for i = 1 , #arg do
>     local f = io.open(arg[1],"r")
>     io.stdout:write("-----",arg[1],"-----","\n")
>     do_dump(f,io.stdout,0)
>     f:close()
>   end
> end
>
> os.exit(0)
>

* Part 16: Lua, recursion [2]
* Part 18: Lua, recursion, callback [3]

[1] http://www.lua.org/
[2] gopher://gopher.conman.org/0Phlog:2012/01/24.1
[3] gopher://gopher.conman.org/0Phlog:2012/01/26.1

Email author at [email protected]