Version 2 of Better getopt

Updated 2015-09-01 02:35:45 by yinjianhong

<Problem>

  When I went to use tcl re-write some tools writed by bash+getopt(1), I found that
  +There is no satisfactory getopt in tcl:
    cmdline.tcl in tcllib is so weak. just support '-opt', but can not support '--opt'
    others like getopt(1) always need write options name three times:
      1) in Usage info
      2) in getopt argument list
      3) in parse code

      e.g.
        Usage() {
                echo "Usage: $prog [options] devname"
                echo "-a           desc of option a"
                echo "-b           desc of option b"
                echo "-c, --ccc    desc of option c"
        }
        _at=`getopt -o abc: \
                --long ccc \
                -n $prog -- "$@"`
        eval set -- "$_at"
        while true; do
                case "$1" in
                -a)             aflag=a; shift 1;;
                -b)             bflag=b; shift 1;;
                -c|--ccc)       cflag=$2; shift 2;;
                --) shift; break;;
                esac
        done

<Solved>

  So I write a better tcl getopt that compat with GNU getopt_long_only(3), and easy to use.
  +https://github.com/tcler/getopt.tcl
  +https://github.com/tcler/getopt.tcl/blob/master/getOpt-1.0/example.tcl
  +you just need fill a options table.
    example:
        #!/bin/sh
        # The next line is executed by /bin/sh, but not tcl \
        exec tclsh "$0" ${1+"$@"}

        lappend auto_path /usr/local/lib
        package require getOpt 1.0
        namespace import ::getOpt::*

        # global var
        array set Opt {}
        array set InvalidOpt {}
        set NotOptions [list]
        set OptionList {
                {*0}        {Dummy {*Options:}}
                {*1}        {Dummy {  *Options kkk1:}}
                f        {arg y        help {#Specify a test list file}}
                listf        {arg y        help {#Same as -f}        link f}
                cc        {arg m        help {#Notify additional e-mail address on job completion}}
                {*2}        {Dummy {  *Options kkk2:}}
                kcov        {arg n        help {#insert kcov task for do the kernel test coverage check}}
                kdump        {arg o        help {#insert kdump task for get core dump file if panic happen}}
                {*3}        {Dummy {  *Options kkk3:}}
                debugi        {hide y}
                debugii        {hide y}
                h        {}
        }

        # _parse_ argument
        getOptions $OptionList $::argv Opt InvalidOpt NotOptions
          parray Opt
          parray InvalidOpt
          puts "NotOptions: $NotOptions"

        # getUsage test
        puts "Usage: $argv0 \[options\]"
          getUsage $OptionList