Hex Artifact Content

Artifact 1f5b095f09c8645a58a89f632499eb658d358e8e:


0000: 23 20 63 6d 64 6c 69 6e 65 2e 74 63 6c 20 2d 2d  # cmdline.tcl --
0010: 0a 23 0a 23 09 54 68 69 73 20 70 61 63 6b 61 67  .#.#.This packag
0020: 65 20 70 72 6f 76 69 64 65 73 20 61 20 75 74 69  e provides a uti
0030: 6c 69 74 79 20 66 6f 72 20 70 61 72 73 69 6e 67  lity for parsing
0040: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 23 09   command line.#.
0050: 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
0060: 72 65 20 70 72 6f 63 65 73 73 65 64 20 62 79 20  re processed by 
0070: 6f 75 72 20 76 61 72 69 6f 75 73 20 61 70 70 6c  our various appl
0080: 69 63 61 74 69 6f 6e 73 2e 0a 23 09 49 74 20 61  ications..#.It a
0090: 6c 73 6f 20 69 6e 63 6c 75 64 65 73 20 61 20 75  lso includes a u
00a0: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 74  tility routine t
00b0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  o determine the.
00c0: 23 09 61 70 70 6c 69 63 61 74 69 6f 6e 20 6e 61  #.application na
00d0: 6d 65 20 66 6f 72 20 75 73 65 20 69 6e 20 63 6f  me for use in co
00e0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 65 72 72 6f 72  mmand line error
00f0: 73 2e 0a 23 0a 23 20 43 6f 70 79 72 69 67 68 74  s..#.# Copyright
0100: 20 28 63 29 20 31 39 39 38 2d 32 30 30 30 20 62   (c) 1998-2000 b
0110: 79 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 6f 6e  y Ajuba Solution
0120: 73 2e 0a 23 20 43 6f 70 79 72 69 67 68 74 20 28  s..# Copyright (
0130: 63 29 20 32 30 30 31 2d 32 30 31 35 20 62 79 20  c) 2001-2015 by 
0140: 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 20  Andreas Kupries 
0150: 3c 61 6e 64 72 65 61 73 5f 6b 75 70 72 69 65 73  <andreas_kupries
0160: 40 75 73 65 72 73 2e 73 66 2e 6e 65 74 3e 2e 0a  @users.sf.net>..
0170: 23 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  # Copyright (c) 
0180: 32 30 30 33 20 20 20 20 20 20 62 79 20 44 61 76  2003      by Dav
0190: 69 64 20 4e 2e 20 57 65 6c 74 6f 6e 20 20 3c 64  id N. Welton  <d
01a0: 61 76 69 64 77 40 64 65 64 61 73 79 73 2e 63 6f  avidw@dedasys.co
01b0: 6d 3e 0a 23 20 53 65 65 20 74 68 65 20 66 69 6c  m>.# See the fil
01c0: 65 20 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73  e "license.terms
01d0: 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  " for informatio
01e0: 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72  n on usage and r
01f0: 65 64 69 73 74 72 69 62 75 74 69 6f 6e 0a 23 20  edistribution.# 
0200: 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  of this file, an
0210: 64 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d  d for a DISCLAIM
0220: 45 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e  ER OF ALL WARRAN
0230: 54 49 45 53 2e 0a 23 20 0a 23 20 52 43 53 3a 20  TIES..# .# RCS: 
0240: 40 28 23 29 20 24 49 64 3a 20 63 6d 64 6c 69 6e  @(#) $Id: cmdlin
0250: 65 2e 74 63 6c 2c 76 20 31 2e 32 38 20 32 30 31  e.tcl,v 1.28 201
0260: 31 2f 30 32 2f 32 33 20 31 37 3a 34 31 3a 35 32  1/02/23 17:41:52
0270: 20 61 6e 64 72 65 61 73 5f 6b 75 70 72 69 65 73   andreas_kupries
0280: 20 45 78 70 20 24 0a 0a 70 61 63 6b 61 67 65 20   Exp $..package 
0290: 72 65 71 75 69 72 65 20 54 63 6c 20 38 2e 32 0a  require Tcl 8.2.
02a0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
02b0: 63 6d 64 6c 69 6e 65 20 31 2e 35 0a 0a 6e 61 6d  cmdline 1.5..nam
02c0: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 6d  espace eval ::cm
02d0: 64 6c 69 6e 65 20 7b 0a 20 20 20 20 6e 61 6d 65  dline {.    name
02e0: 73 70 61 63 65 20 65 78 70 6f 72 74 20 67 65 74  space export get
02f0: 41 72 67 76 30 20 67 65 74 6f 70 74 20 67 65 74  Argv0 getopt get
0300: 4b 6e 6f 77 6e 4f 70 74 20 67 65 74 66 69 6c 65  KnownOpt getfile
0310: 73 20 67 65 74 6f 70 74 69 6f 6e 73 20 5c 0a 09  s getoptions \..
0320: 20 20 20 20 67 65 74 4b 6e 6f 77 6e 4f 70 74 69      getKnownOpti
0330: 6f 6e 73 20 75 73 61 67 65 0a 7d 0a 0a 23 20 3a  ons usage.}..# :
0340: 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 6f 70 74  :cmdline::getopt
0350: 20 2d 2d 0a 23 0a 23 09 54 68 65 20 63 6d 64 6c   --.#.#.The cmdl
0360: 69 6e 65 3a 3a 67 65 74 6f 70 74 20 77 6f 72 6b  ine::getopt work
0370: 73 20 69 6e 20 61 20 66 61 73 68 69 6f 6e 20 6c  s in a fashion l
0380: 69 6b 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  ike the standard
0390: 0a 23 09 43 20 62 61 73 65 64 20 67 65 74 6f 70  .#.C based getop
03a0: 74 20 66 75 6e 63 74 69 6f 6e 2e 20 20 47 69 76  t function.  Giv
03b0: 65 6e 20 61 6e 20 6f 70 74 69 6f 6e 20 73 74 72  en an option str
03c0: 69 6e 67 20 61 6e 64 20 61 20 0a 23 09 70 6f 69  ing and a .#.poi
03d0: 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
03e0: 20 6f 72 20 61 72 67 73 20 74 68 69 73 20 63 6f   or args this co
03f0: 6d 6d 61 6e 64 20 77 69 6c 6c 20 70 72 6f 63 65  mmand will proce
0400: 73 73 20 74 68 65 0a 23 09 66 69 72 73 74 20 61  ss the.#.first a
0410: 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  rgument and retu
0420: 72 6e 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  rn info on how t
0430: 6f 20 70 72 6f 63 65 65 64 2e 0a 23 0a 23 20 41  o proceed..#.# A
0440: 72 67 75 6d 65 6e 74 73 3a 0a 23 09 61 72 67 76  rguments:.#.argv
0450: 56 61 72 09 09 4e 61 6d 65 20 6f 66 20 74 68 65  Var..Name of the
0460: 20 61 72 67 76 20 6c 69 73 74 20 74 68 61 74 20   argv list that 
0470: 79 6f 75 0a 23 09 09 09 77 61 6e 74 20 74 6f 20  you.#...want to 
0480: 70 72 6f 63 65 73 73 2e 20 20 49 66 20 6f 70 74  process.  If opt
0490: 69 6f 6e 73 20 61 72 65 20 66 6f 75 6e 64 20 74  ions are found t
04a0: 68 65 0a 23 09 09 09 61 72 67 20 6c 69 73 74 20  he.#...arg list 
04b0: 69 73 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  is modified and 
04c0: 74 68 65 20 70 72 6f 63 65 73 73 65 64 20 61 72  the processed ar
04d0: 67 75 6d 65 6e 74 73 0a 23 09 09 09 61 72 65 20  guments.#...are 
04e0: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
04f0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 69   start of the li
0500: 73 74 2e 0a 23 09 6f 70 74 73 74 72 69 6e 67 09  st..#.optstring.
0510: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 6e  A list of comman
0520: 64 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 74  d options that t
0530: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 23  he application.#
0540: 09 09 09 77 69 6c 6c 20 61 63 63 65 70 74 2e 20  ...will accept. 
0550: 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 65   If the option e
0560: 6e 64 73 20 69 6e 20 22 2e 61 72 67 22 20 74 68  nds in ".arg" th
0570: 65 0a 23 09 09 09 67 65 74 6f 70 74 20 72 6f 75  e.#...getopt rou
0580: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
0590: 65 20 6e 65 78 74 20 61 72 67 75 6d 65 6e 74 20  e next argument 
05a0: 61 73 20 0a 23 09 09 09 61 6e 20 61 72 67 75 6d  as .#...an argum
05b0: 65 6e 74 20 74 6f 20 74 68 65 20 6f 70 74 69 6f  ent to the optio
05c0: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  n.  Otherwise th
05d0: 65 20 6f 70 74 69 6f 6e 09 0a 23 09 09 09 69 73  e option..#...is
05e0: 20 61 20 62 6f 6f 6c 65 61 6e 20 74 68 61 74 20   a boolean that 
05f0: 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 70  is set to 1 if p
0600: 72 65 73 65 6e 74 2e 0a 23 09 6f 70 74 56 61 72  resent..#.optVar
0610: 09 09 54 68 65 20 76 61 72 69 61 62 6c 65 20 70  ..The variable p
0620: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 70 74  ointed to by opt
0630: 56 61 72 0a 23 09 09 09 63 6f 6e 74 61 69 6e 73  Var.#...contains
0640: 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 68 61 74   the option that
0650: 20 77 61 73 20 66 6f 75 6e 64 20 28 77 69 74 68   was found (with
0660: 6f 75 74 20 74 68 65 0a 23 09 09 09 6c 65 61 64  out the.#...lead
0670: 69 6e 67 20 27 2d 27 20 61 6e 64 20 77 69 74 68  ing '-' and with
0680: 6f 75 74 20 74 68 65 20 2e 61 72 67 20 65 78 74  out the .arg ext
0690: 65 6e 73 69 6f 6e 29 2e 0a 23 09 76 61 6c 56 61  ension)..#.valVa
06a0: 72 09 09 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  r..Upon success,
06b0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 70 6f   the variable po
06c0: 69 6e 74 65 64 20 74 6f 20 62 79 20 76 61 6c 56  inted to by valV
06d0: 61 72 0a 23 09 09 09 63 6f 6e 74 61 69 6e 73 20  ar.#...contains 
06e0: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
06f0: 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69  e specified opti
0700: 6f 6e 2e 0a 23 09 09 09 54 68 69 73 20 76 61 6c  on..#...This val
0710: 75 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  ue comes from th
0720: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66  e command line f
0730: 6f 72 20 2e 61 72 67 0a 23 09 09 09 6f 70 74 69  or .arg.#...opti
0740: 6f 6e 73 2c 20 6f 74 68 65 72 77 69 73 65 20 74  ons, otherwise t
0750: 68 65 20 76 61 6c 75 65 20 69 73 20 31 2e 0a 23  he value is 1..#
0760: 09 09 09 49 66 20 67 65 74 6f 70 74 20 66 61 69  ...If getopt fai
0770: 6c 73 2c 20 74 68 65 20 76 61 6c 56 61 72 20 69  ls, the valVar i
0780: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 61 6e  s filled with an
0790: 0a 23 09 09 09 65 72 72 6f 72 20 6d 65 73 73 61  .#...error messa
07a0: 67 65 2e 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a  ge..#.# Results:
07b0: 0a 23 20 09 54 68 65 20 67 65 74 6f 70 74 20 66  .# .The getopt f
07c0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
07d0: 31 20 69 66 20 61 6e 20 6f 70 74 69 6f 6e 20 77  1 if an option w
07e0: 61 73 20 66 6f 75 6e 64 2c 20 30 20 69 66 20 6e  as found, 0 if n
07f0: 6f 20 6d 6f 72 65 0a 23 20 09 6f 70 74 69 6f 6e  o more.# .option
0800: 73 20 77 65 72 65 20 66 6f 75 6e 64 2c 20 61 6e  s were found, an
0810: 64 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72  d -1 if an error
0820: 20 6f 63 63 75 72 72 65 64 2e 0a 0a 70 72 6f 63   occurred...proc
0830: 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 6f   ::cmdline::geto
0840: 70 74 20 7b 61 72 67 76 56 61 72 20 6f 70 74 73  pt {argvVar opts
0850: 74 72 69 6e 67 20 6f 70 74 56 61 72 20 76 61 6c  tring optVar val
0860: 56 61 72 7d 20 7b 0a 20 20 20 20 75 70 76 61 72  Var} {.    upvar
0870: 20 31 20 24 61 72 67 76 56 61 72 20 61 72 67 73   1 $argvVar args
0880: 4c 69 73 74 0a 20 20 20 20 75 70 76 61 72 20 31  List.    upvar 1
0890: 20 24 6f 70 74 56 61 72 20 6f 70 74 69 6f 6e 0a   $optVar option.
08a0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 6c      upvar 1 $val
08b0: 56 61 72 20 76 61 6c 75 65 0a 0a 20 20 20 20 73  Var value..    s
08c0: 65 74 20 72 65 73 75 6c 74 20 5b 67 65 74 4b 6e  et result [getKn
08d0: 6f 77 6e 4f 70 74 20 61 72 67 73 4c 69 73 74 20  ownOpt argsList 
08e0: 24 6f 70 74 73 74 72 69 6e 67 20 6f 70 74 69 6f  $optstring optio
08f0: 6e 20 76 61 6c 75 65 5d 0a 0a 20 20 20 20 69 66  n value]..    if
0900: 20 7b 24 72 65 73 75 6c 74 20 3c 20 30 7d 20 7b   {$result < 0} {
0910: 0a 20 20 20 20 20 20 20 20 23 20 43 6f 6c 6c 61  .        # Colla
0920: 70 73 65 20 75 6e 6b 6e 6f 77 6e 2d 6f 70 74 69  pse unknown-opti
0930: 6f 6e 20 65 72 72 6f 72 20 69 6e 74 6f 20 61 6e  on error into an
0940: 79 2d 6f 74 68 65 72 2d 65 72 72 6f 72 20 72 65  y-other-error re
0950: 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 73 65  sult..        se
0960: 74 20 72 65 73 75 6c 74 20 2d 31 0a 20 20 20 20  t result -1.    
0970: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65  }.    return $re
0980: 73 75 6c 74 0a 7d 0a 0a 23 20 3a 3a 63 6d 64 6c  sult.}..# ::cmdl
0990: 69 6e 65 3a 3a 67 65 74 4b 6e 6f 77 6e 4f 70 74  ine::getKnownOpt
09a0: 20 2d 2d 0a 23 0a 23 09 54 68 65 20 63 6d 64 6c   --.#.#.The cmdl
09b0: 69 6e 65 3a 3a 67 65 74 4b 6e 6f 77 6e 4f 70 74  ine::getKnownOpt
09c0: 20 77 6f 72 6b 73 20 69 6e 20 61 20 66 61 73 68   works in a fash
09d0: 69 6f 6e 20 6c 69 6b 65 20 74 68 65 20 73 74 61  ion like the sta
09e0: 6e 64 61 72 64 0a 23 09 43 20 62 61 73 65 64 20  ndard.#.C based 
09f0: 67 65 74 6f 70 74 20 66 75 6e 63 74 69 6f 6e 2e  getopt function.
0a00: 20 20 47 69 76 65 6e 20 61 6e 20 6f 70 74 69 6f    Given an optio
0a10: 6e 20 73 74 72 69 6e 67 20 61 6e 64 20 61 20 0a  n string and a .
0a20: 23 09 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  #.pointer to an 
0a30: 61 72 72 61 79 20 6f 72 20 61 72 67 73 20 74 68  array or args th
0a40: 69 73 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20  is command will 
0a50: 70 72 6f 63 65 73 73 20 74 68 65 0a 23 09 66 69  process the.#.fi
0a60: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  rst argument and
0a70: 20 72 65 74 75 72 6e 20 69 6e 66 6f 20 6f 6e 20   return info on 
0a80: 68 6f 77 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  how to proceed..
0a90: 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  #.# Arguments:.#
0aa0: 09 61 72 67 76 56 61 72 09 09 4e 61 6d 65 20 6f  .argvVar..Name o
0ab0: 66 20 74 68 65 20 61 72 67 76 20 6c 69 73 74 20  f the argv list 
0ac0: 74 68 61 74 20 79 6f 75 0a 23 09 09 09 77 61 6e  that you.#...wan
0ad0: 74 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 20 49  t to process.  I
0ae0: 66 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 66 6f  f options are fo
0af0: 75 6e 64 20 74 68 65 0a 23 09 09 09 61 72 67 20  und the.#...arg 
0b00: 6c 69 73 74 20 69 73 20 6d 6f 64 69 66 69 65 64  list is modified
0b10: 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73   and the process
0b20: 65 64 20 61 72 67 75 6d 65 6e 74 73 0a 23 09 09  ed arguments.#..
0b30: 09 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f  .are removed fro
0b40: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
0b50: 68 65 20 6c 69 73 74 2e 20 20 4e 6f 74 65 20 74  he list.  Note t
0b60: 68 61 74 0a 23 09 09 09 75 6e 6b 6e 6f 77 6e 20  hat.#...unknown 
0b70: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  options and the 
0b80: 61 72 67 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  args that follow
0b90: 20 74 68 65 6d 20 61 72 65 0a 23 09 09 09 6c 65   them are.#...le
0ba0: 66 74 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ft in this list.
0bb0: 0a 23 09 6f 70 74 73 74 72 69 6e 67 09 41 20 6c  .#.optstring.A l
0bc0: 69 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 6f  ist of command o
0bd0: 70 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  ptions that the 
0be0: 61 70 70 6c 69 63 61 74 69 6f 6e 0a 23 09 09 09  application.#...
0bf0: 77 69 6c 6c 20 61 63 63 65 70 74 2e 20 20 49 66  will accept.  If
0c00: 20 74 68 65 20 6f 70 74 69 6f 6e 20 65 6e 64 73   the option ends
0c10: 20 69 6e 20 22 2e 61 72 67 22 20 74 68 65 0a 23   in ".arg" the.#
0c20: 09 09 09 67 65 74 6f 70 74 20 72 6f 75 74 69 6e  ...getopt routin
0c30: 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 6e  e will use the n
0c40: 65 78 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  ext argument as 
0c50: 0a 23 09 09 09 61 6e 20 61 72 67 75 6d 65 6e 74  .#...an argument
0c60: 20 74 6f 20 74 68 65 20 6f 70 74 69 6f 6e 2e 20   to the option. 
0c70: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6f   Otherwise the o
0c80: 70 74 69 6f 6e 09 0a 23 09 09 09 69 73 20 61 20  ption..#...is a 
0c90: 62 6f 6f 6c 65 61 6e 20 74 68 61 74 20 69 73 20  boolean that is 
0ca0: 73 65 74 20 74 6f 20 31 20 69 66 20 70 72 65 73  set to 1 if pres
0cb0: 65 6e 74 2e 0a 23 09 6f 70 74 56 61 72 09 09 54  ent..#.optVar..T
0cc0: 68 65 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  he variable poin
0cd0: 74 65 64 20 74 6f 20 62 79 20 6f 70 74 56 61 72  ted to by optVar
0ce0: 0a 23 09 09 09 63 6f 6e 74 61 69 6e 73 20 74 68  .#...contains th
0cf0: 65 20 6f 70 74 69 6f 6e 20 74 68 61 74 20 77 61  e option that wa
0d00: 73 20 66 6f 75 6e 64 20 28 77 69 74 68 6f 75 74  s found (without
0d10: 20 74 68 65 0a 23 09 09 09 6c 65 61 64 69 6e 67   the.#...leading
0d20: 20 27 2d 27 20 61 6e 64 20 77 69 74 68 6f 75 74   '-' and without
0d30: 20 74 68 65 20 2e 61 72 67 20 65 78 74 65 6e 73   the .arg extens
0d40: 69 6f 6e 29 2e 0a 23 09 76 61 6c 56 61 72 09 09  ion)..#.valVar..
0d50: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  Upon success, th
0d60: 65 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  e variable point
0d70: 65 64 20 74 6f 20 62 79 20 76 61 6c 56 61 72 0a  ed to by valVar.
0d80: 23 09 09 09 63 6f 6e 74 61 69 6e 73 20 74 68 65  #...contains the
0d90: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
0da0: 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 2e  pecified option.
0db0: 0a 23 09 09 09 54 68 69 73 20 76 61 6c 75 65 20  .#...This value 
0dc0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63  comes from the c
0dd0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20  ommand line for 
0de0: 2e 61 72 67 0a 23 09 09 09 6f 70 74 69 6f 6e 73  .arg.#...options
0df0: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
0e00: 76 61 6c 75 65 20 69 73 20 31 2e 0a 23 09 09 09  value is 1..#...
0e10: 49 66 20 67 65 74 6f 70 74 20 66 61 69 6c 73 2c  If getopt fails,
0e20: 20 74 68 65 20 76 61 6c 56 61 72 20 69 73 20 66   the valVar is f
0e30: 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 0a 23 09  illed with an.#.
0e40: 09 09 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  ..error message.
0e50: 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 20  .#.# Results:.# 
0e60: 09 54 68 65 20 67 65 74 4b 6e 6f 77 6e 4f 70 74  .The getKnownOpt
0e70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0e80: 73 20 31 20 69 66 20 61 6e 20 6f 70 74 69 6f 6e  s 1 if an option
0e90: 20 77 61 73 20 66 6f 75 6e 64 2c 0a 23 09 30 20   was found,.#.0 
0ea0: 69 66 20 6e 6f 20 6d 6f 72 65 20 6f 70 74 69 6f  if no more optio
0eb0: 6e 73 20 77 65 72 65 20 66 6f 75 6e 64 2c 20 2d  ns were found, -
0ec0: 31 20 69 66 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20  1 if an unknown 
0ed0: 6f 70 74 69 6f 6e 20 77 61 73 0a 23 09 65 6e 63  option was.#.enc
0ee0: 6f 75 6e 74 65 72 65 64 2c 20 61 6e 64 20 2d 32  ountered, and -2
0ef0: 20 69 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72   if any other er
0f00: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 0a 0a  ror occurred. ..
0f10: 70 72 6f 63 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a  proc ::cmdline::
0f20: 67 65 74 4b 6e 6f 77 6e 4f 70 74 20 7b 61 72 67  getKnownOpt {arg
0f30: 76 56 61 72 20 6f 70 74 73 74 72 69 6e 67 20 6f  vVar optstring o
0f40: 70 74 56 61 72 20 76 61 6c 56 61 72 7d 20 7b 0a  ptVar valVar} {.
0f50: 20 20 20 20 75 70 76 61 72 20 31 20 24 61 72 67      upvar 1 $arg
0f60: 76 56 61 72 20 61 72 67 73 4c 69 73 74 0a 20 20  vVar argsList.  
0f70: 20 20 75 70 76 61 72 20 31 20 24 6f 70 74 56 61    upvar 1 $optVa
0f80: 72 20 20 6f 70 74 69 6f 6e 0a 20 20 20 20 75 70  r  option.    up
0f90: 76 61 72 20 31 20 24 76 61 6c 56 61 72 20 20 76  var 1 $valVar  v
0fa0: 61 6c 75 65 0a 0a 20 20 20 20 23 20 64 65 66 61  alue..    # defa
0fb0: 75 6c 74 20 73 65 74 74 69 6e 67 73 20 66 6f 72  ult settings for
0fc0: 20 61 20 6e 6f 72 6d 61 6c 20 72 65 74 75 72 6e   a normal return
0fd0: 0a 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22  .    set value "
0fe0: 22 0a 20 20 20 20 73 65 74 20 6f 70 74 69 6f 6e  ".    set option
0ff0: 20 22 22 0a 20 20 20 20 73 65 74 20 72 65 73 75   "".    set resu
1000: 6c 74 20 30 0a 0a 20 20 20 20 23 20 63 68 65 63  lt 0..    # chec
1010: 6b 20 69 66 20 77 65 27 72 65 20 70 61 73 74 20  k if we're past 
1020: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
1030: 72 67 73 20 6c 69 73 74 0a 20 20 20 20 69 66 20  rgs list.    if 
1040: 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 4c  {[llength $argsL
1050: 69 73 74 5d 20 21 3d 20 30 7d 20 7b 0a 0a 09 23  ist] != 0} {...#
1060: 20 69 66 20 77 65 20 67 6f 74 20 2d 2d 20 6f 72   if we got -- or
1070: 20 61 6e 20 6f 70 74 69 6f 6e 20 74 68 61 74 20   an option that 
1080: 64 6f 65 73 6e 27 74 20 62 65 67 69 6e 20 77 69  doesn't begin wi
1090: 74 68 20 2d 2c 20 72 65 74 75 72 6e 20 28 73 6b  th -, return (sk
10a0: 69 70 70 69 6e 67 0a 09 23 20 74 68 65 20 2d 2d  ipping..# the --
10b0: 29 2e 20 20 6f 74 68 65 72 77 69 73 65 20 70 72  ).  otherwise pr
10c0: 6f 63 65 73 73 20 74 68 65 20 6f 70 74 69 6f 6e  ocess the option
10d0: 20 61 72 67 2e 0a 09 73 77 69 74 63 68 20 2d 67   arg...switch -g
10e0: 6c 6f 62 20 2d 2d 20 5b 73 65 74 20 61 72 67 20  lob -- [set arg 
10f0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73  [lindex $argsLis
1100: 74 20 30 5d 5d 20 7b 0a 09 20 20 20 20 22 2d 2d  t 0]] {..    "--
1110: 22 20 7b 0a 09 09 73 65 74 20 61 72 67 73 4c 69  " {...set argsLi
1120: 73 74 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73  st [lrange $args
1130: 4c 69 73 74 20 31 20 65 6e 64 5d 0a 09 20 20 20  List 1 end]..   
1140: 20 7d 0a 09 20 20 20 20 22 2d 2d 2a 22 20 2d 0a   }..    "--*" -.
1150: 09 20 20 20 20 22 2d 2a 22 20 7b 0a 09 09 73 65  .    "-*" {...se
1160: 74 20 6f 70 74 69 6f 6e 20 5b 73 74 72 69 6e 67  t option [string
1170: 20 72 61 6e 67 65 20 24 61 72 67 20 31 20 65 6e   range $arg 1 en
1180: 64 5d 0a 09 09 69 66 20 7b 5b 73 74 72 69 6e 67  d]...if {[string
1190: 20 65 71 75 61 6c 20 5b 73 74 72 69 6e 67 20 72   equal [string r
11a0: 61 6e 67 65 20 24 6f 70 74 69 6f 6e 20 30 20 30  ange $option 0 0
11b0: 5d 20 22 2d 22 5d 7d 20 7b 0a 09 09 20 20 20 20  ] "-"]} {...    
11c0: 73 65 74 20 6f 70 74 69 6f 6e 20 5b 73 74 72 69  set option [stri
11d0: 6e 67 20 72 61 6e 67 65 20 24 61 72 67 20 32 20  ng range $arg 2 
11e0: 65 6e 64 5d 0a 09 09 7d 0a 0a 09 09 23 20 73 75  end]...}....# su
11f0: 70 70 6f 72 74 20 66 6f 72 20 66 6f 72 6d 61 74  pport for format
1200: 3a 20 5b 2d 5d 2d 6f 70 74 69 6f 6e 3d 76 61 6c  : [-]-option=val
1210: 75 65 0a 09 09 73 65 74 20 69 64 78 20 5b 73 74  ue...set idx [st
1220: 72 69 6e 67 20 66 69 72 73 74 20 22 3d 22 20 24  ring first "=" $
1230: 6f 70 74 69 6f 6e 20 31 5d 0a 09 09 69 66 20 7b  option 1]...if {
1240: 24 69 64 78 20 21 3d 20 2d 31 7d 20 7b 0a 09 09  $idx != -1} {...
1250: 20 20 20 20 73 65 74 20 5f 76 61 6c 20 20 20 5b      set _val   [
1260: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70  string range $op
1270: 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 69 64 78  tion [expr {$idx
1280: 2b 31 7d 5d 20 65 6e 64 5d 0a 09 09 20 20 20 20  +1}] end]...    
1290: 73 65 74 20 6f 70 74 69 6f 6e 20 5b 73 74 72 69  set option [stri
12a0: 6e 67 20 72 61 6e 67 65 20 24 6f 70 74 69 6f 6e  ng range $option
12b0: 20 30 20 20 20 5b 65 78 70 72 20 7b 24 69 64 78   0   [expr {$idx
12c0: 2d 31 7d 5d 5d 0a 09 09 7d 0a 0a 09 09 69 66 20  -1}]]...}....if 
12d0: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
12e0: 20 24 6f 70 74 73 74 72 69 6e 67 20 24 6f 70 74   $optstring $opt
12f0: 69 6f 6e 5d 20 21 3d 20 2d 31 7d 20 7b 0a 09 09  ion] != -1} {...
1300: 20 20 20 20 23 20 42 6f 6f 6c 65 61 6e 73 20 61      # Booleans a
1310: 72 65 20 73 65 74 20 74 6f 20 31 20 77 68 65 6e  re set to 1 when
1320: 20 70 72 65 73 65 6e 74 0a 09 09 20 20 20 20 73   present...    s
1330: 65 74 20 76 61 6c 75 65 20 31 0a 09 09 20 20 20  et value 1...   
1340: 20 73 65 74 20 72 65 73 75 6c 74 20 31 0a 09 09   set result 1...
1350: 20 20 20 20 73 65 74 20 61 72 67 73 4c 69 73 74      set argsList
1360: 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 4c 69   [lrange $argsLi
1370: 73 74 20 31 20 65 6e 64 5d 0a 09 09 7d 20 65 6c  st 1 end]...} el
1380: 73 65 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d  seif {[lsearch -
1390: 65 78 61 63 74 20 24 6f 70 74 73 74 72 69 6e 67  exact $optstring
13a0: 20 22 24 6f 70 74 69 6f 6e 2e 61 72 67 22 5d 20   "$option.arg"] 
13b0: 21 3d 20 2d 31 7d 20 7b 0a 09 09 20 20 20 20 73  != -1} {...    s
13c0: 65 74 20 72 65 73 75 6c 74 20 31 0a 09 09 20 20  et result 1...  
13d0: 20 20 73 65 74 20 61 72 67 73 4c 69 73 74 20 5b    set argsList [
13e0: 6c 72 61 6e 67 65 20 24 61 72 67 73 4c 69 73 74  lrange $argsList
13f0: 20 31 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20 69   1 end]....    i
1400: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1410: 5f 76 61 6c 5d 7d 20 7b 0a 09 09 09 73 65 74 20  _val]} {....set 
1420: 76 61 6c 75 65 20 24 5f 76 61 6c 0a 09 09 20 20  value $_val...  
1430: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65    } elseif {[lle
1440: 6e 67 74 68 20 24 61 72 67 73 4c 69 73 74 5d 7d  ngth $argsList]}
1450: 20 7b 0a 09 09 09 73 65 74 20 76 61 6c 75 65 20   {....set value 
1460: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73  [lindex $argsLis
1470: 74 20 30 5d 0a 09 09 09 73 65 74 20 61 72 67 73  t 0]....set args
1480: 4c 69 73 74 20 5b 6c 72 61 6e 67 65 20 24 61 72  List [lrange $ar
1490: 67 73 4c 69 73 74 20 31 20 65 6e 64 5d 0a 09 09  gsList 1 end]...
14a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
14b0: 73 65 74 20 76 61 6c 75 65 20 22 4f 70 74 69 6f  set value "Optio
14c0: 6e 20 5c 22 24 6f 70 74 69 6f 6e 5c 22 20 72 65  n \"$option\" re
14d0: 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
14e0: 6e 74 22 0a 09 09 09 73 65 74 20 72 65 73 75 6c  nt"....set resul
14f0: 74 20 2d 32 0a 09 09 20 20 20 20 7d 0a 09 09 7d  t -2...    }...}
1500: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 23 20   else {...    # 
1510: 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 2e 0a  Unknown option..
1520: 09 09 20 20 20 20 73 65 74 20 76 61 6c 75 65 20  ..    set value 
1530: 22 49 6c 6c 65 67 61 6c 20 6f 70 74 69 6f 6e 20  "Illegal option 
1540: 5c 22 2d 24 6f 70 74 69 6f 6e 5c 22 22 0a 09 09  \"-$option\""...
1550: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 2d      set result -
1560: 31 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  1...}..    }..  
1570: 20 20 64 65 66 61 75 6c 74 20 7b 0a 09 09 23 20    default {...# 
1580: 53 6b 69 70 20 61 68 65 61 64 0a 09 20 20 20 20  Skip ahead..    
1590: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  }..}.    }..    
15a0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d  return $result.}
15b0: 0a 0a 23 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 67  ..# ::cmdline::g
15c0: 65 74 6f 70 74 69 6f 6e 73 20 2d 2d 0a 23 0a 23  etoptions --.#.#
15d0: 09 50 72 6f 63 65 73 73 20 61 20 73 65 74 20 6f  .Process a set o
15e0: 66 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  f command line o
15f0: 70 74 69 6f 6e 73 2c 20 66 69 6c 6c 69 6e 67 20  ptions, filling 
1600: 69 6e 20 64 65 66 61 75 6c 74 73 0a 23 09 66 6f  in defaults.#.fo
1610: 72 20 74 68 6f 73 65 20 6e 6f 74 20 73 70 65 63  r those not spec
1620: 69 66 69 65 64 2e 20 20 54 68 69 73 20 61 6c 73  ified.  This als
1630: 6f 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  o generates an e
1640: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 23 09 74  rror message.#.t
1650: 68 61 74 20 6c 69 73 74 73 20 74 68 65 20 61 6c  hat lists the al
1660: 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 66 20 61  lowed flags if a
1670: 6e 20 69 6e 63 6f 72 72 65 63 74 20 66 6c 61 67  n incorrect flag
1680: 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 23   is specified..#
1690: 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 09  .# Arguments:.#.
16a0: 61 72 67 6c 69 73 74 56 61 72 09 54 68 65 20 6e  arglistVar.The n
16b0: 61 6d 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ame of the argum
16c0: 65 6e 74 20 6c 69 73 74 2c 20 74 79 70 69 63 61  ent list, typica
16d0: 6c 6c 79 20 61 72 67 76 2e 0a 23 09 09 09 57 65  lly argv..#...We
16e0: 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6b 6e 6f 77   remove all know
16f0: 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  n options and th
1700: 65 69 72 20 61 72 67 73 20 66 72 6f 6d 20 69 74  eir args from it
1710: 2e 0a 23 09 6f 70 74 6c 69 73 74 09 09 41 20 6c  ..#.optlist..A l
1720: 69 73 74 2d 6f 66 2d 6c 69 73 74 73 20 77 68 65  ist-of-lists whe
1730: 72 65 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  re each element 
1740: 73 70 65 63 69 66 69 65 73 20 61 6e 20 6f 70 74  specifies an opt
1750: 69 6f 6e 0a 23 09 09 09 69 6e 20 74 68 65 20 66  ion.#...in the f
1760: 6f 72 6d 3a 0a 23 09 09 09 09 28 77 68 65 72 65  orm:.#....(where
1770: 20 66 6c 61 67 20 74 61 6b 65 73 20 6e 6f 20 61   flag takes no a
1780: 72 67 75 6d 65 6e 74 29 20 0a 23 09 09 09 09 09  rgument) .#.....
1790: 66 6c 61 67 20 63 6f 6d 6d 65 6e 74 20 0a 23 0a  flag comment .#.
17a0: 23 09 09 09 09 28 6f 72 20 77 68 65 72 65 20 66  #....(or where f
17b0: 6c 61 67 20 74 61 6b 65 73 20 61 6e 20 61 72 67  lag takes an arg
17c0: 75 6d 65 6e 74 29 20 0a 23 09 09 09 09 09 66 6c  ument) .#.....fl
17d0: 61 67 20 64 65 66 61 75 6c 74 20 63 6f 6d 6d 65  ag default comme
17e0: 6e 74 0a 23 0a 23 09 09 09 49 66 20 66 6c 61 67  nt.#.#...If flag
17f0: 20 65 6e 64 73 20 69 6e 20 22 2e 61 72 67 22 20   ends in ".arg" 
1800: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69  then the value i
1810: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
1820: 0a 23 09 09 09 63 6f 6d 6d 61 6e 64 20 6c 69 6e  .#...command lin
1830: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20  e. Otherwise it 
1840: 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 61 6e 64  is a boolean and
1850: 20 61 70 70 65 61 72 73 20 69 6e 0a 23 09 09 09   appears in.#...
1860: 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 70 72  the result if pr
1870: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 63 6f 6d  esent on the com
1880: 6d 61 6e 64 20 6c 69 6e 65 2e 20 49 66 20 66 6c  mand line. If fl
1890: 61 67 20 65 6e 64 73 0a 23 09 09 09 69 6e 20 22  ag ends.#...in "
18a0: 2e 73 65 63 72 65 74 22 2c 20 69 74 20 77 69 6c  .secret", it wil
18b0: 6c 20 6e 6f 74 20 62 65 20 64 69 73 70 6c 61 79  l not be display
18c0: 65 64 20 69 6e 20 74 68 65 20 75 73 61 67 65 2e  ed in the usage.
18d0: 0a 23 09 75 73 61 67 65 09 09 54 65 78 74 20 74  .#.usage..Text t
18e0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
18f0: 20 75 73 61 67 65 20 64 69 73 70 6c 61 79 2e 20   usage display. 
1900: 44 65 66 61 75 6c 74 73 20 74 6f 0a 23 09 09 09  Defaults to.#...
1910: 22 6f 70 74 69 6f 6e 73 3a 22 0a 23 0a 23 20 52  "options:".#.# R
1920: 65 73 75 6c 74 73 0a 23 09 4e 61 6d 65 20 76 61  esults.#.Name va
1930: 6c 75 65 20 70 61 69 72 73 20 73 75 69 74 61 62  lue pairs suitab
1940: 6c 65 20 66 6f 72 20 75 73 69 6e 67 20 77 69 74  le for using wit
1950: 68 20 61 72 72 61 79 20 73 65 74 2e 0a 0a 70 72  h array set...pr
1960: 6f 63 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65  oc ::cmdline::ge
1970: 74 6f 70 74 69 6f 6e 73 20 7b 61 72 67 6c 69 73  toptions {arglis
1980: 74 56 61 72 20 6f 70 74 6c 69 73 74 20 7b 75 73  tVar optlist {us
1990: 61 67 65 20 6f 70 74 69 6f 6e 73 3a 7d 7d 20 7b  age options:}} {
19a0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 24 61 72  .    upvar 1 $ar
19b0: 67 6c 69 73 74 56 61 72 20 61 72 67 76 0a 0a 20  glistVar argv.. 
19c0: 20 20 20 73 65 74 20 6f 70 74 73 20 5b 47 65 74     set opts [Get
19d0: 4f 70 74 69 6f 6e 44 65 66 61 75 6c 74 73 20 24  OptionDefaults $
19e0: 6f 70 74 6c 69 73 74 20 72 65 73 75 6c 74 5d 0a  optlist result].
19f0: 0a 20 20 20 20 73 65 74 20 61 72 67 63 20 5b 6c  .    set argc [l
1a00: 6c 65 6e 67 74 68 20 24 61 72 67 76 5d 0a 20 20  length $argv].  
1a10: 20 20 77 68 69 6c 65 20 7b 5b 73 65 74 20 65 72    while {[set er
1a20: 72 20 5b 67 65 74 6f 70 74 20 61 72 67 76 20 24  r [getopt argv $
1a30: 6f 70 74 73 20 6f 70 74 20 61 72 67 5d 5d 7d 20  opts opt arg]]} 
1a40: 7b 0a 09 69 66 20 7b 24 65 72 72 20 3c 20 30 7d  {..if {$err < 0}
1a50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
1a60: 65 74 20 72 65 73 75 6c 74 28 3f 29 20 22 22 0a  et result(?) "".
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a80: 6b 0a 09 7d 0a 09 73 65 74 20 72 65 73 75 6c 74  k..}..set result
1a90: 28 24 6f 70 74 29 20 24 61 72 67 0a 20 20 20 20  ($opt) $arg.    
1aa0: 7d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  }.    if {[info 
1ab0: 65 78 69 73 74 20 72 65 73 75 6c 74 28 3f 29 5d  exist result(?)]
1ac0: 20 7c 7c 20 5b 69 6e 66 6f 20 65 78 69 73 74 73   || [info exists
1ad0: 20 72 65 73 75 6c 74 28 68 65 6c 70 29 5d 7d 20   result(help)]} 
1ae0: 7b 0a 09 45 72 72 6f 72 20 5b 75 73 61 67 65 20  {..Error [usage 
1af0: 24 6f 70 74 6c 69 73 74 20 24 75 73 61 67 65 5d  $optlist $usage]
1b00: 20 55 53 41 47 45 0a 20 20 20 20 7d 0a 20 20 20   USAGE.    }.   
1b10: 20 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67   return [array g
1b20: 65 74 20 72 65 73 75 6c 74 5d 0a 7d 0a 0a 23 20  et result].}..# 
1b30: 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 4b 6e  ::cmdline::getKn
1b40: 6f 77 6e 4f 70 74 69 6f 6e 73 20 2d 2d 0a 23 0a  ownOptions --.#.
1b50: 23 09 50 72 6f 63 65 73 73 20 61 20 73 65 74 20  #.Process a set 
1b60: 6f 66 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  of command line 
1b70: 6f 70 74 69 6f 6e 73 2c 20 66 69 6c 6c 69 6e 67  options, filling
1b80: 20 69 6e 20 64 65 66 61 75 6c 74 73 0a 23 09 66   in defaults.#.f
1b90: 6f 72 20 74 68 6f 73 65 20 6e 6f 74 20 73 70 65  or those not spe
1ba0: 63 69 66 69 65 64 2e 20 20 54 68 69 73 20 69 67  cified.  This ig
1bb0: 6e 6f 72 65 73 20 75 6e 6b 6e 6f 77 6e 20 66 6c  nores unknown fl
1bc0: 61 67 73 2c 20 62 75 74 20 67 65 6e 65 72 61 74  ags, but generat
1bd0: 65 73 0a 23 09 61 6e 20 65 72 72 6f 72 20 6d 65  es.#.an error me
1be0: 73 73 61 67 65 20 74 68 61 74 20 6c 69 73 74 73  ssage that lists
1bf0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 61   the correct usa
1c00: 67 65 20 69 66 20 61 20 6b 6e 6f 77 6e 20 6f 70  ge if a known op
1c10: 74 69 6f 6e 0a 23 09 69 73 20 75 73 65 64 20 69  tion.#.is used i
1c20: 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 23 20  ncorrectly..#.# 
1c30: 41 72 67 75 6d 65 6e 74 73 3a 0a 23 09 61 72 67  Arguments:.#.arg
1c40: 6c 69 73 74 56 61 72 09 54 68 65 20 6e 61 6d 65  listVar.The name
1c50: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
1c60: 20 6c 69 73 74 2c 20 74 79 70 69 63 61 6c 6c 79   list, typically
1c70: 20 61 72 67 76 2e 20 20 54 68 69 73 0a 23 09 09   argv.  This.#..
1c80: 09 57 65 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6b  .We remove all k
1c90: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  nown options and
1ca0: 20 74 68 65 69 72 20 61 72 67 73 20 66 72 6f 6d   their args from
1cb0: 20 69 74 2e 0a 23 09 6f 70 74 6c 69 73 74 09 09   it..#.optlist..
1cc0: 41 20 6c 69 73 74 2d 6f 66 2d 6c 69 73 74 73 20  A list-of-lists 
1cd0: 77 68 65 72 65 20 65 61 63 68 20 65 6c 65 6d 65  where each eleme
1ce0: 6e 74 20 73 70 65 63 69 66 69 65 73 20 61 6e 20  nt specifies an 
1cf0: 6f 70 74 69 6f 6e 0a 23 09 09 09 69 6e 20 74 68  option.#...in th
1d00: 65 20 66 6f 72 6d 3a 0a 23 09 09 09 09 66 6c 61  e form:.#....fla
1d10: 67 20 64 65 66 61 75 6c 74 20 63 6f 6d 6d 65 6e  g default commen
1d20: 74 0a 23 09 09 09 49 66 20 66 6c 61 67 20 65 6e  t.#...If flag en
1d30: 64 73 20 69 6e 20 22 2e 61 72 67 22 20 74 68 65  ds in ".arg" the
1d40: 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  n the value is t
1d50: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 23 09  aken from the.#.
1d60: 09 09 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  ..command line. 
1d70: 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20  Otherwise it is 
1d80: 61 20 62 6f 6f 6c 65 61 6e 20 61 6e 64 20 61 70  a boolean and ap
1d90: 70 65 61 72 73 20 69 6e 0a 23 09 09 09 74 68 65  pears in.#...the
1da0: 20 72 65 73 75 6c 74 20 69 66 20 70 72 65 73 65   result if prese
1db0: 6e 74 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  nt on the comman
1dc0: 64 20 6c 69 6e 65 2e 20 49 66 20 66 6c 61 67 20  d line. If flag 
1dd0: 65 6e 64 73 0a 23 09 09 09 69 6e 20 22 2e 73 65  ends.#...in ".se
1de0: 63 72 65 74 22 2c 20 69 74 20 77 69 6c 6c 20 6e  cret", it will n
1df0: 6f 74 20 62 65 20 64 69 73 70 6c 61 79 65 64 20  ot be displayed 
1e00: 69 6e 20 74 68 65 20 75 73 61 67 65 2e 0a 23 09  in the usage..#.
1e10: 75 73 61 67 65 09 09 54 65 78 74 20 74 6f 20 69  usage..Text to i
1e20: 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 75 73  nclude in the us
1e30: 61 67 65 20 64 69 73 70 6c 61 79 2e 20 44 65 66  age display. Def
1e40: 61 75 6c 74 73 20 74 6f 0a 23 09 09 09 22 6f 70  aults to.#..."op
1e50: 74 69 6f 6e 73 3a 22 0a 23 0a 23 20 52 65 73 75  tions:".#.# Resu
1e60: 6c 74 73 0a 23 09 4e 61 6d 65 20 76 61 6c 75 65  lts.#.Name value
1e70: 20 70 61 69 72 73 20 73 75 69 74 61 62 6c 65 20   pairs suitable 
1e80: 66 6f 72 20 75 73 69 6e 67 20 77 69 74 68 20 61  for using with a
1e90: 72 72 61 79 20 73 65 74 2e 0a 0a 70 72 6f 63 20  rray set...proc 
1ea0: 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 4b 6e  ::cmdline::getKn
1eb0: 6f 77 6e 4f 70 74 69 6f 6e 73 20 7b 61 72 67 6c  ownOptions {argl
1ec0: 69 73 74 56 61 72 20 6f 70 74 6c 69 73 74 20 7b  istVar optlist {
1ed0: 75 73 61 67 65 20 6f 70 74 69 6f 6e 73 3a 7d 7d  usage options:}}
1ee0: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 24   {.    upvar 1 $
1ef0: 61 72 67 6c 69 73 74 56 61 72 20 61 72 67 76 0a  arglistVar argv.
1f00: 0a 20 20 20 20 73 65 74 20 6f 70 74 73 20 5b 47  .    set opts [G
1f10: 65 74 4f 70 74 69 6f 6e 44 65 66 61 75 6c 74 73  etOptionDefaults
1f20: 20 24 6f 70 74 6c 69 73 74 20 72 65 73 75 6c 74   $optlist result
1f30: 5d 0a 0a 20 20 20 20 23 20 41 73 20 77 65 20 65  ]..    # As we e
1f40: 6e 63 6f 75 6e 74 65 72 20 74 68 65 6d 2c 20 6b  ncounter them, k
1f50: 65 65 70 20 74 68 65 20 75 6e 6b 6e 6f 77 6e 20  eep the unknown 
1f60: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69  options and thei
1f70: 72 0a 20 20 20 20 23 20 61 72 67 75 6d 65 6e 74  r.    # argument
1f80: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20  s in this list. 
1f90: 20 42 65 66 6f 72 65 20 77 65 20 72 65 74 75 72   Before we retur
1fa0: 6e 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63  n from this proc
1fb0: 65 64 75 72 65 2c 0a 20 20 20 20 23 20 77 65 27  edure,.    # we'
1fc0: 6c 6c 20 70 72 65 70 65 6e 64 20 74 68 65 73 65  ll prepend these
1fd0: 20 61 72 67 73 20 74 6f 20 74 68 65 20 61 72 67   args to the arg
1fe0: 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74 68 65  List so that the
1ff0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 20 20   application.   
2000: 20 23 20 64 6f 65 73 6e 27 74 20 6c 6f 73 65 20   # doesn't lose 
2010: 74 68 65 6d 2e 0a 0a 20 20 20 20 73 65 74 20 75  them...    set u
2020: 6e 6b 6e 6f 77 6e 4f 70 74 69 6f 6e 73 20 5b 6c  nknownOptions [l
2030: 69 73 74 5d 0a 0a 20 20 20 20 73 65 74 20 61 72  ist]..    set ar
2040: 67 63 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67  gc [llength $arg
2050: 76 5d 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 73  v].    while {[s
2060: 65 74 20 65 72 72 20 5b 67 65 74 4b 6e 6f 77 6e  et err [getKnown
2070: 4f 70 74 20 61 72 67 76 20 24 6f 70 74 73 20 6f  Opt argv $opts o
2080: 70 74 20 61 72 67 5d 5d 7d 20 7b 0a 09 69 66 20  pt arg]]} {..if 
2090: 7b 24 65 72 72 20 3d 3d 20 2d 31 7d 20 7b 0a 20  {$err == -1} {. 
20a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 55 6e 6b             # Unk
20b0: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 2e 0a 0a 20 20  nown option...  
20c0: 20 20 20 20 20 20 20 20 20 20 23 20 53 6b 69 70            # Skip
20d0: 20 6f 76 65 72 20 61 6e 79 20 6e 6f 6e 2d 6f 70   over any non-op
20e0: 74 69 6f 6e 20 69 74 65 6d 73 20 74 68 61 74 20  tion items that 
20f0: 66 6f 6c 6c 6f 77 20 69 74 2e 0a 20 20 20 20 20  follow it..     
2100: 20 20 20 20 20 20 20 23 20 46 6f 72 20 6e 6f 77         # For now
2110: 2c 20 61 64 64 20 74 68 65 6d 20 74 6f 20 74 68  , add them to th
2120: 65 20 6c 69 73 74 20 6f 66 20 75 6e 6b 6e 6f 77  e list of unknow
2130: 6e 4f 70 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nOptions..      
2140: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 75 6e        lappend un
2150: 6b 6e 6f 77 6e 4f 70 74 69 6f 6e 73 20 5b 6c 69  knownOptions [li
2160: 6e 64 65 78 20 24 61 72 67 76 20 30 5d 0a 20 20  ndex $argv 0].  
2170: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 72            set ar
2180: 67 76 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 76  gv [lrange $argv
2190: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20   1 end].        
21a0: 20 20 20 20 77 68 69 6c 65 20 7b 28 5b 6c 6c 65      while {([lle
21b0: 6e 67 74 68 20 24 61 72 67 76 5d 20 21 3d 20 30  ngth $argv] != 0
21c0: 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) \.            
21d0: 20 20 20 20 20 20 20 20 26 26 20 21 5b 73 74 72          && ![str
21e0: 69 6e 67 20 6d 61 74 63 68 20 22 2d 2a 22 20 5b  ing match "-*" [
21f0: 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d 5d  lindex $argv 0]]
2200: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2210: 20 20 20 20 6c 61 70 70 65 6e 64 20 75 6e 6b 6e      lappend unkn
2220: 6f 77 6e 4f 70 74 69 6f 6e 73 20 5b 6c 69 6e 64  ownOptions [lind
2230: 65 78 20 24 61 72 67 76 20 30 5d 0a 20 20 20 20  ex $argv 0].    
2240: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
2250: 61 72 67 76 20 5b 6c 72 61 6e 67 65 20 24 61 72  argv [lrange $ar
2260: 67 76 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20  gv 1 end].      
2270: 20 20 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 69        }..} elsei
2280: 66 20 7b 24 65 72 72 20 3d 3d 20 2d 32 7d 20 7b  f {$err == -2} {
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
22a0: 20 72 65 73 75 6c 74 28 3f 29 20 22 22 0a 20 20   result(?) "".  
22b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a            break.
22c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
22d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
22e0: 20 72 65 73 75 6c 74 28 24 6f 70 74 29 20 24 61   result($opt) $a
22f0: 72 67 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  rg.        }.   
2300: 20 7d 0a 0a 20 20 20 20 23 20 42 65 66 6f 72 65   }..    # Before
2310: 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 72 65 70   returning, prep
2320: 65 6e 64 20 74 68 65 20 61 6e 79 20 75 6e 6b 6e  end the any unkn
2330: 6f 77 6e 20 61 72 67 73 20 62 61 63 6b 20 6f 6e  own args back on
2340: 74 6f 20 74 68 65 0a 20 20 20 20 23 20 61 72 67  to the.    # arg
2350: 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74 68 65  List so that the
2360: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 65   application doe
2370: 73 6e 27 74 20 6c 6f 73 65 20 74 68 65 6d 2e 0a  sn't lose them..
2380: 20 20 20 20 73 65 74 20 61 72 67 76 20 5b 63 6f      set argv [co
2390: 6e 63 61 74 20 24 75 6e 6b 6e 6f 77 6e 4f 70 74  ncat $unknownOpt
23a0: 69 6f 6e 73 20 24 61 72 67 76 5d 0a 0a 20 20 20  ions $argv]..   
23b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
23c0: 20 72 65 73 75 6c 74 28 3f 29 5d 20 7c 7c 20 5b   result(?)] || [
23d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 73 75  info exists resu
23e0: 6c 74 28 68 65 6c 70 29 5d 7d 20 7b 0a 09 45 72  lt(help)]} {..Er
23f0: 72 6f 72 20 5b 75 73 61 67 65 20 24 6f 70 74 6c  ror [usage $optl
2400: 69 73 74 20 24 75 73 61 67 65 5d 20 55 53 41 47  ist $usage] USAG
2410: 45 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  E.    }.    retu
2420: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 72 65  rn [array get re
2430: 73 75 6c 74 5d 0a 7d 0a 0a 23 20 3a 3a 63 6d 64  sult].}..# ::cmd
2440: 6c 69 6e 65 3a 3a 47 65 74 4f 70 74 69 6f 6e 44  line::GetOptionD
2450: 65 66 61 75 6c 74 73 20 2d 2d 0a 23 0a 23 09 54  efaults --.#.#.T
2460: 68 69 73 20 69 6e 74 65 72 6e 61 6c 20 70 72 6f  his internal pro
2470: 63 65 64 75 72 65 20 70 72 6f 63 65 73 73 65 73  cedure processes
2480: 20 74 68 65 20 6f 70 74 69 6f 6e 20 6c 69 73 74   the option list
2490: 20 28 74 68 61 74 20 77 61 73 20 70 61 73 73 65   (that was passe
24a0: 64 20 74 6f 0a 23 09 74 68 65 20 67 65 74 6f 70  d to.#.the getop
24b0: 74 20 6f 72 20 67 65 74 4b 6e 6f 77 6e 4f 70 74  t or getKnownOpt
24c0: 20 70 72 6f 63 65 64 75 72 65 29 2e 20 20 54 68   procedure).  Th
24d0: 65 20 64 65 66 61 75 6c 74 41 72 72 61 79 20 67  e defaultArray g
24e0: 65 74 73 20 61 6e 20 69 6e 64 65 78 0a 23 09 66  ets an index.#.f
24f0: 6f 72 20 65 61 63 68 20 6f 70 74 69 6f 6e 20 69  or each option i
2500: 6e 20 74 68 65 20 6f 70 74 69 6f 6e 20 6c 69 73  n the option lis
2510: 74 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  t, the value of 
2520: 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 70 74  which is the opt
2530: 69 6f 6e 27 73 0a 23 09 64 65 66 61 75 6c 74 20  ion's.#.default 
2540: 76 61 6c 75 65 2e 0a 23 0a 23 20 41 72 67 75 6d  value..#.# Argum
2550: 65 6e 74 73 3a 0a 23 09 6f 70 74 6c 69 73 74 09  ents:.#.optlist.
2560: 09 41 20 6c 69 73 74 2d 6f 66 2d 6c 69 73 74 73  .A list-of-lists
2570: 20 77 68 65 72 65 20 65 61 63 68 20 65 6c 65 6d   where each elem
2580: 65 6e 74 20 73 70 65 63 69 66 69 65 73 20 61 6e  ent specifies an
2590: 20 6f 70 74 69 6f 6e 0a 23 09 09 09 69 6e 20 74   option.#...in t
25a0: 68 65 20 66 6f 72 6d 3a 0a 23 09 09 09 09 66 6c  he form:.#....fl
25b0: 61 67 20 64 65 66 61 75 6c 74 20 63 6f 6d 6d 65  ag default comme
25c0: 6e 74 0a 23 09 09 09 49 66 20 66 6c 61 67 20 65  nt.#...If flag e
25d0: 6e 64 73 20 69 6e 20 22 2e 61 72 67 22 20 74 68  nds in ".arg" th
25e0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  en the value is 
25f0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 23  taken from the.#
2600: 09 09 09 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e  ...command line.
2610: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
2620: 20 61 20 62 6f 6f 6c 65 61 6e 20 61 6e 64 20 61   a boolean and a
2630: 70 70 65 61 72 73 20 69 6e 0a 23 09 09 09 74 68  ppears in.#...th
2640: 65 20 72 65 73 75 6c 74 20 69 66 20 70 72 65 73  e result if pres
2650: 65 6e 74 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ent on the comma
2660: 6e 64 20 6c 69 6e 65 2e 20 49 66 20 66 6c 61 67  nd line. If flag
2670: 20 65 6e 64 73 0a 23 09 09 09 69 6e 20 22 2e 73   ends.#...in ".s
2680: 65 63 72 65 74 22 2c 20 69 74 20 77 69 6c 6c 20  ecret", it will 
2690: 6e 6f 74 20 62 65 20 64 69 73 70 6c 61 79 65 64  not be displayed
26a0: 20 69 6e 20 74 68 65 20 75 73 61 67 65 2e 0a 23   in the usage..#
26b0: 09 64 65 66 61 75 6c 74 41 72 72 61 79 56 61 72  .defaultArrayVar
26c0: 09 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65  .The name of the
26d0: 20 61 72 72 61 79 20 69 6e 20 77 68 69 63 68 20   array in which 
26e0: 74 6f 20 70 75 74 20 61 72 67 75 6d 65 6e 74 20  to put argument 
26f0: 64 65 66 61 75 6c 74 73 2e 0a 23 0a 23 20 52 65  defaults..#.# Re
2700: 73 75 6c 74 73 0a 23 09 4e 61 6d 65 20 76 61 6c  sults.#.Name val
2710: 75 65 20 70 61 69 72 73 20 73 75 69 74 61 62 6c  ue pairs suitabl
2720: 65 20 66 6f 72 20 75 73 69 6e 67 20 77 69 74 68  e for using with
2730: 20 61 72 72 61 79 20 73 65 74 2e 0a 0a 70 72 6f   array set...pro
2740: 63 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 47 65 74  c ::cmdline::Get
2750: 4f 70 74 69 6f 6e 44 65 66 61 75 6c 74 73 20 7b  OptionDefaults {
2760: 6f 70 74 6c 69 73 74 20 64 65 66 61 75 6c 74 41  optlist defaultA
2770: 72 72 61 79 56 61 72 7d 20 7b 0a 20 20 20 20 75  rrayVar} {.    u
2780: 70 76 61 72 20 31 20 24 64 65 66 61 75 6c 74 41  pvar 1 $defaultA
2790: 72 72 61 79 56 61 72 20 72 65 73 75 6c 74 0a 0a  rrayVar result..
27a0: 20 20 20 20 73 65 74 20 6f 70 74 73 20 7b 3f 20      set opts {? 
27b0: 68 65 6c 70 7d 0a 20 20 20 20 66 6f 72 65 61 63  help}.    foreac
27c0: 68 20 6f 70 74 20 24 6f 70 74 6c 69 73 74 20 7b  h opt $optlist {
27d0: 0a 09 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64  ..set name [lind
27e0: 65 78 20 24 6f 70 74 20 30 5d 0a 09 69 66 20 7b  ex $opt 0]..if {
27f0: 5b 72 65 67 73 75 62 20 2d 2d 20 7b 5c 2e 73 65  [regsub -- {\.se
2800: 63 72 65 74 24 7d 20 24 6e 61 6d 65 20 7b 7d 20  cret$} $name {} 
2810: 6e 61 6d 65 5d 20 3d 3d 20 31 7d 20 7b 0a 09 20  name] == 1} {.. 
2820: 20 20 20 23 20 4e 65 65 64 20 74 6f 20 68 69 64     # Need to hid
2830: 65 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 20  e this from the 
2840: 75 73 61 67 65 20 64 69 73 70 6c 61 79 20 61 6e  usage display an
2850: 64 20 67 65 74 6f 70 74 0a 09 7d 20 20 20 0a 09  d getopt..}   ..
2860: 6c 61 70 70 65 6e 64 20 6f 70 74 73 20 24 6e 61  lappend opts $na
2870: 6d 65 0a 09 69 66 20 7b 5b 72 65 67 73 75 62 20  me..if {[regsub 
2880: 2d 2d 20 7b 5c 2e 61 72 67 24 7d 20 24 6e 61 6d  -- {\.arg$} $nam
2890: 65 20 7b 7d 20 6e 61 6d 65 5d 20 3d 3d 20 31 7d  e {} name] == 1}
28a0: 20 7b 0a 0a 09 20 20 20 20 23 20 53 65 74 20 64   {...    # Set d
28b0: 65 66 61 75 6c 74 73 20 66 6f 72 20 74 68 6f 73  efaults for thos
28c0: 65 20 74 68 61 74 20 74 61 6b 65 20 76 61 6c 75  e that take valu
28d0: 65 73 2e 0a 0a 09 20 20 20 20 73 65 74 20 64 65  es....    set de
28e0: 66 61 75 6c 74 20 5b 6c 69 6e 64 65 78 20 24 6f  fault [lindex $o
28f0: 70 74 20 31 5d 0a 09 20 20 20 20 73 65 74 20 72  pt 1]..    set r
2900: 65 73 75 6c 74 28 24 6e 61 6d 65 29 20 24 64 65  esult($name) $de
2910: 66 61 75 6c 74 0a 09 7d 20 65 6c 73 65 20 7b 0a  fault..} else {.
2920: 09 20 20 20 20 23 20 54 68 65 20 64 65 66 61 75  .    # The defau
2930: 6c 74 20 66 6f 72 20 62 6f 6f 6c 65 61 6e 73 20  lt for booleans 
2940: 69 73 20 66 61 6c 73 65 0a 09 20 20 20 20 73 65  is false..    se
2950: 74 20 72 65 73 75 6c 74 28 24 6e 61 6d 65 29 20  t result($name) 
2960: 30 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72  0..}.    }.    r
2970: 65 74 75 72 6e 20 24 6f 70 74 73 0a 7d 0a 0a 23  eturn $opts.}..#
2980: 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 75 73 61 67   ::cmdline::usag
2990: 65 20 2d 2d 0a 23 0a 23 09 47 65 6e 65 72 61 74  e --.#.#.Generat
29a0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
29b0: 67 65 20 74 68 61 74 20 6c 69 73 74 73 20 74 68  ge that lists th
29c0: 65 20 61 6c 6c 6f 77 65 64 20 66 6c 61 67 73 2e  e allowed flags.
29d0: 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a  .#.# Arguments:.
29e0: 23 09 6f 70 74 6c 69 73 74 09 09 41 73 20 66 6f  #.optlist..As fo
29f0: 72 20 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 6f 70  r cmdline::getop
2a00: 74 69 6f 6e 73 0a 23 09 75 73 61 67 65 09 09 54  tions.#.usage..T
2a10: 65 78 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 69  ext to include i
2a20: 6e 20 74 68 65 20 75 73 61 67 65 20 64 69 73 70  n the usage disp
2a30: 6c 61 79 2e 20 44 65 66 61 75 6c 74 73 20 74 6f  lay. Defaults to
2a40: 0a 23 09 09 09 22 6f 70 74 69 6f 6e 73 3a 22 0a  .#..."options:".
2a50: 23 0a 23 20 52 65 73 75 6c 74 73 0a 23 09 41 20  #.# Results.#.A 
2a60: 66 6f 72 6d 61 74 74 65 64 20 75 73 61 67 65 20  formatted usage 
2a70: 6d 65 73 73 61 67 65 0a 0a 70 72 6f 63 20 3a 3a  message..proc ::
2a80: 63 6d 64 6c 69 6e 65 3a 3a 75 73 61 67 65 20 7b  cmdline::usage {
2a90: 6f 70 74 6c 69 73 74 20 7b 75 73 61 67 65 20 7b  optlist {usage {
2aa0: 6f 70 74 69 6f 6e 73 3a 7d 7d 7d 20 7b 0a 20 20  options:}}} {.  
2ab0: 20 20 73 65 74 20 73 74 72 20 22 5b 67 65 74 41    set str "[getA
2ac0: 72 67 76 30 5d 20 24 75 73 61 67 65 5c 6e 22 0a  rgv0] $usage\n".
2ad0: 20 20 20 20 66 6f 72 65 61 63 68 20 6f 70 74 20      foreach opt 
2ae0: 5b 63 6f 6e 63 61 74 20 24 6f 70 74 6c 69 73 74  [concat $optlist
2af0: 20 5c 0a 09 20 20 20 20 20 7b 7b 2d 20 22 46 6f   \..     {{- "Fo
2b00: 72 63 69 62 6c 79 20 73 74 6f 70 20 6f 70 74 69  rcibly stop opti
2b10: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 22 7d 20  on processing"} 
2b20: 7b 68 65 6c 70 20 22 50 72 69 6e 74 20 74 68 69  {help "Print thi
2b30: 73 20 6d 65 73 73 61 67 65 22 7d 20 7b 3f 20 22  s message"} {? "
2b40: 50 72 69 6e 74 20 74 68 69 73 20 6d 65 73 73 61  Print this messa
2b50: 67 65 22 7d 7d 5d 20 7b 0a 09 73 65 74 20 6e 61  ge"}}] {..set na
2b60: 6d 65 20 5b 6c 69 6e 64 65 78 20 24 6f 70 74 20  me [lindex $opt 
2b70: 30 5d 0a 09 69 66 20 7b 5b 72 65 67 73 75 62 20  0]..if {[regsub 
2b80: 2d 2d 20 7b 5c 2e 73 65 63 72 65 74 24 7d 20 24  -- {\.secret$} $
2b90: 6e 61 6d 65 20 7b 7d 20 6e 61 6d 65 5d 20 3d 3d  name {} name] ==
2ba0: 20 31 7d 20 7b 0a 09 20 20 20 20 23 20 48 69 64   1} {..    # Hid
2bb0: 64 65 6e 20 6f 70 74 69 6f 6e 0a 09 20 20 20 20  den option..    
2bc0: 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 09 69 66 20  continue..}..if 
2bd0: 7b 5b 72 65 67 73 75 62 20 2d 2d 20 7b 5c 2e 61  {[regsub -- {\.a
2be0: 72 67 24 7d 20 24 6e 61 6d 65 20 7b 7d 20 6e 61  rg$} $name {} na
2bf0: 6d 65 5d 20 3d 3d 20 31 7d 20 7b 0a 09 20 20 20  me] == 1} {..   
2c00: 20 73 65 74 20 64 65 66 61 75 6c 74 20 5b 6c 69   set default [li
2c10: 6e 64 65 78 20 24 6f 70 74 20 31 5d 0a 09 20 20  ndex $opt 1]..  
2c20: 20 20 73 65 74 20 63 6f 6d 6d 65 6e 74 20 5b 6c    set comment [l
2c30: 69 6e 64 65 78 20 24 6f 70 74 20 32 5d 0a 09 20  index $opt 2].. 
2c40: 20 20 20 61 70 70 65 6e 64 20 73 74 72 20 5b 66     append str [f
2c50: 6f 72 6d 61 74 20 22 20 25 2d 32 30 73 20 25 73  ormat " %-20s %s
2c60: 20 3c 25 73 3e 5c 6e 22 20 22 2d 24 6e 61 6d 65   <%s>\n" "-$name
2c70: 20 76 61 6c 75 65 22 20 5c 0a 09 09 20 20 20 20   value" \...    
2c80: 24 63 6f 6d 6d 65 6e 74 20 24 64 65 66 61 75 6c  $comment $defaul
2c90: 74 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  t]..} else {..  
2ca0: 20 20 73 65 74 20 63 6f 6d 6d 65 6e 74 20 5b 6c    set comment [l
2cb0: 69 6e 64 65 78 20 24 6f 70 74 20 31 5d 0a 09 20  index $opt 1].. 
2cc0: 20 20 20 61 70 70 65 6e 64 20 73 74 72 20 5b 66     append str [f
2cd0: 6f 72 6d 61 74 20 22 20 25 2d 32 30 73 20 25 73  ormat " %-20s %s
2ce0: 5c 6e 22 20 22 2d 24 6e 61 6d 65 22 20 24 63 6f  \n" "-$name" $co
2cf0: 6d 6d 65 6e 74 5d 0a 09 7d 0a 20 20 20 20 7d 0a  mment]..}.    }.
2d00: 20 20 20 20 72 65 74 75 72 6e 20 24 73 74 72 0a      return $str.
2d10: 7d 0a 0a 23 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a  }..# ::cmdline::
2d20: 67 65 74 66 69 6c 65 73 20 2d 2d 0a 23 0a 23 09  getfiles --.#.#.
2d30: 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
2d40: 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66  file arguments f
2d50: 72 6f 6d 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rom the command 
2d60: 6c 69 6e 65 2c 20 63 6f 6d 70 75 74 65 0a 23 09  line, compute.#.
2d70: 74 68 65 20 73 65 74 20 6f 66 20 76 61 6c 69 64  the set of valid
2d80: 20 66 69 6c 65 73 2e 20 20 4f 6e 20 77 69 6e 64   files.  On wind
2d90: 6f 77 73 2c 20 66 69 6c 65 20 67 6c 6f 62 62 69  ows, file globbi
2da0: 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 0a  ng is performed.
2db0: 23 09 6f 6e 20 65 61 63 68 20 61 72 67 75 6d 65  #.on each argume
2dc0: 6e 74 2e 20 20 4f 6e 20 55 6e 69 78 2c 20 6f 6e  nt.  On Unix, on
2dd0: 6c 79 20 66 69 6c 65 20 65 78 69 73 74 65 6e 63  ly file existenc
2de0: 65 20 69 73 20 74 65 73 74 65 64 2e 20 20 49 66  e is tested.  If
2df0: 0a 23 09 61 20 66 69 6c 65 20 61 72 67 75 6d 65  .#.a file argume
2e00: 6e 74 20 70 72 6f 64 75 63 65 73 20 6e 6f 20 76  nt produces no v
2e10: 61 6c 69 64 20 66 69 6c 65 73 2c 20 61 20 77 61  alid files, a wa
2e20: 72 6e 69 6e 67 20 69 73 20 6f 70 74 69 6f 6e 61  rning is optiona
2e30: 6c 6c 79 0a 23 09 67 65 6e 65 72 61 74 65 64 2e  lly.#.generated.
2e40: 0a 23 0a 23 09 54 68 69 73 20 63 6f 64 65 20 61  .#.#.This code a
2e50: 6c 73 6f 20 75 73 65 73 20 74 68 65 20 66 75 6c  lso uses the ful
2e60: 6c 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20  l path for each 
2e70: 66 69 6c 65 2e 20 20 49 66 20 6e 6f 74 0a 23 09  file.  If not.#.
2e80: 67 69 76 65 6e 20 69 74 20 70 72 65 70 65 6e 64  given it prepend
2e90: 73 20 5b 70 77 64 5d 20 74 6f 20 74 68 65 20 66  s [pwd] to the f
2ea0: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 69 73 20 65  ilename.  This e
2eb0: 6e 73 75 72 65 73 20 74 68 61 74 0a 23 09 74 68  nsures that.#.th
2ec0: 65 73 65 20 66 69 6c 65 73 20 77 69 6c 6c 20 6e  ese files will n
2ed0: 65 76 65 72 20 63 6f 6e 66 6c 69 63 74 20 77 69  ever conflict wi
2ee0: 74 68 20 66 69 6c 65 73 20 69 6e 20 6f 75 72 20  th files in our 
2ef0: 7a 69 70 20 66 69 6c 65 2e 0a 23 0a 23 20 41 72  zip file..#.# Ar
2f00: 67 75 6d 65 6e 74 73 3a 0a 23 09 70 61 74 74 65  guments:.#.patte
2f10: 72 6e 73 09 54 68 65 20 66 69 6c 65 20 70 61 74  rns.The file pat
2f20: 74 65 72 6e 73 20 73 70 65 63 69 66 69 65 64 20  terns specified 
2f30: 62 79 20 74 68 65 20 75 73 65 72 2e 0a 23 09 71  by the user..#.q
2f40: 75 69 65 74 09 09 49 66 20 74 68 69 73 20 66 6c  uiet..If this fl
2f50: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 77 61  ag is set, no wa
2f60: 72 6e 69 6e 67 73 20 77 69 6c 6c 20 62 65 20 67  rnings will be g
2f70: 65 6e 65 72 61 74 65 64 2e 0a 23 0a 23 20 52 65  enerated..#.# Re
2f80: 73 75 6c 74 73 3a 0a 23 09 52 65 74 75 72 6e 73  sults:.#.Returns
2f90: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 69 6c   the list of fil
2fa0: 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  es that match th
2fb0: 65 20 69 6e 70 75 74 20 70 61 74 74 65 72 6e 73  e input patterns
2fc0: 2e 0a 0a 70 72 6f 63 20 3a 3a 63 6d 64 6c 69 6e  ...proc ::cmdlin
2fd0: 65 3a 3a 67 65 74 66 69 6c 65 73 20 7b 70 61 74  e::getfiles {pat
2fe0: 74 65 72 6e 73 20 71 75 69 65 74 7d 20 7b 0a 20  terns quiet} {. 
2ff0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 7b 7d     set result {}
3000: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f  .    if {$::tcl_
3010: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
3020: 6d 29 20 3d 3d 20 22 77 69 6e 64 6f 77 73 22 7d  m) == "windows"}
3030: 20 7b 0a 09 66 6f 72 65 61 63 68 20 70 61 74 74   {..foreach patt
3040: 65 72 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0a  ern $patterns {.
3050: 09 20 20 20 20 73 65 74 20 70 61 74 20 5b 66 69  .    set pat [fi
3060: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 74 65 72 6e  le join $pattern
3070: 5d 0a 09 20 20 20 20 73 65 74 20 66 69 6c 65 73  ]..    set files
3080: 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61   [glob -nocompla
3090: 69 6e 20 2d 2d 20 24 70 61 74 5d 0a 09 20 20 20  in -- $pat]..   
30a0: 20 69 66 20 7b 24 66 69 6c 65 73 20 3d 3d 20 7b   if {$files == {
30b0: 7d 7d 20 7b 0a 09 09 69 66 20 7b 21 20 24 71 75  }} {...if {! $qu
30c0: 69 65 74 7d 20 7b 0a 09 09 20 20 20 20 70 75 74  iet} {...    put
30d0: 73 20 73 74 64 6f 75 74 20 22 77 61 72 6e 69 6e  s stdout "warnin
30e0: 67 3a 20 6e 6f 20 66 69 6c 65 73 20 6d 61 74 63  g: no files matc
30f0: 68 20 5c 22 24 70 61 74 74 65 72 6e 5c 22 22 0a  h \"$pattern\"".
3100: 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  ..}..    } else 
3110: 7b 0a 09 09 66 6f 72 65 61 63 68 20 66 69 6c 65  {...foreach file
3120: 20 24 66 69 6c 65 73 20 7b 0a 09 09 20 20 20 20   $files {...    
3130: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
3140: 66 69 6c 65 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  file...}..    }.
3150: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
3160: 09 73 65 74 20 72 65 73 75 6c 74 20 24 70 61 74  .set result $pat
3170: 74 65 72 6e 73 0a 20 20 20 20 7d 0a 20 20 20 20  terns.    }.    
3180: 73 65 74 20 66 69 6c 65 73 20 7b 7d 0a 20 20 20  set files {}.   
3190: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 20 24 72   foreach file $r
31a0: 65 73 75 6c 74 20 7b 0a 09 23 20 4d 61 6b 65 20  esult {..# Make 
31b0: 66 69 6c 65 20 61 6e 20 61 62 73 6f 6c 75 74 65  file an absolute
31c0: 20 70 61 74 68 20 73 6f 20 74 68 61 74 20 77 65   path so that we
31d0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 63 6f 6e 66   will never conf
31e0: 6c 69 63 74 0a 09 23 20 77 69 74 68 20 66 69 6c  lict..# with fil
31f0: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  es that might be
3200: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6f 75   contained in ou
3210: 72 20 7a 69 70 20 66 69 6c 65 2e 0a 09 73 65 74  r zip file...set
3220: 20 66 75 6c 6c 50 61 74 68 20 5b 66 69 6c 65 20   fullPath [file 
3230: 6a 6f 69 6e 20 5b 70 77 64 5d 20 24 66 69 6c 65  join [pwd] $file
3240: 5d 0a 09 0a 09 69 66 20 7b 5b 66 69 6c 65 20 69  ]....if {[file i
3250: 73 66 69 6c 65 20 24 66 75 6c 6c 50 61 74 68 5d  sfile $fullPath]
3260: 7d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  } {..    lappend
3270: 20 66 69 6c 65 73 20 24 66 75 6c 6c 50 61 74 68   files $fullPath
3280: 0a 09 7d 20 65 6c 73 65 69 66 20 7b 21 20 24 71  ..} elseif {! $q
3290: 75 69 65 74 7d 20 7b 0a 09 20 20 20 20 70 75 74  uiet} {..    put
32a0: 73 20 73 74 64 6f 75 74 20 22 77 61 72 6e 69 6e  s stdout "warnin
32b0: 67 3a 20 6e 6f 20 66 69 6c 65 73 20 6d 61 74 63  g: no files matc
32c0: 68 20 5c 22 24 66 69 6c 65 5c 22 22 0a 09 7d 0a  h \"$file\""..}.
32d0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
32e0: 20 24 66 69 6c 65 73 0a 7d 0a 0a 23 20 3a 3a 63   $files.}..# ::c
32f0: 6d 64 6c 69 6e 65 3a 3a 67 65 74 41 72 67 76 30  mdline::getArgv0
3300: 20 2d 2d 0a 23 0a 23 09 54 68 69 73 20 63 6f 6d   --.#.#.This com
3310: 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65  mand returns the
3320: 20 22 73 61 6e 69 74 69 7a 65 64 22 20 76 65 72   "sanitized" ver
3330: 73 69 6f 6e 20 6f 66 20 61 72 67 76 30 2e 20 20  sion of argv0.  
3340: 49 74 20 77 69 6c 6c 20 73 74 72 69 70 0a 23 09  It will strip.#.
3350: 6f 66 66 20 74 68 65 20 6c 65 61 64 69 6e 67 20  off the leading 
3360: 70 61 74 68 20 61 6e 64 20 72 65 6d 6f 76 65 20  path and remove 
3370: 74 68 65 20 22 2e 62 69 6e 22 20 65 78 74 65 6e  the ".bin" exten
3380: 73 69 6f 6e 73 20 74 68 61 74 20 6f 75 72 20 61  sions that our a
3390: 70 70 73 0a 23 09 75 73 65 20 62 65 63 61 75 73  pps.#.use becaus
33a0: 65 20 74 68 65 79 20 6d 75 73 74 20 62 65 20 77  e they must be w
33b0: 72 61 70 70 65 64 20 62 79 20 61 20 73 68 65 6c  rapped by a shel
33c0: 6c 20 73 63 72 69 70 74 2e 0a 23 0a 23 20 41 72  l script..#.# Ar
33d0: 67 75 6d 65 6e 74 73 3a 0a 23 09 4e 6f 6e 65 2e  guments:.#.None.
33e0: 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09  .#.# Results:.#.
33f0: 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  The application 
3400: 6e 61 6d 65 20 74 68 61 74 20 63 61 6e 20 62 65  name that can be
3410: 20 75 73 65 64 20 69 6e 20 65 72 72 6f 72 20 6d   used in error m
3420: 65 73 73 61 67 65 73 2e 0a 0a 70 72 6f 63 20 3a  essages...proc :
3430: 3a 63 6d 64 6c 69 6e 65 3a 3a 67 65 74 41 72 67  :cmdline::getArg
3440: 76 30 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62  v0 {} {.    glob
3450: 61 6c 20 61 72 67 76 30 0a 0a 20 20 20 20 73 65  al argv0..    se
3460: 74 20 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  t name [file tai
3470: 6c 20 24 61 72 67 76 30 5d 0a 20 20 20 20 72 65  l $argv0].    re
3480: 74 75 72 6e 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  turn [file rootn
3490: 61 6d 65 20 24 6e 61 6d 65 5d 0a 7d 0a 0a 23 23  ame $name].}..##
34a0: 0a 23 20 23 23 23 20 23 23 23 20 23 23 23 20 23  .# ### ### ### #
34b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
34c0: 23 23 20 23 23 23 23 23 23 23 23 23 0a 23 23 0a  ## #########.##.
34d0: 23 20 4e 6f 77 20 74 68 65 20 74 79 70 65 64 20  # Now the typed 
34e0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
34f0: 61 62 6f 76 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a  above commands..
3500: 23 23 0a 23 20 23 23 23 20 23 23 23 20 23 23 23  ##.# ### ### ###
3510: 20 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23   ######### #####
3520: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 0a 23  #### #########.#
3530: 23 0a 0a 23 20 74 79 70 65 64 43 6d 64 6c 69 6e  #..# typedCmdlin
3540: 65 2e 74 63 6c 20 2d 2d 0a 23 0a 23 20 20 20 20  e.tcl --.#.#    
3550: 54 68 69 73 20 70 61 63 6b 61 67 65 20 70 72 6f  This package pro
3560: 76 69 64 65 73 20 61 20 75 74 69 6c 69 74 79 20  vides a utility 
3570: 66 6f 72 20 70 61 72 73 69 6e 67 20 74 79 70 65  for parsing type
3580: 64 20 63 6f 6d 6d 61 6e 64 0a 23 20 20 20 20 6c  d command.#    l
3590: 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ine arguments th
35a0: 61 74 20 6d 61 79 20 62 65 20 70 72 6f 63 65 73  at may be proces
35b0: 73 65 64 20 62 79 20 76 61 72 69 6f 75 73 20 61  sed by various a
35c0: 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 23 0a 23  pplications..#.#
35d0: 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32   Copyright (c) 2
35e0: 30 30 30 20 62 79 20 52 6f 73 73 20 50 61 6c 6d  000 by Ross Palm
35f0: 65 72 20 4d 6f 68 6e 2e 0a 23 20 53 65 65 20 74  er Mohn..# See t
3600: 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65  he file "license
3610: 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f  .terms" for info
3620: 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65  rmation on usage
3630: 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74   and redistribut
3640: 69 6f 6e 0a 23 20 6f 66 20 74 68 69 73 20 66 69  ion.# of this fi
3650: 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49  le, and for a DI
3660: 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20  SCLAIMER OF ALL 
3670: 57 41 52 52 41 4e 54 49 45 53 2e 0a 23 20 0a 23  WARRANTIES..# .#
3680: 20 52 43 53 3a 20 40 28 23 29 20 24 49 64 3a 20   RCS: @(#) $Id: 
3690: 63 6d 64 6c 69 6e 65 2e 74 63 6c 2c 76 20 31 2e  cmdline.tcl,v 1.
36a0: 32 38 20 32 30 31 31 2f 30 32 2f 32 33 20 31 37  28 2011/02/23 17
36b0: 3a 34 31 3a 35 32 20 61 6e 64 72 65 61 73 5f 6b  :41:52 andreas_k
36c0: 75 70 72 69 65 73 20 45 78 70 20 24 0a 0a 6e 61  upries Exp $..na
36d0: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63  mespace eval ::c
36e0: 6d 64 6c 69 6e 65 20 7b 0a 20 20 20 20 6e 61 6d  mdline {.    nam
36f0: 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 74 79  espace export ty
3700: 70 65 64 47 65 74 6f 70 74 20 74 79 70 65 64 47  pedGetopt typedG
3710: 65 74 6f 70 74 69 6f 6e 73 20 74 79 70 65 64 55  etoptions typedU
3720: 73 61 67 65 0a 0a 20 20 20 20 23 20 76 61 72 69  sage..    # vari
3730: 61 62 6c 65 20 63 6d 64 6c 69 6e 65 3a 3a 63 68  able cmdline::ch
3740: 61 72 63 6c 61 73 73 65 73 20 2d 2d 0a 20 20 20  arclasses --.   
3750: 20 23 0a 20 20 20 20 23 20 20 20 20 43 72 65 61   #.    #    Crea
3760: 74 65 20 72 65 67 65 78 70 20 6c 69 73 74 20 6f  te regexp list o
3770: 66 20 61 6c 6c 6f 77 61 62 6c 65 20 63 68 61 72  f allowable char
3780: 61 63 74 65 72 20 63 6c 61 73 73 65 73 0a 20 20  acter classes.  
3790: 20 20 23 20 20 20 20 66 72 6f 6d 20 22 73 74 72    #    from "str
37a0: 69 6e 67 20 69 73 22 20 65 72 72 6f 72 20 6d 65  ing is" error me
37b0: 73 73 61 67 65 2e 0a 20 20 20 20 23 0a 20 20 20  ssage..    #.   
37c0: 20 23 20 52 65 73 75 6c 74 73 3a 0a 20 20 20 20   # Results:.    
37d0: 23 20 20 20 20 53 74 72 69 6e 67 20 6f 66 20 63  #    String of c
37e0: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e  haracter class n
37f0: 61 6d 65 73 20 73 65 70 61 72 61 74 65 64 20 62  ames separated b
3800: 79 20 22 7c 22 20 63 68 61 72 61 63 74 65 72 73  y "|" characters
3810: 2e 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  ...    variable 
3820: 63 68 61 72 63 6c 61 73 73 65 73 0a 20 20 20 20  charclasses.    
3830: 23 63 68 65 63 6b 65 72 20 65 78 63 6c 75 64 65  #checker exclude
3840: 20 62 61 64 4b 65 79 0a 20 20 20 20 63 61 74 63   badKey.    catc
3850: 68 20 7b 73 74 72 69 6e 67 20 69 73 20 2e 20 2e  h {string is . .
3860: 7d 20 63 68 61 72 63 6c 61 73 73 65 73 0a 20 20  } charclasses.  
3870: 20 20 76 61 72 69 61 62 6c 65 20 64 75 6d 6d 79    variable dummy
3880: 0a 20 20 20 20 72 65 67 65 78 70 20 20 20 20 20  .    regexp     
3890: 20 2d 2d 20 7b 6d 75 73 74 20 62 65 20 28 2e 2b   -- {must be (.+
38a0: 29 24 7d 20 24 63 68 61 72 63 6c 61 73 73 65 73  )$} $charclasses
38b0: 20 64 75 6d 6d 79 20 63 68 61 72 63 6c 61 73 73   dummy charclass
38c0: 65 73 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  es.    regsub -a
38d0: 6c 6c 20 2d 2d 20 7b 2c 20 28 6f 72 20 29 3f 7d  ll -- {, (or )?}
38e0: 20 20 20 20 20 20 24 63 68 61 72 63 6c 61 73 73        $charclass
38f0: 65 73 20 7b 7c 7d 20 20 20 63 68 61 72 63 6c 61  es {|}   charcla
3900: 73 73 65 73 0a 20 20 20 20 75 6e 73 65 74 20 64  sses.    unset d
3910: 75 6d 6d 79 0a 7d 0a 0a 23 20 3a 3a 63 6d 64 6c  ummy.}..# ::cmdl
3920: 69 6e 65 3a 3a 74 79 70 65 64 47 65 74 6f 70 74  ine::typedGetopt
3930: 20 2d 2d 0a 23 0a 23 09 54 68 65 20 63 6d 64 6c   --.#.#.The cmdl
3940: 69 6e 65 3a 3a 74 79 70 65 64 47 65 74 6f 70 74  ine::typedGetopt
3950: 20 77 6f 72 6b 73 20 69 6e 20 61 20 66 61 73 68   works in a fash
3960: 69 6f 6e 20 6c 69 6b 65 20 74 68 65 20 73 74 61  ion like the sta
3970: 6e 64 61 72 64 0a 23 09 43 20 62 61 73 65 64 20  ndard.#.C based 
3980: 67 65 74 6f 70 74 20 66 75 6e 63 74 69 6f 6e 2e  getopt function.
3990: 20 20 47 69 76 65 6e 20 61 6e 20 6f 70 74 69 6f    Given an optio
39a0: 6e 20 73 74 72 69 6e 67 20 61 6e 64 20 61 0a 23  n string and a.#
39b0: 09 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6c 69  .pointer to a li
39c0: 73 74 20 6f 66 20 61 72 67 73 20 74 68 69 73 20  st of args this 
39d0: 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20 70 72 6f  command will pro
39e0: 63 65 73 73 20 74 68 65 0a 23 09 66 69 72 73 74  cess the.#.first
39f0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65   argument and re
3a00: 74 75 72 6e 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  turn info on how
3a10: 20 74 6f 20 70 72 6f 63 65 65 64 2e 20 49 6e 20   to proceed. In 
3a20: 61 64 64 69 74 69 6f 6e 2c 0a 23 09 79 6f 75 20  addition,.#.you 
3a30: 6d 61 79 20 73 70 65 63 69 66 79 20 61 20 74 79  may specify a ty
3a40: 70 65 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d  pe for the argum
3a50: 65 6e 74 20 74 6f 20 65 61 63 68 20 6f 70 74 69  ent to each opti
3a60: 6f 6e 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74  on..#.# Argument
3a70: 73 3a 0a 23 09 61 72 67 76 56 61 72 09 09 4e 61  s:.#.argvVar..Na
3a80: 6d 65 20 6f 66 20 74 68 65 20 61 72 67 76 20 6c  me of the argv l
3a90: 69 73 74 20 74 68 61 74 20 79 6f 75 20 77 61 6e  ist that you wan
3aa0: 74 20 74 6f 20 70 72 6f 63 65 73 73 2e 0a 23 09  t to process..#.
3ab0: 09 09 49 66 20 6f 70 74 69 6f 6e 73 20 61 72 65  ..If options are
3ac0: 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 72 67 20   found, the arg 
3ad0: 6c 69 73 74 20 69 73 20 6d 6f 64 69 66 69 65 64  list is modified
3ae0: 0a 23 09 09 09 61 6e 64 20 74 68 65 20 70 72 6f  .#...and the pro
3af0: 63 65 73 73 65 64 20 61 72 67 75 6d 65 6e 74 73  cessed arguments
3b00: 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f   are removed fro
3b10: 6d 20 74 68 65 0a 23 09 09 09 73 74 61 72 74 20  m the.#...start 
3b20: 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 23 0a 23  of the list..#.#
3b30: 09 6f 70 74 73 74 72 69 6e 67 09 41 20 6c 69 73  .optstring.A lis
3b40: 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 6f 70 74  t of command opt
3b50: 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 61 70  ions that the ap
3b60: 70 6c 69 63 61 74 69 6f 6e 0a 23 09 09 09 77 69  plication.#...wi
3b70: 6c 6c 20 61 63 63 65 70 74 2e 20 20 49 66 20 74  ll accept.  If t
3b80: 68 65 20 6f 70 74 69 6f 6e 20 65 6e 64 73 20 69  he option ends i
3b90: 6e 20 22 2e 78 78 78 22 2c 20 77 68 65 72 65 0a  n ".xxx", where.
3ba0: 23 09 09 09 78 78 78 20 69 73 20 61 6e 79 20 76  #...xxx is any v
3bb0: 61 6c 69 64 20 63 68 61 72 61 63 74 65 72 20 63  alid character c
3bc0: 6c 61 73 73 20 74 6f 20 74 68 65 20 74 63 6c 0a  lass to the tcl.
3bd0: 23 09 09 09 63 6f 6d 6d 61 6e 64 20 22 73 74 72  #...command "str
3be0: 69 6e 67 20 69 73 22 2c 20 74 68 65 6e 20 74 79  ing is", then ty
3bf0: 70 65 64 47 65 74 6f 70 74 20 72 6f 75 74 69 6e  pedGetopt routin
3c00: 65 20 77 69 6c 6c 0a 23 09 09 09 75 73 65 20 74  e will.#...use t
3c10: 68 65 20 6e 65 78 74 20 61 72 67 75 6d 65 6e 74  he next argument
3c20: 20 61 73 20 61 20 74 79 70 65 64 20 61 72 67 75   as a typed argu
3c30: 6d 65 6e 74 20 74 6f 20 74 68 65 0a 23 09 09 09  ment to the.#...
3c40: 6f 70 74 69 6f 6e 2e 20 54 68 65 20 61 72 67 75  option. The argu
3c50: 6d 65 6e 74 20 6d 75 73 74 20 6d 61 74 63 68 20  ment must match 
3c60: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 23 09  the specified.#.
3c70: 09 09 63 68 61 72 61 63 74 65 72 20 63 6c 61 73  ..character clas
3c80: 73 65 73 20 28 65 2e 67 2e 20 69 6e 74 65 67 65  ses (e.g. intege
3c90: 72 2c 20 64 6f 75 62 6c 65 2c 20 62 6f 6f 6c 65  r, double, boole
3ca0: 61 6e 2c 0a 23 09 09 09 78 64 69 67 69 74 2c 20  an,.#...xdigit, 
3cb0: 65 74 63 2e 29 2e 20 41 6c 74 65 72 6e 61 74 69  etc.). Alternati
3cc0: 76 65 6c 79 2c 20 79 6f 75 20 6d 61 79 20 73 70  vely, you may sp
3cd0: 65 63 69 66 79 0a 23 09 09 09 22 2e 61 72 67 22  ecify.#...".arg"
3ce0: 20 66 6f 72 20 61 6e 20 75 6e 74 79 70 65 64 20   for an untyped 
3cf0: 61 72 67 75 6d 65 6e 74 2e 0a 23 0a 23 09 6f 70  argument..#.#.op
3d00: 74 56 61 72 09 09 55 70 6f 6e 20 73 75 63 63 65  tVar..Upon succe
3d10: 73 73 2c 20 74 68 65 20 76 61 72 69 61 62 6c 65  ss, the variable
3d20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
3d30: 70 74 56 61 72 0a 23 09 09 09 63 6f 6e 74 61 69  ptVar.#...contai
3d40: 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 68  ns the option th
3d50: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 28 77 69  at was found (wi
3d60: 74 68 6f 75 74 20 74 68 65 0a 23 09 09 09 6c 65  thout the.#...le
3d70: 61 64 69 6e 67 20 27 2d 27 20 61 6e 64 20 77 69  ading '-' and wi
3d80: 74 68 6f 75 74 20 74 68 65 20 2e 78 78 78 20 65  thout the .xxx e
3d90: 78 74 65 6e 73 69 6f 6e 29 2e 20 20 49 66 0a 23  xtension).  If.#
3da0: 09 09 09 74 79 70 65 64 47 65 74 6f 70 74 20 66  ...typedGetopt f
3db0: 61 69 6c 73 20 74 68 65 20 76 61 72 69 61 62 6c  ails the variabl
3dc0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
3dd0: 65 6d 70 74 79 0a 23 09 09 09 73 74 72 69 6e 67  empty.#...string
3de0: 2e 20 53 4f 4d 45 54 49 4d 45 53 21 20 44 69 66  . SOMETIMES! Dif
3df0: 66 65 72 65 6e 74 20 66 6f 72 20 65 61 63 68 20  ferent for each 
3e00: 2d 76 61 6c 75 65 21 0a 23 0a 23 09 61 72 67 56  -value!.#.#.argV
3e10: 61 72 09 09 55 70 6f 6e 20 73 75 63 63 65 73 73  ar..Upon success
3e20: 2c 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 70  , the variable p
3e30: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
3e40: 56 61 72 0a 23 09 09 09 63 6f 6e 74 61 69 6e 73  Var.#...contains
3e50: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 66 6f   the argument fo
3e60: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
3e70: 6f 70 74 69 6f 6e 2e 0a 23 09 09 09 49 66 20 74  option..#...If t
3e80: 79 70 65 64 47 65 74 6f 70 74 20 66 61 69 6c 73  ypedGetopt fails
3e90: 2c 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  , the variable i
3ea0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 0a 23 09  s filled with.#.
3eb0: 09 09 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  ..an error messa
3ec0: 67 65 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74  ge..#.# Argument
3ed0: 20 74 79 70 65 20 73 79 6e 74 61 78 3a 0a 23 09   type syntax:.#.
3ee0: 4f 70 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65  Option that take
3ef0: 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 2e 0a 23  s no argument..#
3f00: 09 09 66 6f 6f 0a 23 0a 23 09 4f 70 74 69 6f 6e  ..foo.#.#.Option
3f10: 20 74 68 61 74 20 74 61 6b 65 73 20 61 20 74 79   that takes a ty
3f20: 70 65 6c 65 73 73 20 61 72 67 75 6d 65 6e 74 2e  peless argument.
3f30: 0a 23 09 09 66 6f 6f 2e 61 72 67 0a 23 0a 23 09  .#..foo.arg.#.#.
3f40: 4f 70 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65  Option that take
3f50: 73 20 61 20 74 79 70 65 64 20 61 72 67 75 6d 65  s a typed argume
3f60: 6e 74 2e 20 41 6c 6c 6f 77 61 62 6c 65 20 74 79  nt. Allowable ty
3f70: 70 65 73 20 61 72 65 20 61 6c 6c 0a 23 09 76 61  pes are all.#.va
3f80: 6c 69 64 20 63 68 61 72 61 63 74 65 72 20 63 6c  lid character cl
3f90: 61 73 73 65 73 20 74 6f 20 74 68 65 20 74 63 6c  asses to the tcl
3fa0: 20 63 6f 6d 6d 61 6e 64 20 22 73 74 72 69 6e 67   command "string
3fb0: 20 69 73 22 2e 0a 23 09 43 75 72 72 65 6e 74 6c   is"..#.Currentl
3fc0: 79 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  y must be one of
3fd0: 20 61 6c 6e 75 6d 2c 20 61 6c 70 68 61 2c 20 61   alnum, alpha, a
3fe0: 73 63 69 69 2c 20 63 6f 6e 74 72 6f 6c 2c 0a 23  scii, control,.#
3ff0: 09 62 6f 6f 6c 65 61 6e 2c 20 64 69 67 69 74 2c  .boolean, digit,
4000: 20 64 6f 75 62 6c 65 2c 20 66 61 6c 73 65 2c 20   double, false, 
4010: 67 72 61 70 68 2c 20 69 6e 74 65 67 65 72 2c 20  graph, integer, 
4020: 6c 6f 77 65 72 2c 20 70 72 69 6e 74 2c 0a 23 09  lower, print,.#.
4030: 70 75 6e 63 74 2c 20 73 70 61 63 65 2c 20 74 72  punct, space, tr
4040: 75 65 2c 20 75 70 70 65 72 2c 20 77 6f 72 64 63  ue, upper, wordc
4050: 68 61 72 2c 20 6f 72 20 78 64 69 67 69 74 2e 0a  har, or xdigit..
4060: 23 09 09 66 6f 6f 2e 64 6f 75 62 6c 65 0a 23 0a  #..foo.double.#.
4070: 23 09 4f 70 74 69 6f 6e 20 74 68 61 74 20 74 61  #.Option that ta
4080: 6b 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  kes an argument 
4090: 66 72 6f 6d 20 61 20 6c 69 73 74 2e 0a 23 09 09  from a list..#..
40a0: 66 6f 6f 2e 28 62 61 72 7c 62 6c 61 74 29 0a 23  foo.(bar|blat).#
40b0: 0a 23 20 41 72 67 75 6d 65 6e 74 20 71 75 61 6e  .# Argument quan
40c0: 74 69 66 69 65 72 20 73 79 6e 74 61 78 3a 0a 23  tifier syntax:.#
40d0: 09 4f 70 74 69 6f 6e 20 74 68 61 74 20 74 61 6b  .Option that tak
40e0: 65 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 61  es an optional a
40f0: 72 67 75 6d 65 6e 74 2e 0a 23 09 09 66 6f 6f 2e  rgument..#..foo.
4100: 61 72 67 3f 0a 23 0a 23 09 4f 70 74 69 6f 6e 20  arg?.#.#.Option 
4110: 74 68 61 74 20 74 61 6b 65 73 20 61 20 6c 69 73  that takes a lis
4120: 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  t of arguments t
4130: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 2d 2d  erminated by "--
4140: 22 2e 0a 23 09 09 66 6f 6f 2e 61 72 67 2b 0a 23  "..#..foo.arg+.#
4150: 0a 23 09 4f 70 74 69 6f 6e 20 74 68 61 74 20 74  .#.Option that t
4160: 61 6b 65 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  akes an optional
4170: 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
4180: 74 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ts terminated by
4190: 20 22 2d 2d 22 2e 0a 23 09 09 66 6f 6f 2e 61 72   "--"..#..foo.ar
41a0: 67 2a 0a 23 0a 23 09 41 72 67 75 6d 65 6e 74 20  g*.#.#.Argument 
41b0: 71 75 61 6e 74 69 66 69 65 72 73 20 77 6f 72 6b  quantifiers work
41c0: 20 6f 6e 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74   on all argument
41d0: 20 74 79 70 65 73 2c 20 73 6f 2c 20 66 6f 72 0a   types, so, for.
41e0: 23 09 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66  #.example, the f
41f0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 76 61  ollowing is a va
4200: 6c 69 64 20 6f 70 74 69 6f 6e 20 73 70 65 63 69  lid option speci
4210: 66 69 63 61 74 69 6f 6e 2e 0a 23 09 09 66 6f 6f  fication..#..foo
4220: 2e 28 62 61 72 7c 62 6c 61 74 7c 62 6c 61 68 29  .(bar|blat|blah)
4230: 3f 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 20 73  ?.#.# Argument s
4240: 79 6e 74 61 78 20 6d 69 73 63 65 6c 6c 61 6e 79  yntax miscellany
4250: 3a 0a 23 09 4f 70 74 69 6f 6e 73 20 6d 61 79 20  :.#.Options may 
4260: 62 65 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20  be specified on 
4270: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
4280: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 2c   using a unique,
4290: 0a 23 09 73 68 6f 72 74 65 6e 65 64 20 76 65 72  .#.shortened ver
42a0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 74 69  sion of the opti
42b0: 6f 6e 20 6e 61 6d 65 2e 20 47 69 76 65 6e 20 74  on name. Given t
42c0: 68 61 74 20 70 72 6f 67 72 61 6d 20 66 6f 6f 0a  hat program foo.
42d0: 23 09 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 20  #.has an option 
42e0: 6c 69 73 74 20 6f 66 20 7b 62 61 72 2e 61 6c 70  list of {bar.alp
42f0: 68 61 20 62 6c 61 68 2e 61 72 67 20 62 6c 61 74  ha blah.arg blat
4300: 2e 64 6f 75 62 6c 65 7d 2c 0a 23 09 22 66 6f 6f  .double},.#."foo
4310: 20 2d 62 20 66 6f 62 22 20 72 65 74 75 72 6e 73   -b fob" returns
4320: 20 61 6e 20 65 72 72 6f 72 2c 20 62 75 74 20 22   an error, but "
4330: 66 6f 6f 20 2d 62 61 20 66 6f 62 22 0a 23 09 73  foo -ba fob".#.s
4340: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 74 75  uccessfully retu
4350: 72 6e 73 20 7b 62 61 72 20 66 6f 62 7d 0a 23 0a  rns {bar fob}.#.
4360: 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 54 68 65  # Results:.#.The
4370: 20 74 79 70 65 64 47 65 74 6f 70 74 20 66 75 6e   typedGetopt fun
4380: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6f 6e  ction returns on
4390: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
43a0: 6e 67 3a 0a 23 09 20 31 09 61 20 76 61 6c 69 64  ng:.#. 1.a valid
43b0: 20 6f 70 74 69 6f 6e 20 77 61 73 20 66 6f 75 6e   option was foun
43c0: 64 0a 23 09 20 30 09 6e 6f 20 6d 6f 72 65 20 6f  d.#. 0.no more o
43d0: 70 74 69 6f 6e 73 20 66 6f 75 6e 64 20 74 6f 20  ptions found to 
43e0: 70 72 6f 63 65 73 73 0a 23 09 2d 31 09 69 6e 76  process.#.-1.inv
43f0: 61 6c 69 64 20 6f 70 74 69 6f 6e 0a 23 09 2d 32  alid option.#.-2
4400: 09 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  .missing argumen
4410: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 70 74  t to a valid opt
4420: 69 6f 6e 0a 23 09 2d 33 09 61 72 67 75 6d 65 6e  ion.#.-3.argumen
4430: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 70 74  t to a valid opt
4440: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
4450: 63 68 20 74 79 70 65 0a 23 0a 23 20 4b 6e 6f 77  ch type.#.# Know
4460: 6e 20 42 75 67 73 3a 0a 23 09 57 68 65 6e 20 75  n Bugs:.#.When u
4470: 73 69 6e 67 20 6f 70 74 69 6f 6e 73 20 77 68 69  sing options whi
4480: 63 68 20 69 6e 63 6c 75 64 65 20 73 70 65 63 69  ch include speci
4490: 61 6c 20 67 6c 6f 62 20 63 68 61 72 61 63 74 65  al glob characte
44a0: 72 73 2c 0a 23 09 79 6f 75 20 6d 75 73 74 20 75  rs,.#.you must u
44b0: 73 65 20 74 68 65 20 65 78 61 63 74 20 6f 70 74  se the exact opt
44c0: 69 6f 6e 2e 20 41 62 62 72 65 76 69 61 74 69 6e  ion. Abbreviatin
44d0: 67 20 69 74 20 63 61 6e 20 63 61 75 73 65 0a 23  g it can cause.#
44e0: 09 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65  .an error in the
44f0: 20 22 63 6d 64 6c 69 6e 65 3a 3a 70 72 65 66 69   "cmdline::prefi
4500: 78 53 65 61 72 63 68 22 20 70 72 6f 63 65 64 75  xSearch" procedu
4510: 72 65 2e 0a 0a 70 72 6f 63 20 3a 3a 63 6d 64 6c  re...proc ::cmdl
4520: 69 6e 65 3a 3a 74 79 70 65 64 47 65 74 6f 70 74  ine::typedGetopt
4530: 20 7b 61 72 67 76 56 61 72 20 6f 70 74 73 74 72   {argvVar optstr
4540: 69 6e 67 20 6f 70 74 56 61 72 20 61 72 67 56 61  ing optVar argVa
4550: 72 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  r} {.    variabl
4560: 65 20 63 68 61 72 63 6c 61 73 73 65 73 0a 0a 20  e charclasses.. 
4570: 20 20 20 75 70 76 61 72 20 24 61 72 67 76 56 61     upvar $argvVa
4580: 72 20 61 72 67 73 4c 69 73 74 0a 0a 20 20 20 20  r argsList..    
4590: 75 70 76 61 72 20 24 6f 70 74 56 61 72 20 72 65  upvar $optVar re
45a0: 74 76 61 72 0a 20 20 20 20 75 70 76 61 72 20 24  tvar.    upvar $
45b0: 61 72 67 56 61 72 20 6f 70 74 61 72 67 0a 0a 20  argVar optarg.. 
45c0: 20 20 20 23 20 64 65 66 61 75 6c 74 20 73 65 74     # default set
45d0: 74 69 6e 67 73 20 66 6f 72 20 61 20 6e 6f 72 6d  tings for a norm
45e0: 61 6c 20 72 65 74 75 72 6e 0a 20 20 20 20 73 65  al return.    se
45f0: 74 20 6f 70 74 61 72 67 20 22 22 0a 20 20 20 20  t optarg "".    
4600: 73 65 74 20 72 65 74 76 61 72 20 22 22 0a 20 20  set retvar "".  
4610: 20 20 73 65 74 20 72 65 74 76 61 6c 20 30 0a 0a    set retval 0..
4620: 20 20 20 20 23 20 63 68 65 63 6b 20 69 66 20 77      # check if w
4630: 65 27 72 65 20 70 61 73 74 20 74 68 65 20 65 6e  e're past the en
4640: 64 20 6f 66 20 74 68 65 20 61 72 67 73 20 6c 69  d of the args li
4650: 73 74 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  st.    if {[llen
4660: 67 74 68 20 24 61 72 67 73 4c 69 73 74 5d 20 21  gth $argsList] !
4670: 3d 20 30 7d 20 7b 0a 0a 20 20 20 20 20 20 20 20  = 0} {..        
4680: 23 20 69 66 20 77 65 20 67 6f 74 20 2d 2d 20 6f  # if we got -- o
4690: 72 20 61 6e 20 6f 70 74 69 6f 6e 20 74 68 61 74  r an option that
46a0: 20 64 6f 65 73 6e 27 74 20 62 65 67 69 6e 20 77   doesn't begin w
46b0: 69 74 68 20 2d 2c 20 72 65 74 75 72 6e 20 28 73  ith -, return (s
46c0: 6b 69 70 70 69 6e 67 0a 20 20 20 20 20 20 20 20  kipping.        
46d0: 23 20 74 68 65 20 2d 2d 29 2e 20 20 6f 74 68 65  # the --).  othe
46e0: 72 77 69 73 65 20 70 72 6f 63 65 73 73 20 74 68  rwise process th
46f0: 65 20 6f 70 74 69 6f 6e 20 61 72 67 2e 0a 20 20  e option arg..  
4700: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 67 6c        switch -gl
4710: 6f 62 20 2d 2d 20 5b 73 65 74 20 61 72 67 20 5b  ob -- [set arg [
4720: 6c 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73 74  lindex $argsList
4730: 20 30 5d 5d 20 7b 0a 20 20 20 20 20 20 20 20 20   0]] {.         
4740: 20 20 20 22 2d 2d 22 20 7b 0a 20 20 20 20 20 20     "--" {.      
4750: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 72            set ar
4760: 67 73 4c 69 73 74 20 5b 6c 72 61 6e 67 65 20 24  gsList [lrange $
4770: 61 72 67 73 4c 69 73 74 20 31 20 65 6e 64 5d 0a  argsList 1 end].
4780: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
4790: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2a 22 20             "-*" 
47a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
47b0: 20 20 23 20 43 72 65 61 74 65 20 6c 69 73 74 20    # Create list 
47c0: 6f 66 20 6f 70 74 69 6f 6e 73 20 77 69 74 68 6f  of options witho
47d0: 75 74 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ut their argumen
47e0: 74 20 65 78 74 65 6e 73 69 6f 6e 73 0a 0a 20 20  t extensions..  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4800: 74 20 6f 70 74 73 74 72 20 22 22 0a 20 20 20 20  t optstr "".    
4810: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
4820: 61 63 68 20 73 74 72 20 24 6f 70 74 73 74 72 69  ach str $optstri
4830: 6e 67 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ng {.           
4840: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
4850: 20 6f 70 74 73 74 72 20 5b 66 69 6c 65 20 72 6f   optstr [file ro
4860: 6f 74 6e 61 6d 65 20 24 73 74 72 5d 0a 20 20 20  otname $str].   
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 73 65 74 20 5f 6f 70 74 20 5b 73 74 72 69 6e 67  set _opt [string
48a0: 20 72 61 6e 67 65 20 24 61 72 67 20 31 20 65 6e   range $arg 1 en
48b0: 64 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  d]..            
48c0: 20 20 20 20 73 65 74 20 69 20 5b 70 72 65 66 69      set i [prefi
48d0: 78 53 65 61 72 63 68 20 24 6f 70 74 73 74 72 20  xSearch $optstr 
48e0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
48f0: 5f 6f 70 74 5d 5d 0a 20 20 20 20 20 20 20 20 20  _opt]].         
4900: 20 20 20 20 20 20 20 69 66 20 7b 24 69 20 21 3d         if {$i !=
4910: 20 2d 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 20   -1} {.         
4920: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
4930: 70 74 20 5b 6c 69 6e 64 65 78 20 24 6f 70 74 73  pt [lindex $opts
4940: 74 72 69 6e 67 20 24 69 5d 0a 0a 20 20 20 20 20  tring $i]..     
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4960: 65 74 20 71 75 61 6e 74 69 66 69 65 72 20 22 6e  et quantifier "n
4970: 6f 6e 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  one".           
4980: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65           if {[re
4990: 67 65 78 70 20 2d 2d 20 7b 5c 2e 5b 5e 2e 5d 2b  gexp -- {\.[^.]+
49a0: 28 5b 3f 2b 2a 5d 29 24 7d 20 24 6f 70 74 20 64  ([?+*])$} $opt d
49b0: 75 6d 6d 79 20 71 75 61 6e 74 69 66 69 65 72 5d  ummy quantifier]
49c0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
49e0: 6f 70 74 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  opt [string rang
49f0: 65 20 24 6f 70 74 20 30 20 65 6e 64 2d 31 5d 0a  e $opt 0 end-1].
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
4a20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
4a30: 73 74 72 69 6e 67 20 66 69 72 73 74 20 2e 20 24  string first . $
4a40: 6f 70 74 5d 20 3d 3d 20 2d 31 7d 20 7b 0a 20 20  opt] == -1} {.  
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 20 73 65 74 20 72 65 74 76 61 6c        set retval
4a70: 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   1.             
4a80: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72             set r
4a90: 65 74 76 61 72 20 24 6f 70 74 0a 20 20 20 20 20  etvar $opt.     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 73 65 74 20 61 72 67 73 4c 69 73 74 20     set argsList 
4ac0: 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 4c 69 73  [lrange $argsLis
4ad0: 74 20 31 20 65 6e 64 5d 0a 0a 20 20 20 20 20 20  t 1 end]..      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
4af0: 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20  elseif {[regexp 
4b00: 2d 2d 20 22 5c 5c 2e 28 61 72 67 7c 24 63 68 61  -- "\\.(arg|$cha
4b10: 72 63 6c 61 73 73 65 73 29 5c 24 22 20 24 6f 70  rclasses)\$" $op
4b20: 74 20 64 75 6d 6d 79 20 63 68 61 72 63 6c 61 73  t dummy charclas
4b30: 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s].             
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
4b50: 7c 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5c 2e  | [regexp -- {\.
4b60: 5c 28 28 5b 5e 29 5d 2b 29 5c 29 7d 20 24 6f 70  \(([^)]+)\)} $op
4b70: 74 20 64 75 6d 6d 79 20 63 68 61 72 63 6c 61 73  t dummy charclas
4b80: 73 5d 7d 20 7b 0a 09 09 09 09 69 66 20 7b 5b 73  s]} {.....if {[s
4b90: 74 72 69 6e 67 20 65 71 75 61 6c 20 61 72 67 20  tring equal arg 
4ba0: 24 63 68 61 72 63 6c 61 73 73 5d 7d 20 7b 0a 20  $charclass]} {. 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
4bd0: 79 70 65 20 61 72 67 0a 09 09 09 7d 20 65 6c 73  ype arg....} els
4be0: 65 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20  eif {[regexp -- 
4bf0: 22 5e 28 24 63 68 61 72 63 6c 61 73 73 65 73 29  "^($charclasses)
4c00: 5c 24 22 20 24 63 68 61 72 63 6c 61 73 73 5d 7d  \$" $charclass]}
4c10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4c30: 65 74 20 74 79 70 65 20 63 6c 61 73 73 0a 20 20  et type class.  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
4c80: 79 70 65 20 6f 6e 65 6f 66 0a 20 20 20 20 20 20  ype oneof.      
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4cc0: 20 61 72 67 73 4c 69 73 74 20 5b 6c 72 61 6e 67   argsList [lrang
4cd0: 65 20 24 61 72 67 73 4c 69 73 74 20 31 20 65 6e  e $argsList 1 en
4ce0: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
4cf0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
4d00: 70 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  pt [file rootnam
4d10: 65 20 24 6f 70 74 5d 0a 0a 20 20 20 20 20 20 20  e $opt]..       
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 20 20 20   while {1} {.   
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
4d60: 65 6e 67 74 68 20 24 61 72 67 73 4c 69 73 74 5d  ength $argsList]
4d70: 20 3d 3d 20 30 0a 20 20 20 20 20 20 20 20 20 20   == 0.          
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5b 73 74            || [st
4da0: 72 69 6e 67 20 65 71 75 61 6c 20 22 2d 2d 22 20  ring equal "--" 
4db0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73  [lindex $argsLis
4dc0: 74 20 30 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20  t 0]]} {.       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
4df0: 72 69 6e 67 20 65 71 75 61 6c 20 22 2d 2d 22 20  ring equal "--" 
4e00: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73  [lindex $argsLis
4e10: 74 20 30 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20  t 0]]} {.       
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4e40: 20 61 72 67 73 4c 69 73 74 20 5b 6c 72 61 6e 67   argsList [lrang
4e50: 65 20 24 61 72 67 73 4c 69 73 74 20 31 20 65 6e  e $argsList 1 en
4e60: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 73 65 74 20 6f 6e 65 6f 66 20        set oneof 
4eb0: 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "".             
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 69 66 20 7b 24 74 79 70 65 20 3d 3d 20     if {$type == 
4ee0: 22 61 72 67 22 7d 20 7b 0a 20 20 20 20 20 20 20  "arg"} {.       
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4f10: 20 63 68 61 72 63 6c 61 73 73 20 61 6e 0a 20 20   charclass an.  
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
4f40: 65 6c 73 65 69 66 20 7b 24 74 79 70 65 20 3d 3d  elseif {$type ==
4f50: 20 22 6f 6e 65 6f 66 22 7d 20 7b 0a 20 20 20 20   "oneof"} {.    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 73 65 74 20 6f 6e 65 6f 66 20 22 2c 20 6f 6e 65  set oneof ", one
4f90: 20 6f 66 20 24 63 68 61 72 63 6c 61 73 73 22 0a   of $charclass".
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 20 20 20 20 73 65 74 20 63 68 61 72 63 6c 61 73      set charclas
4fd0: 73 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 20  s an.           
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
5020: 24 71 75 61 6e 74 69 66 69 65 72 20 3d 3d 20 22  $quantifier == "
5030: 3f 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ?"} {.          
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
5060: 74 76 61 6c 20 31 0a 20 20 20 20 20 20 20 20 20  tval 1.         
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72             set r
5090: 65 74 76 61 72 20 24 6f 70 74 0a 20 20 20 20 20  etvar $opt.     
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
50c0: 65 74 20 6f 70 74 61 72 67 20 22 22 0a 20 20 20  et optarg "".   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
50f0: 6c 73 65 69 66 20 7b 24 71 75 61 6e 74 69 66 69  lseif {$quantifi
5100: 65 72 20 3d 3d 20 22 2b 22 7d 20 7b 0a 20 20 20  er == "+"} {.   
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 73 65 74 20 72 65 74 76 61 72 20 24 6f 70 74   set retvar $opt
5140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
5170: 68 20 24 6f 70 74 61 72 67 5d 20 3c 20 31 7d 20  h $optarg] < 1} 
5180: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
51b0: 74 76 61 6c 20 2d 32 0a 20 20 20 20 20 20 20 20  tval -2.        
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 73 65 74 20 6f 70 74 61 72 67 20 22 4f 70 74 69  set optarg "Opti
51f0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 74 20 6c  on requires at l
5200: 65 61 73 74 20 6f 6e 65 20 24 63 68 61 72 63 6c  east one $charcl
5210: 61 73 73 20 61 72 67 75 6d 65 6e 74 24 6f 6e 65  ass argument$one
5220: 6f 66 20 2d 2d 20 24 6f 70 74 22 0a 20 20 20 20  of -- $opt".    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 73 65 74 20 72 65 74 76 61 6c 20 31 0a 20 20   set retval 1.  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 71      } elseif {$q
52e0: 75 61 6e 74 69 66 69 65 72 20 3d 3d 20 22 2a 22  uantifier == "*"
52f0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 74 76          set retv
5320: 61 6c 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  al 1.           
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 74           set ret
5350: 76 61 72 20 24 6f 70 74 0a 20 20 20 20 20 20 20  var $opt.       
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 73 65 74 20 6f 70 74 61 72 67        set optarg
53b0: 20 22 4f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "Option require
53c0: 73 20 24 63 68 61 72 63 6c 61 73 73 20 61 72 67  s $charclass arg
53d0: 75 6d 65 6e 74 24 6f 6e 65 6f 66 20 2d 2d 20 24  ument$oneof -- $
53e0: 6f 70 74 22 0a 20 20 20 20 20 20 20 20 20 20 20  opt".           
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 74           set ret
5410: 76 61 72 20 24 6f 70 74 0a 20 20 20 20 20 20 20  var $opt.       
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5440: 20 72 65 74 76 61 6c 20 2d 32 0a 20 20 20 20 20   retval -2.     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5490: 20 71 75 61 6e 74 69 66 69 65 72 20 22 22 0a 20   quantifier "". 
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
54c0: 65 69 66 20 7b 28 24 74 79 70 65 20 3d 3d 20 22  eif {($type == "
54d0: 61 72 67 22 29 0a 20 20 20 20 20 20 20 20 20 20  arg").          
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 24            || (($
5500: 74 79 70 65 20 3d 3d 20 22 6f 6e 65 6f 66 22 29  type == "oneof")
5510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 26 26 20 5b 73 74 72 69 6e 67 20       && [string 
5540: 66 69 72 73 74 20 22 7c 5b 6c 69 6e 64 65 78 20  first "|[lindex 
5550: 24 61 72 67 73 4c 69 73 74 20 30 5d 7c 22 20 22  $argsList 0]|" "
5560: 7c 24 63 68 61 72 63 6c 61 73 73 7c 22 5d 20 21  |$charclass|"] !
5570: 3d 20 2d 31 29 0a 20 20 20 20 20 20 20 20 20 20  = -1).          
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 24            || (($
55a0: 74 79 70 65 20 3d 3d 20 22 63 6c 61 73 73 22 29  type == "class")
55b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 26 26 20 5b 73 74 72 69 6e 67 20       && [string 
55e0: 69 73 20 24 63 68 61 72 63 6c 61 73 73 20 5b 6c  is $charclass [l
55f0: 69 6e 64 65 78 20 24 61 72 67 73 4c 69 73 74 20  index $argsList 
5600: 30 5d 5d 29 7d 20 7b 0a 20 20 20 20 20 20 20 20  0]])} {.        
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 74 76          set retv
5630: 61 6c 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  al 1.           
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 73 65 74 20 72 65 74 76 61 72 20       set retvar 
5660: 24 6f 70 74 0a 20 20 20 20 20 20 20 20 20 20 20  $opt.           
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 74       lappend opt
5690: 61 72 67 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  arg [lindex $arg
56a0: 73 4c 69 73 74 20 30 5d 0a 20 20 20 20 20 20 20  sList 0].       
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 72 67           set arg
56d0: 73 4c 69 73 74 20 5b 6c 72 61 6e 67 65 20 24 61  sList [lrange $a
56e0: 72 67 73 4c 69 73 74 20 31 20 65 6e 64 5d 0a 20  rgsList 1 end]. 
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
5710: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 73 65 74 20 6f 6e 65 6f 66 20 22 22      set oneof ""
5740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 69 66 20 7b 24 74 79 70 65 20 3d 3d 20 22 61   if {$type == "a
5770: 72 67 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  rg"} {.         
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
57a0: 68 61 72 63 6c 61 73 73 20 61 6e 0a 20 20 20 20  harclass an.    
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
57d0: 73 65 69 66 20 7b 24 74 79 70 65 20 3d 3d 20 22  seif {$type == "
57e0: 6f 6e 65 6f 66 22 7d 20 7b 0a 20 20 20 20 20 20  oneof"} {.      
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
5810: 74 20 6f 6e 65 6f 66 20 22 2c 20 6f 6e 65 20 6f  t oneof ", one o
5820: 66 20 24 63 68 61 72 63 6c 61 73 73 22 0a 20 20  f $charclass".  
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 73 65 74 20 63 68 61 72 63 6c 61 73 73 20    set charclass 
5860: 61 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  an.             
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 20 20 73 65 74 20 6f 70 74 61 72 67 20       set optarg 
58b0: 22 4f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "Option requires
58c0: 20 24 63 68 61 72 63 6c 61 73 73 20 61 72 67 75   $charclass argu
58d0: 6d 65 6e 74 24 6f 6e 65 6f 66 20 2d 2d 20 24 6f  ment$oneof -- $o
58e0: 70 74 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt".            
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 73 65 74 20 72 65 74 76 61 72 20 24      set retvar $
5910: 6f 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  opt.            
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 73 65 74 20 72 65 74 76 61 6c 20 2d      set retval -
5940: 33 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  3.    .         
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 20 69 66 20 7b 24 71 75 61 6e         if {$quan
5970: 74 69 66 69 65 72 20 3d 3d 20 22 3f 22 7d 20 7b  tifier == "?"} {
5980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 20 73 65 74 20 72 65 74 76 61 6c 20       set retval 
59b0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 20 20 73 65 74 20 6f 70 74 61 72 67        set optarg
59e0: 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20   "".            
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 20 20 73 65 74 20 71 75 61 6e 74 69        set quanti
5a30: 66 69 65 72 20 22 22 0a 20 20 20 20 20 20 20 20  fier "".        
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70 20     if {![regexp 
5a80: 2d 2d 20 7b 5b 2b 2a 5d 7d 20 24 71 75 61 6e 74  -- {[+*]} $quant
5a90: 69 66 69 65 72 5d 7d 20 7b 0a 20 20 20 20 20 20  ifier]} {.      
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
5b10: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72                Er
5b30: 72 6f 72 20 5c 0a 09 09 09 20 20 20 20 22 49 6c  ror \....    "Il
5b40: 6c 65 67 61 6c 20 6f 70 74 69 6f 6e 20 74 79 70  legal option typ
5b50: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 3a  e specification:
5b60: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
5b70: 24 63 68 61 72 63 6c 61 73 73 65 73 22 20 5c 0a  $charclasses" \.
5b80: 09 09 09 20 20 20 20 42 41 44 20 4f 50 54 49 4f  ...    BAD OPTIO
5b90: 4e 20 54 59 50 45 0a 20 20 20 20 20 20 20 20 20  N TYPE.         
5ba0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
5bc0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
5bd0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 70            set op
5be0: 74 61 72 67 20 22 49 6c 6c 65 67 61 6c 20 6f 70  targ "Illegal op
5bf0: 74 69 6f 6e 20 2d 2d 20 24 5f 6f 70 74 22 0a 20  tion -- $_opt". 
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 73 65 74 20 72 65 74 76 61 72 20 24 5f     set retvar $_
5c20: 6f 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  opt.            
5c30: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 74 76          set retv
5c40: 61 6c 20 2d 31 0a 20 20 20 20 20 20 20 20 20 20  al -1.          
5c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5c60: 20 20 20 20 7d 0a 09 20 20 20 20 64 65 66 61 75      }..    defau
5c70: 6c 74 20 7b 0a 09 09 23 20 53 6b 69 70 20 61 68  lt {...# Skip ah
5c80: 65 61 64 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  ead..    }.     
5c90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
5ca0: 72 65 74 75 72 6e 20 24 72 65 74 76 61 6c 0a 7d  return $retval.}
5cb0: 0a 0a 23 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 74  ..# ::cmdline::t
5cc0: 79 70 65 64 47 65 74 6f 70 74 69 6f 6e 73 20 2d  ypedGetoptions -
5cd0: 2d 0a 23 0a 23 09 50 72 6f 63 65 73 73 20 61 20  -.#.#.Process a 
5ce0: 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 6c  set of command l
5cf0: 69 6e 65 20 6f 70 74 69 6f 6e 73 2c 20 66 69 6c  ine options, fil
5d00: 6c 69 6e 67 20 69 6e 20 64 65 66 61 75 6c 74 73  ling in defaults
5d10: 0a 23 09 66 6f 72 20 74 68 6f 73 65 20 6e 6f 74  .#.for those not
5d20: 20 73 70 65 63 69 66 69 65 64 2e 20 54 68 69 73   specified. This
5d30: 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20   also generates 
5d40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5d50: 0a 23 09 74 68 61 74 20 6c 69 73 74 73 20 74 68  .#.that lists th
5d60: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 74 69 6f 6e  e allowed option
5d70: 73 20 69 66 20 61 6e 20 69 6e 63 6f 72 72 65 63  s if an incorrec
5d80: 74 20 6f 70 74 69 6f 6e 20 69 73 0a 23 09 73 70  t option is.#.sp
5d90: 65 63 69 66 69 65 64 2e 0a 23 0a 23 20 41 72 67  ecified..#.# Arg
5da0: 75 6d 65 6e 74 73 3a 0a 23 09 61 72 67 6c 69 73  uments:.#.arglis
5db0: 74 56 61 72 09 54 68 65 20 6e 61 6d 65 20 6f 66  tVar.The name of
5dc0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   the argument li
5dd0: 73 74 2c 20 74 79 70 69 63 61 6c 6c 79 20 61 72  st, typically ar
5de0: 67 76 0a 23 09 6f 70 74 6c 69 73 74 09 09 41 20  gv.#.optlist..A 
5df0: 6c 69 73 74 2d 6f 66 2d 6c 69 73 74 73 20 77 68  list-of-lists wh
5e00: 65 72 65 20 65 61 63 68 20 65 6c 65 6d 65 6e 74  ere each element
5e10: 20 73 70 65 63 69 66 69 65 73 20 61 6e 20 6f 70   specifies an op
5e20: 74 69 6f 6e 0a 23 09 09 09 69 6e 20 74 68 65 20  tion.#...in the 
5e30: 66 6f 72 6d 3a 0a 23 0a 23 09 09 09 09 6f 70 74  form:.#.#....opt
5e40: 69 6f 6e 20 64 65 66 61 75 6c 74 20 63 6f 6d 6d  ion default comm
5e50: 65 6e 74 0a 23 0a 23 09 09 09 4f 70 74 69 6f 6e  ent.#.#...Option
5e60: 73 20 66 6f 72 6d 61 74 74 69 6e 67 20 69 73 20  s formatting is 
5e70: 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  as described for
5e80: 20 74 68 65 20 6f 70 74 73 74 72 69 6e 67 0a 23   the optstring.#
5e90: 09 09 09 61 72 67 75 6d 65 6e 74 20 6f 66 20 74  ...argument of t
5ea0: 79 70 65 64 47 65 74 6f 70 74 2e 20 44 65 66 61  ypedGetopt. Defa
5eb0: 75 6c 74 20 69 73 20 66 6f 72 20 6f 70 74 69 6f  ult is for optio
5ec0: 6e 61 6c 6c 79 0a 23 09 09 09 73 70 65 63 69 66  nally.#...specif
5ed0: 79 69 6e 67 20 61 20 64 65 66 61 75 6c 74 20 76  ying a default v
5ee0: 61 6c 75 65 2e 20 43 6f 6d 6d 65 6e 74 20 69 73  alue. Comment is
5ef0: 20 66 6f 72 20 6f 70 74 69 6f 6e 61 6c 6c 79 0a   for optionally.
5f00: 23 09 09 09 73 70 65 63 69 66 79 69 6e 67 20 61  #...specifying a
5f10: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 65   comment for the
5f20: 20 75 73 61 67 65 20 64 69 73 70 6c 61 79 2e 20   usage display. 
5f30: 54 68 65 0a 23 09 09 09 6f 70 74 69 6f 6e 73 20  The.#...options 
5f40: 22 2d 2d 22 2c 20 22 2d 68 65 6c 70 22 2c 20 61  "--", "-help", a
5f50: 6e 64 20 22 2d 3f 22 20 61 72 65 20 61 75 74 6f  nd "-?" are auto
5f60: 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 6c 75 64  matically includ
5f70: 65 64 0a 23 09 09 09 69 6e 20 6f 70 74 6c 69 73  ed.#...in optlis
5f80: 74 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 20  t..#.# Argument 
5f90: 73 79 6e 74 61 78 20 6d 69 73 63 65 6c 6c 61 6e  syntax miscellan
5fa0: 79 3a 0a 23 09 4f 70 74 69 6f 6e 73 20 66 6f 72  y:.#.Options for
5fb0: 6d 61 74 74 69 6e 67 20 61 6e 64 20 73 79 6e 74  matting and synt
5fc0: 61 78 20 69 73 20 61 73 20 64 65 73 63 72 69 62  ax is as describ
5fd0: 65 64 20 69 6e 20 74 79 70 65 64 47 65 74 6f 70  ed in typedGetop
5fe0: 74 2e 0a 23 09 54 68 65 72 65 20 61 72 65 20 74  t..#.There are t
5ff0: 77 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 75  wo additional su
6000: 66 66 69 78 65 73 20 74 68 61 74 20 6d 61 79 20  ffixes that may 
6010: 62 65 20 61 70 70 6c 69 65 64 20 77 68 65 6e 0a  be applied when.
6020: 23 09 70 61 73 73 69 6e 67 20 6f 70 74 69 6f 6e  #.passing option
6030: 73 20 74 6f 20 74 79 70 65 64 47 65 74 6f 70 74  s to typedGetopt
6040: 69 6f 6e 73 2e 0a 23 0a 23 09 59 6f 75 20 6d 61  ions..#.#.You ma
6050: 79 20 61 64 64 20 22 2e 6d 75 6c 74 69 22 20 61  y add ".multi" a
6060: 73 20 61 20 73 75 66 66 69 78 20 74 6f 20 61 6e  s a suffix to an
6070: 79 20 6f 70 74 69 6f 6e 2e 20 46 6f 72 20 6f 70  y option. For op
6080: 74 69 6f 6e 73 0a 23 09 74 68 61 74 20 74 61 6b  tions.#.that tak
6090: 65 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 74  e an argument, t
60a0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
60b0: 68 65 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65  he option may be
60c0: 20 75 73 65 64 0a 23 09 6d 6f 72 65 20 74 68 61   used.#.more tha
60d0: 6e 20 6f 6e 63 65 20 6f 6e 20 74 68 65 20 63 6f  n once on the co
60e0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 74  mmand line and t
60f0: 68 61 74 20 65 61 63 68 20 61 64 64 69 74 69 6f  hat each additio
6100: 6e 61 6c 0a 23 09 61 72 67 75 6d 65 6e 74 20 77  nal.#.argument w
6110: 69 6c 6c 20 62 65 20 61 70 70 65 6e 64 65 64 20  ill be appended 
6120: 74 6f 20 61 20 6c 69 73 74 2c 20 77 68 69 63 68  to a list, which
6130: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 65   is then returne
6140: 64 0a 23 09 74 6f 20 74 68 65 20 61 70 70 6c 69  d.#.to the appli
6150: 63 61 74 69 6f 6e 2e 0a 23 09 09 66 6f 6f 2e 64  cation..#..foo.d
6160: 6f 75 62 6c 65 2e 6d 75 6c 74 69 0a 23 0a 23 09  ouble.multi.#.#.
6170: 49 66 20 61 20 6e 6f 6e 2d 61 72 67 75 6d 65 6e  If a non-argumen
6180: 74 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63  t option is spec
6190: 69 66 69 65 64 20 61 73 20 22 2e 6d 75 6c 74 69  ified as ".multi
61a0: 22 2c 20 69 74 20 69 73 0a 23 09 74 6f 67 67 6c  ", it is.#.toggl
61b0: 65 64 20 6f 6e 20 61 6e 64 20 6f 66 66 20 66 6f  ed on and off fo
61c0: 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20 69  r each time it i
61d0: 73 20 75 73 65 64 20 6f 6e 20 74 68 65 20 63 6f  s used on the co
61e0: 6d 6d 61 6e 64 0a 23 09 6c 69 6e 65 2e 0a 23 09  mmand.#.line..#.
61f0: 09 66 6f 6f 2e 6d 75 6c 74 69 0a 23 0a 23 09 49  .foo.multi.#.#.I
6200: 66 20 61 6e 20 6f 70 74 69 6f 6e 20 73 70 65 63  f an option spec
6210: 69 66 69 63 61 74 69 6f 6e 20 64 6f 65 73 20 6e  ification does n
6220: 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 22  ot contain the "
6230: 2e 6d 75 6c 74 69 22 0a 23 09 73 75 66 66 69 78  .multi".#.suffix
6240: 2c 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  , it is not an e
6250: 72 72 6f 72 20 74 6f 20 75 73 65 20 61 6e 20 6f  rror to use an o
6260: 70 74 69 6f 6e 20 6d 6f 72 65 20 74 68 61 6e 20  ption more than 
6270: 6f 6e 63 65 2e 0a 23 09 49 6e 20 74 68 69 73 20  once..#.In this 
6280: 63 61 73 65 2c 20 74 68 65 20 62 65 68 61 76 69  case, the behavi
6290: 6f 72 20 66 6f 72 20 6f 70 74 69 6f 6e 73 20 77  or for options w
62a0: 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 69 73  ith arguments is
62b0: 20 74 68 61 74 0a 23 09 74 68 65 20 6c 61 73 74   that.#.the last
62c0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
62d0: 20 6f 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 62   one that will b
62e0: 65 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 0a  e returned. For.
62f0: 23 09 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 64  #.options that d
6300: 6f 20 6e 6f 74 20 74 61 6b 65 20 61 72 67 75 6d  o not take argum
6310: 65 6e 74 73 2c 20 75 73 69 6e 67 20 74 68 65 6d  ents, using them
6320: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 0a   more than once.
6330: 23 09 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f  #.has no additio
6340: 6e 61 6c 20 65 66 66 65 63 74 2e 0a 23 0a 23 09  nal effect..#.#.
6350: 4f 70 74 69 6f 6e 73 20 6d 61 79 20 61 6c 73 6f  Options may also
6360: 20 62 65 20 68 69 64 64 65 6e 20 66 72 6f 6d 20   be hidden from 
6370: 74 68 65 20 75 73 61 67 65 20 64 69 73 70 6c 61  the usage displa
6380: 79 20 62 79 0a 23 09 61 70 70 65 6e 64 69 6e 67  y by.#.appending
6390: 20 74 68 65 20 73 75 66 66 69 78 20 22 2e 73 65   the suffix ".se
63a0: 63 72 65 74 22 20 74 6f 20 61 6e 79 20 6f 70 74  cret" to any opt
63b0: 69 6f 6e 20 73 70 65 63 69 66 69 63 61 74 69 6f  ion specificatio
63c0: 6e 2e 0a 23 09 50 6c 65 61 73 65 20 6e 6f 74 65  n..#.Please note
63d0: 20 74 68 61 74 20 74 68 65 20 22 2e 73 65 63 72   that the ".secr
63e0: 65 74 22 20 73 75 66 66 69 78 20 6d 75 73 74 20  et" suffix must 
63f0: 62 65 20 74 68 65 20 6c 61 73 74 20 73 75 66 66  be the last suff
6400: 69 78 2c 0a 23 09 61 66 74 65 72 20 61 6e 79 20  ix,.#.after any 
6410: 61 72 67 75 6d 65 6e 74 20 74 79 70 65 20 73 70  argument type sp
6420: 65 63 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20  ecification and 
6430: 22 2e 6d 75 6c 74 69 22 20 73 75 66 66 69 78 2e  ".multi" suffix.
6440: 0a 23 09 09 66 6f 6f 2e 78 64 69 67 69 74 2e 6d  .#..foo.xdigit.m
6450: 75 6c 74 69 2e 73 65 63 72 65 74 0a 23 0a 23 20  ulti.secret.#.# 
6460: 52 65 73 75 6c 74 73 0a 23 09 4e 61 6d 65 20 76  Results.#.Name v
6470: 61 6c 75 65 20 70 61 69 72 73 20 73 75 69 74 61  alue pairs suita
6480: 62 6c 65 20 66 6f 72 20 75 73 69 6e 67 20 77 69  ble for using wi
6490: 74 68 20 61 72 72 61 79 20 73 65 74 2e 0a 0a 70  th array set...p
64a0: 72 6f 63 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 74  roc ::cmdline::t
64b0: 79 70 65 64 47 65 74 6f 70 74 69 6f 6e 73 20 7b  ypedGetoptions {
64c0: 61 72 67 6c 69 73 74 56 61 72 20 6f 70 74 6c 69  arglistVar optli
64d0: 73 74 20 7b 75 73 61 67 65 20 6f 70 74 69 6f 6e  st {usage option
64e0: 73 3a 7d 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  s:}} {.    varia
64f0: 62 6c 65 20 63 68 61 72 63 6c 61 73 73 65 73 0a  ble charclasses.
6500: 0a 20 20 20 20 75 70 76 61 72 20 31 20 24 61 72  .    upvar 1 $ar
6510: 67 6c 69 73 74 56 61 72 20 61 72 67 76 0a 0a 20  glistVar argv.. 
6520: 20 20 20 73 65 74 20 6f 70 74 73 20 7b 3f 20 68     set opts {? h
6530: 65 6c 70 7d 0a 20 20 20 20 66 6f 72 65 61 63 68  elp}.    foreach
6540: 20 6f 70 74 20 24 6f 70 74 6c 69 73 74 20 7b 0a   opt $optlist {.
6550: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
6560: 20 5b 6c 69 6e 64 65 78 20 24 6f 70 74 20 30 5d   [lindex $opt 0]
6570: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65  .        if {[re
6580: 67 73 75 62 20 2d 2d 20 7b 5c 2e 73 65 63 72 65  gsub -- {\.secre
6590: 74 24 7d 20 24 6e 61 6d 65 20 7b 7d 20 6e 61 6d  t$} $name {} nam
65a0: 65 5d 20 3d 3d 20 31 7d 20 7b 0a 20 20 20 20 20  e] == 1} {.     
65b0: 20 20 20 20 20 20 20 23 20 52 65 6d 6f 76 65 20         # Remove 
65c0: 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 62  this extension b
65d0: 65 66 6f 72 65 20 70 61 73 73 69 6e 67 20 74 6f  efore passing to
65e0: 20 74 79 70 65 64 47 65 74 6f 70 74 2e 0a 20 20   typedGetopt..  
65f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6600: 69 66 20 7b 5b 72 65 67 73 75 62 20 2d 2d 20 7b  if {[regsub -- {
6610: 5c 2e 6d 75 6c 74 69 24 7d 20 24 6e 61 6d 65 20  \.multi$} $name 
6620: 7b 7d 20 6e 61 6d 65 5d 20 3d 3d 20 31 7d 20 7b  {} name] == 1} {
6630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52  .            # R
6640: 65 6d 6f 76 65 20 74 68 69 73 20 65 78 74 65 6e  emove this exten
6650: 73 69 6f 6e 20 62 65 66 6f 72 65 20 70 61 73 73  sion before pass
6660: 69 6e 67 20 74 6f 20 74 79 70 65 64 47 65 74 6f  ing to typedGeto
6670: 70 74 2e 0a 0a 20 20 20 20 20 20 20 20 20 20 20  pt...           
6680: 20 72 65 67 73 75 62 20 2d 2d 20 7b 5c 2e 2e 2a   regsub -- {\..*
6690: 24 7d 20 24 6e 61 6d 65 20 7b 7d 20 74 65 6d 70  $} $name {} temp
66a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
66b0: 20 6d 75 6c 74 69 28 24 74 65 6d 70 29 20 31 0a   multi($temp) 1.
66c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
66d0: 20 20 6c 61 70 70 65 6e 64 20 6f 70 74 73 20 24    lappend opts $
66e0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 69 66 20  name.        if 
66f0: 7b 5b 72 65 67 73 75 62 20 2d 2d 20 22 5c 5c 2e  {[regsub -- "\\.
6700: 28 61 72 67 7c 24 63 68 61 72 63 6c 61 73 73 65  (arg|$charclasse
6710: 73 7c 5c 5c 28 2e 2b 29 2e 3f 5c 24 22 20 24 6e  s|\\(.+).?\$" $n
6720: 61 6d 65 20 7b 7d 20 6e 61 6d 65 5d 20 3d 3d 20  ame {} name] == 
6730: 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1} {.           
6740: 20 23 20 53 65 74 20 64 65 66 61 75 6c 74 73 20   # Set defaults 
6750: 66 6f 72 20 74 68 6f 73 65 20 74 68 61 74 20 74  for those that t
6760: 61 6b 65 20 76 61 6c 75 65 73 2e 0a 20 20 20 20  ake values..    
6770: 20 20 20 20 20 20 20 20 23 20 42 6f 6f 6c 65 61          # Boolea
6780: 6e 73 20 61 72 65 20 73 65 74 20 6a 75 73 74 20  ns are set just 
6790: 62 79 20 62 65 69 6e 67 20 70 72 65 73 65 6e 74  by being present
67a0: 2c 20 6f 72 20 6e 6f 74 0a 0a 20 20 20 20 20 20  , or not..      
67b0: 20 20 20 20 20 20 73 65 74 20 64 66 6c 74 20 5b        set dflt [
67c0: 6c 69 6e 64 65 78 20 24 6f 70 74 20 31 5d 0a 20  lindex $opt 1]. 
67d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
67e0: 64 66 6c 74 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20  dflt != {}} {.  
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
6800: 74 20 64 65 66 61 75 6c 74 73 28 24 6e 61 6d 65  t defaults($name
6810: 29 20 24 64 66 6c 74 0a 20 20 20 20 20 20 20 20  ) $dflt.        
6820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6830: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 61 72      }.    set ar
6840: 67 63 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67  gc [llength $arg
6850: 76 5d 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 73  v].    while {[s
6860: 65 74 20 65 72 72 20 5b 74 79 70 65 64 47 65 74  et err [typedGet
6870: 6f 70 74 20 61 72 67 76 20 24 6f 70 74 73 20 6f  opt argv $opts o
6880: 70 74 20 61 72 67 5d 5d 7d 20 7b 0a 20 20 20 20  pt arg]]} {.    
6890: 20 20 20 20 69 66 20 7b 24 65 72 72 20 3d 3d 20      if {$err == 
68a0: 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1} {.           
68b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
68c0: 73 20 72 65 73 75 6c 74 28 24 6f 70 74 29 5d 0a  s result($opt)].
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 20 20 26 26 20 5b 69 6e 66 6f 20 65 78 69      && [info exi
68f0: 73 74 73 20 6d 75 6c 74 69 28 24 6f 70 74 29 5d  sts multi($opt)]
6900: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
6910: 20 20 20 20 23 20 54 6f 67 67 6c 65 20 62 6f 6f      # Toggle boo
6920: 6c 65 61 6e 20 6f 70 74 69 6f 6e 73 20 6f 72 20  lean options or 
6930: 61 70 70 65 6e 64 20 6e 65 77 20 61 72 67 75 6d  append new argum
6940: 65 6e 74 73 0a 0a 20 20 20 20 20 20 20 20 20 20  ents..          
6950: 20 20 20 20 20 20 69 66 20 7b 24 61 72 67 20 3d        if {$arg =
6960: 3d 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20  = ""} {.        
6970: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 65              unse
6980: 74 20 72 65 73 75 6c 74 28 24 6f 70 74 29 0a 20  t result($opt). 
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
69a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
69c0: 72 65 73 75 6c 74 28 24 6f 70 74 29 20 22 24 72  result($opt) "$r
69d0: 65 73 75 6c 74 28 24 6f 70 74 29 20 24 61 72 67  esult($opt) $arg
69e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
69f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6a00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
6a10: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73           set res
6a20: 75 6c 74 28 24 6f 70 74 29 20 22 24 61 72 67 22  ult($opt) "$arg"
6a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6a40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
6a50: 7b 28 24 65 72 72 20 3d 3d 20 2d 31 29 20 7c 7c  {($err == -1) ||
6a60: 20 28 24 65 72 72 20 3d 3d 20 2d 33 29 7d 20 7b   ($err == -3)} {
6a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72  .            Err
6a80: 6f 72 20 5b 74 79 70 65 64 55 73 61 67 65 20 24  or [typedUsage $
6a90: 6f 70 74 6c 69 73 74 20 24 75 73 61 67 65 5d 20  optlist $usage] 
6aa0: 55 53 41 47 45 0a 20 20 20 20 20 20 20 20 7d 20  USAGE.        } 
6ab0: 65 6c 73 65 69 66 20 7b 24 65 72 72 20 3d 3d 20  elseif {$err == 
6ac0: 2d 32 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69  -2 && ![info exi
6ad0: 73 74 73 20 64 65 66 61 75 6c 74 73 28 24 6f 70  sts defaults($op
6ae0: 74 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  t)]} {.         
6af0: 20 20 20 45 72 72 6f 72 20 5b 74 79 70 65 64 55     Error [typedU
6b00: 73 61 67 65 20 24 6f 70 74 6c 69 73 74 20 24 75  sage $optlist $u
6b10: 73 61 67 65 5d 20 55 53 41 47 45 0a 20 20 20 20  sage] USAGE.    
6b20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6b30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6b40: 20 72 65 73 75 6c 74 28 3f 29 5d 20 7c 7c 20 5b   result(?)] || [
6b50: 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 73 75  info exists resu
6b60: 6c 74 28 68 65 6c 70 29 5d 7d 20 7b 0a 20 20 20  lt(help)]} {.   
6b70: 20 20 20 20 20 45 72 72 6f 72 20 5b 74 79 70 65       Error [type
6b80: 64 55 73 61 67 65 20 24 6f 70 74 6c 69 73 74 20  dUsage $optlist 
6b90: 24 75 73 61 67 65 5d 20 55 53 41 47 45 0a 20 20  $usage] USAGE.  
6ba0: 20 20 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20    }.    foreach 
6bb0: 7b 6f 70 74 20 64 66 6c 74 7d 20 5b 61 72 72 61  {opt dflt} [arra
6bc0: 79 20 67 65 74 20 64 65 66 61 75 6c 74 73 5d 20  y get defaults] 
6bd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  {.        if {![
6be0: 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 73 75  info exists resu
6bf0: 6c 74 28 24 6f 70 74 29 5d 7d 20 7b 0a 20 20 20  lt($opt)]} {.   
6c00: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73           set res
6c10: 75 6c 74 28 24 6f 70 74 29 20 24 64 66 6c 74 0a  ult($opt) $dflt.
6c20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
6c30: 20 20 20 20 72 65 74 75 72 6e 20 5b 61 72 72 61      return [arra
6c40: 79 20 67 65 74 20 72 65 73 75 6c 74 5d 0a 7d 0a  y get result].}.
6c50: 0a 23 20 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 74 79  .# ::cmdline::ty
6c60: 70 65 64 55 73 61 67 65 20 2d 2d 0a 23 0a 23 09  pedUsage --.#.#.
6c70: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
6c80: 72 20 6d 65 73 73 61 67 65 20 74 68 61 74 20 6c  r message that l
6c90: 69 73 74 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  ists the allowed
6ca0: 20 66 6c 61 67 73 2c 0a 23 09 74 79 70 65 20 6f   flags,.#.type o
6cb0: 66 20 61 72 67 75 6d 65 6e 74 20 74 61 6b 65 6e  f argument taken
6cc0: 20 28 69 66 20 61 6e 79 29 2c 20 64 65 66 61 75   (if any), defau
6cd0: 6c 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79  lt value (if any
6ce0: 29 2c 0a 23 09 61 6e 64 20 61 6e 20 6f 70 74 69  ),.#.and an opti
6cf0: 6f 6e 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  onal description
6d00: 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
6d10: 0a 23 09 6f 70 74 6c 69 73 74 09 09 41 73 20 66  .#.optlist..As f
6d20: 6f 72 20 63 6d 64 6c 69 6e 65 3a 3a 74 79 70 65  or cmdline::type
6d30: 64 47 65 74 6f 70 74 69 6f 6e 73 0a 23 0a 23 20  dGetoptions.#.# 
6d40: 52 65 73 75 6c 74 73 0a 23 09 41 20 66 6f 72 6d  Results.#.A form
6d50: 61 74 74 65 64 20 75 73 61 67 65 20 6d 65 73 73  atted usage mess
6d60: 61 67 65 0a 0a 70 72 6f 63 20 3a 3a 63 6d 64 6c  age..proc ::cmdl
6d70: 69 6e 65 3a 3a 74 79 70 65 64 55 73 61 67 65 20  ine::typedUsage 
6d80: 7b 6f 70 74 6c 69 73 74 20 7b 75 73 61 67 65 20  {optlist {usage 
6d90: 7b 6f 70 74 69 6f 6e 73 3a 7d 7d 7d 20 7b 0a 20  {options:}}} {. 
6da0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 68 61 72     variable char
6db0: 63 6c 61 73 73 65 73 0a 0a 20 20 20 20 73 65 74  classes..    set
6dc0: 20 73 74 72 20 22 5b 67 65 74 41 72 67 76 30 5d   str "[getArgv0]
6dd0: 20 24 75 73 61 67 65 5c 6e 22 0a 20 20 20 20 66   $usage\n".    f
6de0: 6f 72 65 61 63 68 20 6f 70 74 20 5b 63 6f 6e 63  oreach opt [conc
6df0: 61 74 20 24 6f 70 74 6c 69 73 74 20 5c 0a 20 20  at $optlist \.  
6e00: 20 20 20 20 20 20 20 20 20 20 7b 7b 68 65 6c 70            {{help
6e10: 20 22 50 72 69 6e 74 20 74 68 69 73 20 6d 65 73   "Print this mes
6e20: 73 61 67 65 22 7d 20 7b 3f 20 22 50 72 69 6e 74  sage"} {? "Print
6e30: 20 74 68 69 73 20 6d 65 73 73 61 67 65 22 7d 7d   this message"}}
6e40: 5d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  ] {.        set 
6e50: 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 6f 70  name [lindex $op
6e60: 74 20 30 5d 0a 20 20 20 20 20 20 20 20 69 66 20  t 0].        if 
6e70: 7b 5b 72 65 67 73 75 62 20 2d 2d 20 7b 5c 2e 73  {[regsub -- {\.s
6e80: 65 63 72 65 74 24 7d 20 24 6e 61 6d 65 20 7b 7d  ecret$} $name {}
6e90: 20 6e 61 6d 65 5d 20 3d 3d 20 31 7d 20 7b 0a 20   name] == 1} {. 
6ea0: 20 20 20 20 20 20 20 20 20 20 20 23 20 48 69 64             # Hid
6eb0: 64 65 6e 20 6f 70 74 69 6f 6e 0a 0a 20 20 20 20  den option..    
6ec0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
6ed0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65           if {[re
6ee0: 67 73 75 62 20 2d 2d 20 7b 5c 2e 6d 75 6c 74 69  gsub -- {\.multi
6ef0: 24 7d 20 24 6e 61 6d 65 20 7b 7d 20 6e 61 6d 65  $} $name {} name
6f00: 5d 20 3d 3d 20 31 7d 20 7b 0a 20 20 20 20 20 20  ] == 1} {.      
6f10: 20 20 20 20 20 20 20 20 20 20 23 20 44 69 73 70            # Disp
6f20: 6c 61 79 20 73 6f 6d 65 74 68 69 6e 67 20 61 62  lay something ab
6f30: 6f 75 74 20 6d 75 6c 74 69 70 6c 65 20 6f 70 74  out multiple opt
6f40: 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20  ions.           
6f50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
6f60: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 22  if {[regexp -- "
6f70: 5c 5c 2e 28 61 72 67 7c 24 63 68 61 72 63 6c 61  \\.(arg|$charcla
6f80: 73 73 65 73 29 5c 24 22 20 24 6e 61 6d 65 20 64  sses)\$" $name d
6f90: 75 6d 6d 79 20 63 68 61 72 63 6c 61 73 73 5d 0a  ummy charclass].
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 20 7c 7c 20 5b 72 65 67 65 78 70 20 2d      || [regexp -
6fc0: 2d 20 7b 5c 2e 5c 28 28 5b 5e 29 5d 2b 29 5c 29  - {\.\(([^)]+)\)
6fd0: 7d 20 24 6f 70 74 20 64 75 6d 6d 79 20 63 68 61  } $opt dummy cha
6fe0: 72 63 6c 61 73 73 5d 7d 20 7b 0a 20 20 20 20 20  rclass]} {.     
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7000: 67 73 75 62 20 2d 2d 20 22 5c 5c 2e 2e 2b 5c 24  gsub -- "\\..+\$
7010: 22 20 24 6e 61 6d 65 20 7b 7d 20 6e 61 6d 65 0a  " $name {} name.
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 73 65 74 20 63 6f 6d 6d 65 6e 74 20 5b 6c 69 6e  set comment [lin
7040: 64 65 78 20 24 6f 70 74 20 32 5d 0a 20 20 20 20  dex $opt 2].    
7050: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7060: 64 65 66 61 75 6c 74 20 22 3c 5b 6c 69 6e 64 65  default "<[linde
7070: 78 20 24 6f 70 74 20 31 5d 3e 22 0a 20 20 20 20  x $opt 1]>".    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
7090: 24 64 65 66 61 75 6c 74 20 3d 3d 20 22 3c 3e 22  $default == "<>"
70a0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
70b0: 20 20 20 20 20 20 20 20 73 65 74 20 64 65 66 61          set defa
70c0: 75 6c 74 20 22 22 0a 20 20 20 20 20 20 20 20 20  ult "".         
70d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
70e0: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
70f0: 73 74 72 20 5b 66 6f 72 6d 61 74 20 22 20 25 2d  str [format " %-
7100: 32 30 73 20 25 73 20 25 73 5c 6e 22 20 22 2d 24  20s %s %s\n" "-$
7110: 6e 61 6d 65 20 24 63 68 61 72 63 6c 61 73 73 22  name $charclass"
7120: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
7130: 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 6d             $comm
7140: 65 6e 74 20 24 64 65 66 61 75 6c 74 5d 0a 20 20  ent $default].  
7150: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
7160: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7170: 20 20 20 73 65 74 20 63 6f 6d 6d 65 6e 74 20 5b     set comment [
7180: 6c 69 6e 64 65 78 20 24 6f 70 74 20 31 5d 0a 09  lindex $opt 1]..
7190: 09 61 70 70 65 6e 64 20 73 74 72 20 5b 66 6f 72  .append str [for
71a0: 6d 61 74 20 22 20 25 2d 32 30 73 20 25 73 5c 6e  mat " %-20s %s\n
71b0: 22 20 22 2d 24 6e 61 6d 65 22 20 24 63 6f 6d 6d  " "-$name" $comm
71c0: 65 6e 74 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ent].           
71d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
71e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 73   }.    return $s
71f0: 74 72 0a 7d 0a 0a 23 20 3a 3a 63 6d 64 6c 69 6e  tr.}..# ::cmdlin
7200: 65 3a 3a 70 72 65 66 69 78 53 65 61 72 63 68 20  e::prefixSearch 
7210: 2d 2d 0a 23 0a 23 09 53 65 61 72 63 68 20 61 20  --.#.#.Search a 
7220: 54 63 6c 20 6c 69 73 74 20 66 6f 72 20 61 20 70  Tcl list for a p
7230: 61 74 74 65 72 6e 3b 20 73 65 61 72 63 68 65 73  attern; searches
7240: 20 66 69 72 73 74 20 66 6f 72 20 61 6e 20 65 78   first for an ex
7250: 61 63 74 20 6d 61 74 63 68 2c 0a 23 09 61 6e 64  act match,.#.and
7260: 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
7270: 66 6f 72 20 61 20 75 6e 69 71 75 65 20 70 72 65  for a unique pre
7280: 66 69 78 20 74 68 61 74 20 6d 61 74 63 68 65 73  fix that matches
7290: 20 74 68 65 20 70 61 74 74 65 72 6e 20 0a 23 09   the pattern .#.
72a0: 28 69 2e 65 2c 20 66 69 72 73 74 20 22 6c 73 65  (i.e, first "lse
72b0: 61 72 63 68 20 2d 65 78 61 63 74 22 2c 20 74 68  arch -exact", th
72c0: 65 6e 20 22 6c 73 65 61 72 63 68 20 2d 67 6c 6f  en "lsearch -glo
72d0: 62 20 24 70 61 74 74 65 72 6e 2a 22 0a 23 0a 23  b $pattern*".#.#
72e0: 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 09 6c 69   Arguments:.#.li
72f0: 73 74 09 09 6c 69 73 74 20 6f 66 20 77 6f 72 64  st..list of word
7300: 73 0a 23 09 70 61 74 74 65 72 6e 09 09 77 6f 72  s.#.pattern..wor
7310: 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 0a  d to search for.
7320: 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 49  #.# Results:.#.I
7330: 6e 64 65 78 20 6f 66 20 66 6f 75 6e 64 20 77 6f  ndex of found wo
7340: 72 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  rd is returned. 
7350: 49 66 20 6e 6f 20 65 78 61 63 74 20 6d 61 74 63  If no exact matc
7360: 68 20 6f 72 0a 23 09 75 6e 69 71 75 65 20 73 68  h or.#.unique sh
7370: 6f 72 74 20 76 65 72 73 69 6f 6e 20 69 73 20 66  ort version is f
7380: 6f 75 6e 64 20 74 68 65 6e 20 2d 31 20 69 73 20  ound then -1 is 
7390: 72 65 74 75 72 6e 65 64 2e 0a 0a 70 72 6f 63 20  returned...proc 
73a0: 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 70 72 65 66 69  ::cmdline::prefi
73b0: 78 53 65 61 72 63 68 20 7b 6c 69 73 74 20 70 61  xSearch {list pa
73c0: 74 74 65 72 6e 7d 20 7b 0a 20 20 20 20 23 20 43  ttern} {.    # C
73d0: 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 61 63  heck for an exac
73e0: 74 20 6d 61 74 63 68 0a 0a 20 20 20 20 69 66 20  t match..    if 
73f0: 7b 5b 73 65 74 20 70 6f 73 20 5b 3a 3a 6c 73 65  {[set pos [::lse
7400: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6c 69 73  arch -exact $lis
7410: 74 20 24 70 61 74 74 65 72 6e 5d 5d 20 3e 20 2d  t $pattern]] > -
7420: 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  1} {.        ret
7430: 75 72 6e 20 24 70 6f 73 0a 20 20 20 20 7d 0a 0a  urn $pos.    }..
7440: 20 20 20 20 23 20 43 68 65 63 6b 20 66 6f 72 20      # Check for 
7450: 61 20 75 6e 69 71 75 65 20 73 68 6f 72 74 20 76  a unique short v
7460: 65 72 73 69 6f 6e 0a 0a 20 20 20 20 73 65 74 20  ersion..    set 
7470: 73 6c 69 73 74 20 5b 6c 73 6f 72 74 20 24 6c 69  slist [lsort $li
7480: 73 74 5d 0a 20 20 20 20 69 66 20 7b 5b 73 65 74  st].    if {[set
7490: 20 70 6f 73 20 5b 3a 3a 6c 73 65 61 72 63 68 20   pos [::lsearch 
74a0: 2d 67 6c 6f 62 20 24 73 6c 69 73 74 20 24 70 61  -glob $slist $pa
74b0: 74 74 65 72 6e 2a 5d 5d 20 3e 20 2d 31 7d 20 7b  ttern*]] > -1} {
74c0: 0a 20 20 20 20 20 20 20 20 23 20 57 68 61 74 20  .        # What 
74d0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  if there is noth
74e0: 69 6e 67 20 66 6f 72 20 74 68 65 20 63 68 65 63  ing for the chec
74f0: 6b 20 76 61 72 69 61 62 6c 65 3f 0a 0a 20 20 20  k variable?..   
7500: 20 20 20 20 20 73 65 74 20 63 68 65 63 6b 20 5b       set check [
7510: 6c 69 6e 64 65 78 20 24 73 6c 69 73 74 20 5b 65  lindex $slist [e
7520: 78 70 72 20 7b 24 70 6f 73 20 2b 20 31 7d 5d 5d  xpr {$pos + 1}]]
7530: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
7540: 72 69 6e 67 20 66 69 72 73 74 20 24 70 61 74 74  ring first $patt
7550: 65 72 6e 20 24 63 68 65 63 6b 5d 20 21 3d 20 30  ern $check] != 0
7560: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
7570: 72 65 74 75 72 6e 20 5b 3a 3a 6c 73 65 61 72 63  return [::lsearc
7580: 68 20 2d 65 78 61 63 74 20 24 6c 69 73 74 20 5b  h -exact $list [
7590: 6c 69 6e 64 65 78 20 24 73 6c 69 73 74 20 24 70  lindex $slist $p
75a0: 6f 73 5d 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20  os]].        }. 
75b0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
75c0: 2d 31 0a 7d 0a 23 20 3a 3a 63 6d 64 6c 69 6e 65  -1.}.# ::cmdline
75d0: 3a 3a 45 72 72 6f 72 20 2d 2d 0a 23 0a 23 09 49  ::Error --.#.#.I
75e0: 6e 74 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 74  nternal helper t
75f0: 6f 20 74 68 72 6f 77 20 65 72 72 6f 72 73 20 77  o throw errors w
7600: 69 74 68 20 61 20 70 72 6f 70 65 72 20 65 72 72  ith a proper err
7610: 6f 72 2d 63 6f 64 65 20 61 74 74 61 63 68 65 64  or-code attached
7620: 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
7630: 0a 23 09 6d 65 73 73 61 67 65 09 09 74 65 78 74  .#.message..text
7640: 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
7650: 73 73 61 67 65 20 74 6f 20 74 68 72 6f 77 2e 0a  ssage to throw..
7660: 23 09 61 72 67 73 09 09 61 64 64 69 74 69 6f 6e  #.args..addition
7670: 61 6c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  al parts of the 
7680: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 75 73  error code to us
7690: 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e,.#            
76a0: 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20             with 
76b0: 43 4d 44 4c 49 4e 45 20 61 73 20 62 61 73 69 63  CMDLINE as basic
76c0: 20 70 72 65 66 69 78 20 61 64 64 65 64 20 62 79   prefix added by
76d0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 2e 0a 23   this command..#
76e0: 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 41 6e  .# Results:.#.An
76f0: 20 65 72 72 6f 72 20 69 73 20 74 68 72 6f 77 6e   error is thrown
7700: 2c 20 61 6c 77 61 79 73 2e 0a 0a 70 72 6f 63 20  , always...proc 
7710: 3a 3a 63 6d 64 6c 69 6e 65 3a 3a 45 72 72 6f 72  ::cmdline::Error
7720: 20 7b 6d 65 73 73 61 67 65 20 61 72 67 73 7d 20   {message args} 
7730: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f  {.    return -co
7740: 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63  de error -errorc
7750: 6f 64 65 20 5b 6c 69 6e 73 65 72 74 20 24 61 72  ode [linsert $ar
7760: 67 73 20 30 20 43 4d 44 4c 49 4e 45 5d 20 24 6d  gs 0 CMDLINE] $m
7770: 65 73 73 61 67 65 0a 7d 0a                       essage.}.