home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gnuawk.zip / awklib / eg / lib / getopt.awk < prev    next >
Text File  |  1997-03-15  |  2KB  |  83 lines

  1. # getopt --- do C library getopt(3) function in awk
  2. #
  3. # arnold@gnu.ai.mit.edu
  4. # Public domain
  5. #
  6. # Initial version: March, 1991
  7. # Revised: May, 1993
  8.  
  9. # External variables:
  10. #    Optind -- index of ARGV for first non-option argument
  11. #    Optarg -- string value of argument to current option
  12. #    Opterr -- if non-zero, print our own diagnostic
  13. #    Optopt -- current option letter
  14.  
  15. # Returns
  16. #    -1     at end of options
  17. #    ?      for unrecognized option
  18. #    <c>    a character representing the current option
  19.  
  20. # Private Data
  21. #    _opti  index in multi-flag option, e.g., -abc
  22. function getopt(argc, argv, options,    optl, thisopt, i)
  23. {
  24.     optl = length(options)
  25.     if (optl == 0)        # no options given
  26.         return -1
  27.  
  28.     if (argv[Optind] == "--") {  # all done
  29.         Optind++
  30.         _opti = 0
  31.         return -1
  32.     } else if (argv[Optind] !~ /^-[^: \t\n\f\r\v\b]/) {
  33.         _opti = 0
  34.         return -1
  35.     }
  36.     if (_opti == 0)
  37.         _opti = 2
  38.     thisopt = substr(argv[Optind], _opti, 1)
  39.     Optopt = thisopt
  40.     i = index(options, thisopt)
  41.     if (i == 0) {
  42.         if (Opterr)
  43.             printf("%c -- invalid option\n",
  44.                                   thisopt) > "/dev/stderr"
  45.         if (_opti >= length(argv[Optind])) {
  46.             Optind++
  47.             _opti = 0
  48.         } else
  49.             _opti++
  50.         return "?"
  51.     }
  52.     if (substr(options, i + 1, 1) == ":") {
  53.         # get option argument
  54.         if (length(substr(argv[Optind], _opti + 1)) > 0)
  55.             Optarg = substr(argv[Optind], _opti + 1)
  56.         else
  57.             Optarg = argv[++Optind]
  58.         _opti = 0
  59.     } else
  60.         Optarg = ""
  61.     if (_opti == 0 || _opti >= length(argv[Optind])) {
  62.         Optind++
  63.         _opti = 0
  64.     } else
  65.         _opti++
  66.     return thisopt
  67. }
  68. BEGIN {
  69.     Opterr = 1    # default is to diagnose
  70.     Optind = 1    # skip ARGV[0]
  71.  
  72.     # test program
  73.     if (_getopt_test) {
  74.         while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
  75.             printf("c = <%c>, optarg = <%s>\n",
  76.                                        _go_c, Optarg)
  77.         printf("non-option arguments:\n")
  78.         for (; Optind < ARGC; Optind++)
  79.             printf("\tARGV[%d] = <%s>\n",
  80.                                     Optind, ARGV[Optind])
  81.     }
  82. }
  83.