Alternative Get Opt

lua-users home
wiki

This is an alternative implementation of GetOpt in Lua. The goal of it is to conform to POSIX as much as possible while having no dependencies on external code.

-- getopt_alt.lua



-- getopt, POSIX style command line argument parser

-- param arg contains the command line arguments in a standard table.

-- param options is a string with the letters that expect string values.

-- returns a table where associated keys are true, nil, or a string value.

-- The following example styles are supported

--   -a one  ==> opts["a"]=="one"

--   -bone   ==> opts["b"]=="one"

--   -c      ==> opts["c"]==true

--   --c=one ==> opts["c"]=="one"

--   -cdaone ==> opts["c"]==true opts["d"]==true opts["a"]=="one"

-- note POSIX demands the parser ends at the first non option

--      this behavior isn't implemented.



function getopt( arg, options )

  local tab = {}

  for k, v in ipairs(arg) do

    if string.sub( v, 1, 2) == "--" then

      local x = string.find( v, "=", 1, true )

      if x then tab[ string.sub( v, 3, x-1 ) ] = string.sub( v, x+1 )

      else      tab[ string.sub( v, 3 ) ] = true

      end

    elseif string.sub( v, 1, 1 ) == "-" then

      local y = 2

      local l = string.len(v)

      local jopt

      while ( y <= l ) do

        jopt = string.sub( v, y, y )

        if string.find( options, jopt, 1, true ) then

          if y < l then

            tab[ jopt ] = string.sub( v, y+1 )

            y = l

          else

            tab[ jopt ] = arg[ k + 1 ]

          end

        else

          tab[ jopt ] = true

        end

        y = y + 1

      end

    end

  end

  return tab

end



-- Test code

opts = getopt( arg, "ab" )

for k, v in pairs(opts) do

  print( k, v )

end



-- EOF

See Also


RecentChanges · preferences
edit · history
Last edited December 11, 2009 11:39 pm GMT (diff)