def code(*t)
owner = t[0]
mod = t[1]
code = "\n"
flag = @flag
clump = owner.clump
i = 0
nocase = (Getopt::Declare::_nocase() || @nocase ? 'i' : '')
code << " catch(:paramout) do\n"
code += (!@repeatable) ? " while !_FOUND_['" + name() + "']" :
" while 1"
if (flag && (clump==1 && flag !~ /\A[^a-z0-9]+[a-z0-9]\Z/i ||
(clump<3 && @args )))
code << " && !_lastprefix"
end
code << '
begin
catch(:param) do
_pos = _nextpos if _args
_PUNCT_ = {}
'
if flag
code << '
_args && _pos = gindex( _args, /\G(?:\s|\0)*' +
Regexp::quote(flag) + '/' + nocase + ", _pos) or throw(:paramout)
unless @_errormsg
@_errormsg = %q|incorrect specification of '" + flag + "' parameter|
end
"
elsif ( ScalarArg::stdtype(@args[0]['type'])||'') !~ /\%F/
code << %q%\n throw(:paramout) if @_errormsg\n%
end
code << "\n _PARAM_ = '" + self.name() + "'\n"
trailer = []
i = argcount = @args.length()-1
while i > 0
trailer[i-1] = @args[i].trailer()
trailer[i-1] = trailer[i] unless trailer[i-1]
i -= 1
end
if @args
code << "\n"+' _args && _pos = gindex( _args, /\G'
0.upto( argcount ) { |i|
code << @args[i].ows(@args[i].matcher(trailer[i]))
}
code << '/x' + nocase + ", _pos ) or throw(:paramout)\n"
end
0.upto( argcount ) { |i|
code << @args[i].code(i,mod)
}
if flag
mutexlist = owner.mutex[flag] ?
( owner.mutex[flag].map {|i| "'#{i}'"} ).join(',') : ''
code << "
if _invalid.has_key?('#{flag}')
@_errormsg = %q|parameter '#{flag}' not allowed with parameter '| + _invalid['#{flag}'] + %q|'|
throw(:paramout)
else
for i in [#{mutexlist}]
_invalid[i] = '#{flag}'
end
end #if/then
"
end
for action in @actions
code << "\n " + action + "\n"
end
if (flag && @items==0)
code << "\n @cache['#{flag}'] = '#{flag}'\n"
end
if @items > 1
code << " @cache['#{self.name}'] = {} unless @cache['#{self.name}']\n"
end
for subarg in @args
code << subarg.cachecode(self.name(),@items)
end
if flag =~ /\A([^a-z0-9]+)/i
code << ' _lastprefix = "'+ Regexp::quote("#$1") + '"' + "\n"
else
code << " _lastprefix = nil\n"
end
code << "
_FOUND_['"+ self.name() + "'] = 1
throw :arg if _pos > 0
_nextpos = _args.length()
throw :alldone
end # catch(:param)
end # begin
end # while
end # catch(:paramout)
"
code
end