antsusage.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 27 Nov 2018 15:40:03 -0500
changeset 37 b24d11f7dfc4
parent 35 d3f6ca34c4ea
child 47 dde46143288c
permissions -rw-r--r--
V7.1 corrected
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#/usr/bin/perl
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    A N T S U S A G E . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    doc: Fri Jun 19 13:43:05 1998
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
     5
#                    dlm: Wed Dec 13 09:09:58 2017
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1998 A.M. Thurnherr
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
     7
#                    uE-Info: 167 49 NIL 0 0 70 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Dec 30, 1998: - removed directory from $0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#				  - added global -P option (pass comments)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Jan 02, 1999: - changed -P to -T and added -P)refix for [./fnr]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
# 	Feb 08,	1999: - added &antsUsageError()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Feb 17, 1999: - added -N
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Feb 28, 1999: - forced string interpretation for -O, -R, -I
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Mar 08, 1999: - added -L, $antsLibs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Mar 20, 1999: - added exit(1) for unknown options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#				  - added optional argument to &antsUsageError()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	May 28, 1999: - library loading generated headers even on -Q
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	Jun 31, 1999: - added &antsDescription()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	Jul 31, 1999: - added parameter typechecking (field, float, card, int, file)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Aug 02, 1999: - changed &antsDescription() to be option-dependent
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	Sep 18, 1999: - added option delimiter --
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#				  - treat cardinals & integers differently
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#				  - added option typechecking funs, e.g. &antsIntOpt()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#				  - auto set -Q if stdout is tty
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Sep 19, 1999: - changed &getopts() from Perl4 to Perl5
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	Sep 21, 1999: - load local libraries first
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Mar 06, 2000: - added for-M)at
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Mar 07, 2000: - worked on -M
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Aug 24, 2000: - removed setting -Q on tty (bad for [yoyo] and [Split])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Aug 28, 2000: - added -Z
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#				  - changed -P to -A
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#				  - added new -P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	Sep 19, 2000: - set opt_M (dodgily) if not specifically set (only affects
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#					[count] so far)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	Sep 20, 2000: - added []-syntax to -P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#				  - added workaround for -M %0xd bug
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	Sep 25, 2000: - changed order of -P and -L processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	Sep 26, 2000: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	Nov 13, 2000: - BUG: -- had left a single empty argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	Nov 15, 2000: - added &antsParamParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#				  - added &antsFileOpt()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	Nov 17, 2000: - made -P override any header PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	Jan  4, 2001: - moved -L processing before -P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	Feb  8, 2001: - added -G)range option
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#   Mar 17, 2001: - param->arg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#				  - added @file:field argument syntax
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#				  - added #num-num[:step] syntax
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	Mar 23, 2001: - added prefix{#-#}suff syntax
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	Mar 31, 2001: - changed -G)range to #[..#]{,#[..#}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#				  - added -F)ields f{,f}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#	Apr  3, 2001: - added +f syntax to -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#	Apr  5, 2001: - added f+ syntax to -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#	Apr 24, 2001: - removed err msg in case of -G f:* (select numbers)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#	Apr 30, 2001: - shortened date, added pwd
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#	Jun 23, 2001: - removed default setting of $opt_M
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#	Jul  6, 2001: - added degree notation to &antsFloatArg() via str2num()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#	Jul 10, 2001: - added select field names (for V.3)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#	Jul 13, 2001: - store ONLY field names (replaced on 1st use)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#				  - added quotes to usage history
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#	Jul 15, 2001: - added &antsNewFieldOpt()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
#	Jul 16, 2001: - made it work with Description again
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
#	Jul 24, 2001: - removed fnr lookup on -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#	Jul 30, 2001: - BUG: made parseHeader conditional on $antsFixedFormat
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#	Aug  9, 2001: - chgd pref{#-#}suff syntax to expand only to exist files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#	Oct 28, 2001: - BUG: added -K handling before parseHeader
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#	Nov 22, 2001: - moved logic into &antsParseHeader()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#	Nov 28, 2001: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#	Jan 18, 2002: - old -N => -X; new -N
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#	Mar 24, 2002: - BUG: &antsFieldArg('file') did not handle %PARAMs correctly
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#	Jul 26, 2002: - removed common usage from antsUsageError unless -U is set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
#	Jan  6, 2003: - added regexp option to -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
#	Feb  9, 2003: - BUG: {103-103}.ens hung
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
#	Jun 26, 2004: - made sure that near-zero \#args are rounded to zero
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
#	Jun 27, 2004: - BUG: \#22-14 did not work correctly any more
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
#	Jul 12, 2004: - removed &antsDescription()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
#	May  5, 2005: - added &antsNewField()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
#	May 17, 2005: - allowed &antsFieldArg() to check [Layout]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
#	Nov  1, 2005: - disallowed numeric options by adding -- if first argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#				    begins with -[0-9]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
#	Nov  8, 2005: - removed -P, -T => -P, -Z => -T, added -Z
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
#	Nov 17, 2005: - removed $antsLibs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#				  - removed remainder of -D
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
#				  - added $antsARGV0 for [yoyo]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
#				  - added !<arg> quoting (for filenames)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#	Nov 18, 2005: - finally allowed %PARAMs in -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
#	Nov 21, 2005: - BUG: had not been allowed in -G fieldname
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
#   Dec  7, 2005: - antsFName -> antsLayout (not tested)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
#	Dec  9, 2005: - Version 3.2 (see [HISTORY])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
#	Dec 11, 2005: - error on 0 args & tty stdin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
#	Dec 20, 2005: - created &antsFieldInFileArg() & added flag to &antsFieldArg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#				  - simplified opt_M, because it now works w/o $#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
#	Dec 22, 2005: - added $antsInteractive for [abc]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
#   Dec 23, 2005: - replaced defined(@array) (c.f. perlfunc(1))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
#	Dec 31, 2005: - BUG: @-notation was broken (used antique [fields]!!!)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
#	Jan  3, 2006: - added support for -S)elect
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
#	Jan  9, 2006: - removed old line-masking code
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
#	Jan 12, 2006: - removed -A support
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
#				  - removed support for $ENV{ANTS}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
#				  - changed from old -H)eader <skip> to -H)ead <n lines>
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
#	Jan 13, 2006: - moved -G handling to -S
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
#				  - BUG: -G regexpr did not allow :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
#				  - renamed -T)rim to -C)anonical
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
#				  - removed warnings on -M/-C
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
#				  - removed weird -Z)ap
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
#	Jan 14, 2006: - removed -G (now handled by -S)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
#				  - changed semantics of pref{#-#}suff special arg to
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
#					expand non-existing file names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
#	Jul 28, 2006: - made special arg #-#:# numerically more robust
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
#	Aug 18, 2006: - improved special arg to pref{#,#-#,...} and allow / instead of ,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#	Dec 14, 2006: - exported handling of -X to [antsio.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
#				  - disallow -P & -Q
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
#	May 31, 2007: - added -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
#	Nov 28, 2007: - replaced / by + to separate ranges in {} arguments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
#	Mar  4, 2008: - disallow partial fname matches in antsNewField*()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
#	Mar 24, 2008: - new usage formatting (glorious!)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
#	Mar 25, 2008: - added $antsSummary
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
#   Mar 26, 2008: - extended -F syntax
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
#	Mar 27, 2008: - modified &antsUsage() to allow disabling common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
#	Apr 24, 2008: - added &antsFieldListOpt()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
#	May  7, 2008: - disabled -N/-S for utilities without header parsing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
#	May 13, 2008: - moved -U to standard usage message
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
#	Aug  5, 2008: - suppress empty usage lines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
#   Nov 12, 2008: - added opt_T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
#	Aug 24, 2009: - added V4 dependency on @file:field special args, file args & opts
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
#	Oct  3, 2009: - BUG: sometime recently I had changed the pref{}suff semantics to be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
#				    much more permissive; this led to problems as args like {print $0}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
#					were erroneously expanded; changed => pref{}suff is only expanded
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
#					if first expanded element is existing file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
#				  - special args expanding to zilch are not expanded any more
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
#	Aug 16, 2010: - added -A)ctivate output (F/S Poseidon, P403, Lucky Strike)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
#	Aug 28, 2010: - added suppress -D)ependency check option
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
#				  - improve common-options usage help
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
#	Oct 15, 2010: - removed diagnostic output about loading libs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
#	Oct 29, 2010: - replaced list by Cat in expansion of @-special args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
#	Dec 21, 2010: - made $@ at end of -F list optional (i.e. -F can end with ,)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
#	Jul 21, 2011: - modified -D usage info
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
#	Sep 19, 2011: - SEMANTICS: pref{#-#}suff does now produce warning on missing files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
#	Oct  3, 2011: - BUG: pref{}suff special args were (again) too permissive and matched
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
#						 output formats; this time, I solved problem by making regexp
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
#						 more restrictive; if this does not work, I can go back to
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
#					     earlier solution (see BUG Oct 3 2009)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
#	Oct 16, 2011: - added support for \, escape in -F to protect commas used, e.g. in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
#					function calls, from splitting the opt_F argument string
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
#	Nov 11, 2011: - BUG: antsNewField did not work for external layouts
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
#	Dec 29, 2011: - BUG: antsNewField did not work Cat -f c=1,1,10 without input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
#				  - BUG: antsNewField did still not work for external layouts (the bug
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
#						 resulted in always extending the layout, even when the field already
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
#						 existed)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
#	Feb 13, 2012: - antsNewFieldOpt simplified by using 2nd arg to fnrNoErr
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   153
#	Oct 29, 2012: - diabled "no file" messages on special args
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   154
#	Mar 29, 2013: - added support for $ANTSLIBS
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   155
#	Apr  2, 2013: - BUG: pref{}suff special args did sometimes produce unexpanded as well
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   156
#						 as expanded output (unexpanded should be produced only if the
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   157
#						 expansion is empty)
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   158
#	Jul 30, 2014: - added special args to -U)sage output
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   159
#	Jan 30, 2015: - added &antsFunOpt()
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   160
#	Jan 31, 2015: - made it work
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   161
#	May 15, 2015: - changed (()) semantics to expand only to existing files
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   162
#	Aug 24, 2016: - removed -ve number heuristics (unshifting a -- under certain conditions),
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   163
#				  	which I believe is ancient
32
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   164
#	Aug 30, 2017: - BUG: new (()) semantics did not work for single-value ranges
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   165
#	Dec  9, 2017: - added -E, $antsSuppressCommonOptions
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   166
#				  - common options cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   167
#	Dec 13, 2017: - BUG: common options cosmetics
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
#	- ksh expands {}-arguments with commas in them!!! Use + instead
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
use Getopt::Std;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
sub antsUsageError() {									# die with Usage error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
	if (defined($antsSummary)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
		print(STDERR "\n$0 -- $antsSummary\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
		print(STDERR "\n$0\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
	if ($opt_U) {
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   181
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n\n" .
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   182
			"Common Input Options:\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   183
	            "\t[-I)nput <field-separator>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   184
				"\t[-S)elect <addr-expr>] [-N)ums f[,...]] [-H)ead <n lines>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   185
				"\t[-L)oad <lib,...>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   186
				"\t[allows -E)mbedded layout changes]\n\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   187
			"Common Output Options:\n" .
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   188
				"\t[-F)ields {%P|f|[\$@]|[f]=expr}[,...]]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   189
				"\t[num for-M)at] [-C)anonical numbers] [-G)eographic lat/lon]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   190
				"\t[-A)ctivate output] [LaTeX -T)able output]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   191
				"\t[-P)ass comments] [-Q)uiet (no headers)] [-X (no new header)]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   192
				"\t[suppress -D)ependency checks & addition of new dependencies]\n" .
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   193
	            "\t[-O)utput <field-separator>] [output -R)ecord <separator>]\n\n" .
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   194
			"Special Argument Expansion:\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   195
				"\t@<file>:<field>\t\t\t<field> values in <file>\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   196
				"\t#<from>-<to>[:<step>]\t\tenumerated values\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   197
				"\t[prefix]{<ranges>}[suffix]\texisting files (ranges: <from>[-<to>][+...])\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   198
				"\t[prefix]((<file>))[suffix]\tfiles, using <file> with ranges\n");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
	croak("\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
# NB: "-" as first char in opts string disables common-option processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
sub antsUsage($$@) {									# handle options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
	my($opts,$min,@usage) = @_;
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   209
	my($cOpts) = 'ADEM:QN:XCGPH:UI:O:R:L:F:S:T';
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	my($d,$p);
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   211
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   212
	if ($antsSuppressCommonOptions) {					# non-core utilites (e.g. LADCP_w) do not use common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   213
		$cOpts = ''
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   214
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   215
		$antsCurUsage .= "\n\t[print full -U)sage]"
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   216
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   217
	
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
	foreach my $uln (@usage) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
		$antsCurUsage .= "\n\t$uln"						# suppress emtpy, e.g.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
			unless ($uln eq '');						# for interp. model usage
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	&antsUsageError()									# no args && tty stdin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
		if (!$antsInteractive && $min == 0 && @ARGV == 0 && -t 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   226
#		The following line of code, disabled Aug 24, 2016, prevents
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   227
#		numerical options from working, e.g. in LADCP_w.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   228
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   229
#	unshift(@ARGV,'--') if ($ARGV[0] =~ /^-\d/);		# -ve number heuristics
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	chomp($0 = `basename $0`);							# set scriptname
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	chop($d = `date +%D`);								# build header line
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	chop($p = `pwd`);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	$p = "..." . substr($p,-17) if (length($p) > 20);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	$antsCurHeader = "#ANTS# [$d $p] $0";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	my($i,$eoo);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
		$antsCurHeader .= " '$ARGV[$i]'";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
		$eoo = 1 if ($ARGV[$i] eq '--');				# -- handling
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
		$ARGV[$i] = "!$ARGV[$i+1]" if ($eoo); 			# make -ve non-options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
	$antsCurHeader .= "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
	pop(@ARGV) if ($eoo);								# remove last ARG
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
	if ($opts =~ m{^-}) {								# no common options processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
		$opts = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
		undef($cOpts);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
	&antsUsageError(), exit(1)							# parse options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
		unless (&getopts($cOpts . $opts));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
	unless ($antsParseHeader) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
		croak("$0: -S not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
			if defined($opt_S);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
		croak("$0: -N not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
			if defined($opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
	if ($eoo) {											# reset args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
		for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
			$ARGV[$i] = substr($ARGV[$i],1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
	if (defined($cOpts)) {								# process common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
		croak("$0: illegal option combination (-P & -Q)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
			if ($opt_P && $opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
		&antsActivateOut() if ($opt_A);					# activate output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   272
		$antsAllowEmbeddedLayoutChange = $opt_E;		# allow embedded layout changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   273
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
		if ($opt_T) {									# LaTeX table output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
			croak("$0: illegal option combination (-T & -G)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
				if ($opt_G);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
			croak("$0: illegal option combination (-T & -O)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
				if defined($opt_O);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
			$opt_O = ' & ';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
			croak("$0: illegal option combination (-T & -R)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
				if defined($opt_R);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
			$opt_R = ' \\\\\\\\\n';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
        
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
		if (defined($opt_I)) {							# defaults
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
			eval('$opt_I = "' . $opt_I .'";');			# interpret strings 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
		} else {										# ... as perl strings
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
			$opt_I = '\s+';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
		if (defined($opt_O)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
			eval('$opt_O = "' . $opt_O .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
			$opt_O = "\t";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
		if (defined($opt_R)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
			eval('$opt_R = "' . $opt_R .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
			$opt_R = "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
		if (defined($opt_L)) {							# load libraries
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
			foreach $lib (split(',',$opt_L)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
				if (-r "lib$lib.pl") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
					require "lib$lib.pl";
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   305
				} elsif (-r "$ANTS/lib$lib.pl") {
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   306
					require "$ANTS/lib$lib.pl";
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   307
				} elsif (-r "$ANTSLIBS/lib$lib.pl") {
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   308
					require "$ANTSLIBS/lib$lib.pl";
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
				} else {
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   310
					croak("$0: cannot load {.,$ANTS,$ANTSLIBS}/lib$lib.pl\n");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
		if (defined($opt_N)) {							# parse -N)ums
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
			@antsNFNames = split(',',$opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
		if (defined($opt_F)) {							# parse -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
			$opt_F =~ s/\\,/aNtScOmMa/g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
			@antsOutExprs = split(',',$opt_F);	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			push(@antsOutExprs,'$@') if ($opt_F =~ /,$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
			foreach my $e (@antsOutExprs) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
				$e =~ s/aNtScOmMa/,/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
	my($ai);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
	for ($ai=0; $ai<=$#ARGV; $ai++) {					# parse special args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
		my(@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
		if ($ARGV[$ai] =~ /^@([^:]+):(.+)/) {			# @file:field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
			&antsAddDeps($1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
			@exp = `Cat -QF$2 $1`;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
			croak("(...while expanding $ARGV[$ai])\n") if ($?);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
		} elsif ($ARGV[$ai] =~ /^#(-?[\d\.]+)-(-?[\d\.]+):?(-?[\d\.]+)?/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
			my($step) = 1;								# #num-num:step
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
			if (defined($3)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
				$step = $3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
			} elsif ($2 < $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
				$step = -1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
			if ($step > 0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
				for (my($c)=0,my($i)=$1; $i<=$2+$step/1e6; $c++,$i=$1+$c*$step) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
					push(@exp,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
				for (my($c)=0,my($i)=$1; $i>=$2+$step/1e6; $c++,$i=$1+$c*$step) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
					push(@exp,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
		} elsif ($ARGV[$ai] =~ m{\{([-\+,\d]+)\}}) {	# pref{list of ranges}suff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
			my($pref) = $`; my($suff) = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
			foreach my $range (split('[,\+]',$1)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
				if ($range =~ /^(\d+)-(\d+)$/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
					my($fmt) = length($1)==length($2) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
							   sprintf("$pref%%0%dd$suff",length($1)) : "$pref%d$suff";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
					if ($2 > $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
						for (my($i)=$1; $i<=$2; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   364
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
						}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
					} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
						for (my($i)=$1; $i>=$2; $i--) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   370
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
	                    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
	                }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
					my($f) = "$pref$range$suff";
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   375
#					print(STDERR "f = $pref . $range . $suff\n");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
					if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   377
#					else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
	            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
	        }
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   380
			@exp = ($ARGV[$ai])							# make sure it *was* special arg
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   381
				unless (@exp);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   382
		} elsif ($ARGV[$ai] =~ m{\(\(([^\)]+)\)\)}) {		# pref((file))suff
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   383
			my($pref) = $`; my($suff) = $';
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   384
			&antsAddDeps($1);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   385
			open(F,$1) || croak("$1: $!\n");
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   386
			while (<F>) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   387
				s/#.*//g; next if /^\s+$/;					# handle comments and empty lines
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   388
				s/\s*//g;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   389
				chomp($_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   390
				if ($_ =~ /^(\d+)-(\d+)$/) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   391
					my($fmt) = length($1)==length($2) ?
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   392
							   sprintf("$pref%%0%dd$suff",length($1)) : "$pref%d$suff";
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   393
					if ($2 > $1) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   394
						for (my($i)=$1; $i<=$2; $i++) {
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   395
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   396
							push(@exp,$f) if (-f $f);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   397
						}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   398
					} else {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   399
						for (my($i)=$1; $i>=$2; $i--) {
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   400
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   401
							push(@exp,$f) if (-f $f);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   402
	                    }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   403
	                }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   404
				} else {
32
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   405
					push(@exp,"$pref$_$suff") if (-f "$pref$_$suff");
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   406
	            }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   407
	        }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   408
			close(F);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
		} else {										# regular argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
			next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
		&antsInfo("WARNING: special arg $ARGV[$ai] expands to nothing"),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
		push(@exp,$ARGV[$ai])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
			unless ($#exp >= 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
		splice(@ARGV,$ai,1,@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
	my($nargs) = $#ARGV + 1;							# check arg count
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
	&antsUsageError() if ($opt_U || ($min > 0) && ($nargs < $min));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
	$antsARGV0 = $ARGV[0];								# save 1st filename
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
	&antsParseHeader();									# get fields & params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
	for (my($i)=0; $i<=$#ARGV; $i++) {					# remove leading ! from args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
		$ARGV[$i] =~ s/^!//;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
	return $nargs;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
# argument typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
sub antsFieldInFileArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
	my($fn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
	open(F,$fn) || croak("$fn: $!\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
	if ($ARGV[0] =~ /^%/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
		croak("$0: no PARAM $ARGV[0] in $fn\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
			unless (defined(&antsFileScanParam(F,$')));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		$fnr = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
		$fnr = &antsFileScanFnr(F,$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
		unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
			print(STDERR "$0: WARNING: no field $ARGV[0] in $fn\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
			$fnr = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
		}	    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
    close(F);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
sub antsFieldArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
	my($paramsAllowed) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
	my($fnr) = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
	croak("$0: $ARGV[0] is not a field\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
		unless (numberp($fnr) || $paramsAllowed);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
sub antsFieldOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
			${$opt} = &fnr(${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
			${$opt} = &fnr($default);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
		return defined($opt) ? &fnr($opt) :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
					defined($default) ? &fnr($default) : $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
sub antsFieldListOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
	my(@fn) = split(',',$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
	my(@fi);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
	for (my($i)=0; $i<@fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
		$fi[$i] = &fnr($fn[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
	return @fi;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
sub antsNewField($)										# allocate if needed
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
	my($fname) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
	$fnr = &fnrNoErr($fname,1);							# exact match
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
	unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
		return $antsBufNFields++						# external layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
			unless ($antsBufNFields==0 || @antsLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
		@antsNewLayout = @antsLayout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
			unless (@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
		push(@antsNewLayout,$fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
		$fnr = $#antsNewLayout;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
	$antsBufNFields = $fnr+1 if ($fnr >= $antsBufNFields);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
sub antsNewFieldOpt(@)									# allocate if does not exist
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
	my($fname,$fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
			$fname = ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
		if (defined($fname)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
			$fnr = &antsNewField($fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
			${$opt} = $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
			return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
		} else { return undef; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
			$fname = $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
		} elsif (defined($default)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
		return defined($fname) ? &antsNewField($fname) : undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
sub antsNoFileErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
	croak("$0: $_[0] $_[1] is not a valid file\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
		unless (-r $_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
	&antsAddDeps($_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
sub antsFileArg()	# arg 1 => do not shift
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
	&antsNoFileErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
	my($res) = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
	shift(@ARGV) unless ($_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
sub antsFileOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
	&antsNoFileErr("Option Argument",$opt)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
		if (defined($opt));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
sub antsParamArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
	croak("$0: Argument $ARGV[0] is not a valid PARAM\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
		unless ($ARGV[0] =~ /^%/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
	return $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
sub antsNoCardErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
	croak("$0: $_[0] $_[1] is not a cardinal number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
		unless (cardinalp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
sub antsCardArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
	&antsNoCardErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
sub antsCardOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
			&antsNoCardErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
			&antsNoCardErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
sub antsNoIntErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
	croak("$0: $_[0] $_[1] is not an integer\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
		unless (integerp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
sub antsIntArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
	&antsNoIntErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
sub antsIntOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
			&antsNoIntErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
			&antsNoIntErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
sub antsNoFloatErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
	croak("$0: $_[0] $_[1] is not a number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
		unless (numberp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
sub antsFloatArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
	my($res) = str2num($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
	&antsNoFloatErr("Argument",$res);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
sub antsFloatOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
			&antsNoFloatErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   683
			&antsNoFloatErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   684
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   691
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   692
# antsFunOpt(\$opt_x) parses the contents of $opt_x as follows:
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   693
#
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   694
#	name(value)	=> $opt_x = 'name'; $name = "value";
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   695
#	name		=> no change
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   696
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   697
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   698
sub antsFunOpt(@)
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   699
{
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   700
	my($opt) = @_;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   701
	return unless defined($opt);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   702
	croak("antsusage.pl: antsFunOpt(@_): argument is not a ref\n")
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   703
		unless ref($opt);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   704
	my($name,$param) = (${$opt} =~ m{^([^\)]+)\(([^\)]+)\)$});
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   705
	return unless defined($param);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   706
	eval(sprintf('$%s = "%s";',$name,$param));
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   707
	${$opt} = $name;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   708
}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   709
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   710
1;														# return true