antsusage.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Sun, 02 Dec 2012 10:54:39 +0000
changeset 3 55a8c407d38e
parent 0 a5233793bf69
child 4 ff72b00b4342
permissions -rw-r--r--
.
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
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     5
#                    dlm: Mon Oct 29 12:08:54 2012
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1998 A.M. Thurnherr
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     7
#                    uE-Info: 153 62 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
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
#	- ksh expands {}-arguments with commas in them!!! Use + instead
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
use Getopt::Std;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
sub antsUsageError() {									# die with Usage error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
	if (defined($antsSummary)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
		print(STDERR "\n$0 -- $antsSummary\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
		print(STDERR "\n$0\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
	if ($opt_U) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n\nCommon options:\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
			"\t[-F)ields {%P|f|[\$@]|[f]=expr}[,...]]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
			"\t[num for-M)at] [-C)anonical numbers] [-G)eographic lat/lon]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
			"\t[-A)ctivate output] [LaTeX -T)able output]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
			"\t[-S)elect <addr-expr>] [-N)ums f[,...]] [-H)ead <n lines>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
			"\t[-P)ass comments] [-Q)uiet (no headers)] [-X (no new header)]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
			"\t[suppress -D)ependency checks & addition of new dependencies]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
			"\t[-L)oad <lib,...>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
			"\t[-I)n field-sep] [-O)ut field-sep] [-R)ecord sep]\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	croak("\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
# NB: "-" as first char in opts string disables common-option processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
sub antsUsage($$@) {									# handle options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
	my($opts,$min,@usage) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
	my($cOpts) = 'ADM:QN:XCGPH:UI:O:R:L:F:S:T';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
	my($d,$p);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
	$antsCurUsage .= "\n\t[print full -U)sage]";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
	foreach my $uln (@usage) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
		$antsCurUsage .= "\n\t$uln"						# suppress emtpy, e.g.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
			unless ($uln eq '');						# for interp. model usage
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
	&antsUsageError()									# no args && tty stdin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
		if (!$antsInteractive && $min == 0 && @ARGV == 0 && -t 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
	unshift(@ARGV,'--') if ($ARGV[0] =~ /^-\d/);		# -ve number heuristics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
	chomp($0 = `basename $0`);							# set scriptname
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
	chop($d = `date +%D`);								# build header line
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
	chop($p = `pwd`);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
	$p = "..." . substr($p,-17) if (length($p) > 20);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
	$antsCurHeader = "#ANTS# [$d $p] $0";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
	my($i,$eoo);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
	for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
		$antsCurHeader .= " '$ARGV[$i]'";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
		$eoo = 1 if ($ARGV[$i] eq '--');				# -- handling
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
		$ARGV[$i] = "!$ARGV[$i+1]" if ($eoo); 			# make -ve non-options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	$antsCurHeader .= "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
	pop(@ARGV) if ($eoo);								# remove last ARG
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
	if ($opts =~ m{^-}) {								# no common options processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
		$opts = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
		undef($cOpts);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
	&antsUsageError(), exit(1)							# parse options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
		unless (&getopts($cOpts . $opts));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
	unless ($antsParseHeader) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
		croak("$0: -S not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
			if defined($opt_S);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
		croak("$0: -N not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
			if defined($opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	if ($eoo) {											# reset args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
		for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
			$ARGV[$i] = substr($ARGV[$i],1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	if (defined($cOpts)) {								# process common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
		croak("$0: illegal option combination (-P & -Q)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
			if ($opt_P && $opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
		&antsActivateOut() if ($opt_A);					# activate output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
		if ($opt_T) {									# LaTeX table output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
			croak("$0: illegal option combination (-T & -G)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
				if ($opt_G);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
			croak("$0: illegal option combination (-T & -O)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
				if defined($opt_O);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
			$opt_O = ' & ';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
			croak("$0: illegal option combination (-T & -R)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
				if defined($opt_R);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
			$opt_R = ' \\\\\\\\\n';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
        
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
		if (defined($opt_I)) {							# defaults
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
			eval('$opt_I = "' . $opt_I .'";');			# interpret strings 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
		} else {										# ... as perl strings
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
			$opt_I = '\s+';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
		if (defined($opt_O)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
			eval('$opt_O = "' . $opt_O .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
			$opt_O = "\t";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
		if (defined($opt_R)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
			eval('$opt_R = "' . $opt_R .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
			$opt_R = "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
		if (defined($opt_L)) {							# load libraries
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
			foreach $lib (split(',',$opt_L)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
				if (-r "lib$lib.pl") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
#					&antsInfo("loading ./lib$lib.pl");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
					require "lib$lib.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
#					&antsInfo("loading $ANTS/lib$lib.pl"),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
					require "$ANTS/lib$lib.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
		if (defined($opt_N)) {							# parse -N)ums
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
			@antsNFNames = split(',',$opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
		if (defined($opt_F)) {							# parse -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
			$opt_F =~ s/\\,/aNtScOmMa/g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
			@antsOutExprs = split(',',$opt_F);	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
			push(@antsOutExprs,'$@') if ($opt_F =~ /,$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
			foreach my $e (@antsOutExprs) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
				$e =~ s/aNtScOmMa/,/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
	my($ai);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
	for ($ai=0; $ai<=$#ARGV; $ai++) {					# parse special args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
		my(@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		if ($ARGV[$ai] =~ /^@([^:]+):(.+)/) {			# @file:field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
			&antsAddDeps($1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
			@exp = `Cat -QF$2 $1`;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
			croak("(...while expanding $ARGV[$ai])\n") if ($?);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
		} elsif ($ARGV[$ai] =~ /^#(-?[\d\.]+)-(-?[\d\.]+):?(-?[\d\.]+)?/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
			my($step) = 1;								# #num-num:step
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
			if (defined($3)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
				$step = $3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
			} elsif ($2 < $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
				$step = -1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
			if ($step > 0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
				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
   310
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
					push(@exp,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
				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
   315
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
					push(@exp,$i);
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
#		} elsif ($ARGV[$ai] =~ m{\{([^\}]+)\}}) {		# pref{list of ranges}suff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
		} elsif ($ARGV[$ai] =~ m{\{([-\+,\d]+)\}}) {	# pref{list of ranges}suff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
			my($pref) = $`; my($suff) = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			foreach my $range (split('[,\+]',$1)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
				if ($range =~ /^(\d+)-(\d+)$/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
					my($fmt) = length($1)==length($2) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
							   sprintf("$pref%%0%dd$suff",length($1)) : "$pref%d$suff";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
					if ($2 > $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
						for (my($i)=$1; $i<=$2; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   330
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
						}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
					} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
						for (my($i)=$1; $i>=$2; $i--) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   336
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
	                    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	                }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
					my($f) = "$pref$range$suff";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
					if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   342
#					else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
	            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
				@exp = ($ARGV[$ai])						# make sure it *was* special arg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
					unless (@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
	        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
		} else {										# regular argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
			next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
		&antsInfo("WARNING: special arg $ARGV[$ai] expands to nothing"),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
		push(@exp,$ARGV[$ai])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
			unless ($#exp >= 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
		splice(@ARGV,$ai,1,@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
	my($nargs) = $#ARGV + 1;							# check arg count
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
	&antsUsageError() if ($opt_U || ($min > 0) && ($nargs < $min));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
	$antsARGV0 = $ARGV[0];								# save 1st filename
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
	&antsParseHeader();									# get fields & params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
	for (my($i)=0; $i<=$#ARGV; $i++) {					# remove leading ! from args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
		$ARGV[$i] =~ s/^!//;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
	return $nargs;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
# argument typechecking
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
sub antsFieldInFileArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
	my($fn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
	open(F,$fn) || croak("$fn: $!\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
	if ($ARGV[0] =~ /^%/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
		croak("$0: no PARAM $ARGV[0] in $fn\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
			unless (defined(&antsFileScanParam(F,$')));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
		$fnr = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
		$fnr = &antsFileScanFnr(F,$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
		unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
			print(STDERR "$0: WARNING: no field $ARGV[0] in $fn\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
			$fnr = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
		}	    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
    close(F);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
sub antsFieldArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
	my($paramsAllowed) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
	my($fnr) = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
	croak("$0: $ARGV[0] is not a field\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
		unless (numberp($fnr) || $paramsAllowed);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
sub antsFieldOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
			${$opt} = &fnr(${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
			${$opt} = &fnr($default);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
		return defined($opt) ? &fnr($opt) :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
					defined($default) ? &fnr($default) : $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
sub antsFieldListOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
	my(@fn) = split(',',$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
	my(@fi);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
	for (my($i)=0; $i<@fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
		$fi[$i] = &fnr($fn[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
	return @fi;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
sub antsNewField($)										# allocate if needed
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
	my($fname) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
	$fnr = &fnrNoErr($fname,1);							# exact match
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
	unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
		return $antsBufNFields++						# external layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
			unless ($antsBufNFields==0 || @antsLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		@antsNewLayout = @antsLayout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
			unless (@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
		push(@antsNewLayout,$fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
		$fnr = $#antsNewLayout;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
	$antsBufNFields = $fnr+1 if ($fnr >= $antsBufNFields);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
sub antsNewFieldOpt(@)									# allocate if does not exist
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
	my($fname,$fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
			$fname = ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
		if (defined($fname)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
			$fnr = &antsNewField($fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
			${$opt} = $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
			return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
		} else { return undef; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
			$fname = $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
		} elsif (defined($default)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
		return defined($fname) ? &antsNewField($fname) : undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
sub antsNoFileErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
	croak("$0: $_[0] $_[1] is not a valid file\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
		unless (-r $_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
	&antsAddDeps($_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
sub antsFileArg()	# arg 1 => do not shift
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
	&antsNoFileErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
	my($res) = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
	shift(@ARGV) unless ($_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
sub antsFileOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
	&antsNoFileErr("Option Argument",$opt)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
		if (defined($opt));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
sub antsParamArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
	croak("$0: Argument $ARGV[0] is not a valid PARAM\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
		unless ($ARGV[0] =~ /^%/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
	return $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
sub antsNoCardErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
	croak("$0: $_[0] $_[1] is not a cardinal number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
		unless (cardinalp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
sub antsCardArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
	&antsNoCardErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
sub antsCardOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
			&antsNoCardErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
			&antsNoCardErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
	    	return $default;
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
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
sub antsNoIntErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
	croak("$0: $_[0] $_[1] is not an integer\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
		unless (integerp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
sub antsIntArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
	&antsNoIntErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
sub antsIntOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
			&antsNoIntErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
			&antsNoIntErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
sub antsNoFloatErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
	croak("$0: $_[0] $_[1] is not a number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
		unless (numberp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
sub antsFloatArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
	my($res) = str2num($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
	&antsNoFloatErr("Argument",$res);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
sub antsFloatOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
			&antsNoFloatErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
			&antsNoFloatErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
1;														# return true