antsusage.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Mon, 12 Sep 2022 12:43:05 -0400
changeset 53 95af2535e4bb
parent 47 dde46143288c
permissions -rw-r--r--
after whoosher merge
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
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
     5
#                    dlm: Tue May 17 15:35:36 2022
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1998 A.M. Thurnherr
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
     7
#                    uE-Info: 168 89 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
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   168
#	May 17, 2022: - BUG: antsFileError() did not report permission errors in a useful way
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   169
# HISTORY END
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
#	- ksh expands {}-arguments with commas in them!!! Use + instead
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
use Getopt::Std;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
sub antsUsageError() {									# die with Usage error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
	if (defined($antsSummary)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
		print(STDERR "\n$0 -- $antsSummary\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
		print(STDERR "\n$0\n\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
	if ($opt_U) {
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   183
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n\n" .
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   184
			"Common Input Options:\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   185
	            "\t[-I)nput <field-separator>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   186
				"\t[-S)elect <addr-expr>] [-N)ums f[,...]] [-H)ead <n lines>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   187
				"\t[-L)oad <lib,...>]\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   188
				"\t[allows -E)mbedded layout changes]\n\n" .
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   189
			"Common Output Options:\n" .
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   190
				"\t[-F)ields {%P|f|[\$@]|[f]=expr}[,...]]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   191
				"\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
   192
				"\t[-A)ctivate output] [LaTeX -T)able output]\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   193
				"\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
   194
				"\t[suppress -D)ependency checks & addition of new dependencies]\n" .
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   195
	            "\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
   196
			"Special Argument Expansion:\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   197
				"\t@<file>:<field>\t\t\t<field> values in <file>\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   198
				"\t#<from>-<to>[:<step>]\t\tenumerated values\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   199
				"\t[prefix]{<ranges>}[suffix]\texisting files (ranges: <from>[-<to>][+...])\n" .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   200
				"\t[prefix]((<file>))[suffix]\tfiles, using <file> with ranges\n");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
		print(STDERR "Options & Arguments: $antsCurUsage$_[0]\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
	croak("\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
# NB: "-" as first char in opts string disables common-option processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
sub antsUsage($$@) {									# handle options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	my($opts,$min,@usage) = @_;
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   211
	my($cOpts) = 'ADEM:QN:XCGPH:UI:O:R:L:F:S:T';
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
	my($d,$p);
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   213
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   214
	if ($antsSuppressCommonOptions) {					# non-core utilites (e.g. LADCP_w) do not use common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   215
		$cOpts = ''
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   216
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   217
		$antsCurUsage .= "\n\t[print full -U)sage]"
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   218
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   219
	
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
	foreach my $uln (@usage) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
		$antsCurUsage .= "\n\t$uln"						# suppress emtpy, e.g.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
			unless ($uln eq '');						# for interp. model usage
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	&antsUsageError()									# no args && tty stdin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
		if (!$antsInteractive && $min == 0 && @ARGV == 0 && -t 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   228
#		The following line of code, disabled Aug 24, 2016, prevents
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   229
#		numerical options from working, e.g. in LADCP_w.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   230
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   231
#	unshift(@ARGV,'--') if ($ARGV[0] =~ /^-\d/);		# -ve number heuristics
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	chomp($0 = `basename $0`);							# set scriptname
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	chop($d = `date +%D`);								# build header line
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	chop($p = `pwd`);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	$p = "..." . substr($p,-17) if (length($p) > 20);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	$antsCurHeader = "#ANTS# [$d $p] $0";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
	my($i,$eoo);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
	for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
		$antsCurHeader .= " '$ARGV[$i]'";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
		$eoo = 1 if ($ARGV[$i] eq '--');				# -- handling
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
		$ARGV[$i] = "!$ARGV[$i+1]" if ($eoo); 			# make -ve non-options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
	$antsCurHeader .= "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
	pop(@ARGV) if ($eoo);								# remove last ARG
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
	if ($opts =~ m{^-}) {								# no common options processing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
		$opts = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
		undef($cOpts);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
	&antsUsageError(), exit(1)							# parse options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
		unless (&getopts($cOpts . $opts));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
	unless ($antsParseHeader) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
		croak("$0: -S not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
			if defined($opt_S);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
		croak("$0: -N not supported (implementation restriction)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
			if defined($opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
	if ($eoo) {											# reset args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
		for ($i=0; $i<=$#ARGV; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
			$ARGV[$i] = substr($ARGV[$i],1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
	if (defined($cOpts)) {								# process common options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
		croak("$0: illegal option combination (-P & -Q)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
			if ($opt_P && $opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
		&antsActivateOut() if ($opt_A);					# activate output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   274
		$antsAllowEmbeddedLayoutChange = $opt_E;		# allow embedded layout changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   275
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
		if ($opt_T) {									# LaTeX table output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
			croak("$0: illegal option combination (-T & -G)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
				if ($opt_G);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
			croak("$0: illegal option combination (-T & -O)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
				if defined($opt_O);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
			$opt_O = ' & ';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
			croak("$0: illegal option combination (-T & -R)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
				if defined($opt_R);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
			$opt_R = ' \\\\\\\\\n';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
        
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
		if (defined($opt_I)) {							# defaults
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
			eval('$opt_I = "' . $opt_I .'";');			# interpret strings 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
		} else {										# ... as perl strings
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
			$opt_I = '\s+';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
		if (defined($opt_O)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
			eval('$opt_O = "' . $opt_O .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
			$opt_O = "\t";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		if (defined($opt_R)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
			eval('$opt_R = "' . $opt_R .'";');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
			$opt_R = "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
		if (defined($opt_L)) {							# load libraries
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
			foreach $lib (split(',',$opt_L)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
				if (-r "lib$lib.pl") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
					require "lib$lib.pl";
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   307
				} elsif (-r "$ANTS/lib$lib.pl") {
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   308
					require "$ANTS/lib$lib.pl";
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   309
				} elsif (-r "$ANTSLIBS/lib$lib.pl") {
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   310
					require "$ANTSLIBS/lib$lib.pl";
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
				} else {
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   312
					croak("$0: cannot load {.,$ANTS,$ANTSLIBS}/lib$lib.pl\n");
0
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
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
		if (defined($opt_N)) {							# parse -N)ums
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
			@antsNFNames = split(',',$opt_N);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
		if (defined($opt_F)) {							# parse -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			$opt_F =~ s/\\,/aNtScOmMa/g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
			@antsOutExprs = split(',',$opt_F);	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
			push(@antsOutExprs,'$@') if ($opt_F =~ /,$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
			foreach my $e (@antsOutExprs) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
				$e =~ s/aNtScOmMa/,/;
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
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
	my($ai);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	for ($ai=0; $ai<=$#ARGV; $ai++) {					# parse special args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
		my(@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
		if ($ARGV[$ai] =~ /^@([^:]+):(.+)/) {			# @file:field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
			&antsAddDeps($1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
			@exp = `Cat -QF$2 $1`;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
			croak("(...while expanding $ARGV[$ai])\n") if ($?);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
		} elsif ($ARGV[$ai] =~ /^#(-?[\d\.]+)-(-?[\d\.]+):?(-?[\d\.]+)?/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
			my($step) = 1;								# #num-num:step
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
			if (defined($3)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
				$step = $3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
			} elsif ($2 < $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
				$step = -1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
			if ($step > 0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
				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
   347
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
					push(@exp,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
				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
   352
					$i = 0 if (abs($i) < abs($step) / 1e6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
					push(@exp,$i);
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
		} elsif ($ARGV[$ai] =~ m{\{([-\+,\d]+)\}}) {	# pref{list of ranges}suff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
			my($pref) = $`; my($suff) = $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
			foreach my $range (split('[,\+]',$1)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
				if ($range =~ /^(\d+)-(\d+)$/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
					my($fmt) = length($1)==length($2) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
							   sprintf("$pref%%0%dd$suff",length($1)) : "$pref%d$suff";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
					if ($2 > $1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
						for (my($i)=$1; $i<=$2; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   366
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
						}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
					} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
						for (my($i)=$1; $i>=$2; $i--) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
							if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   372
#							else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
	                    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
	                }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
					my($f) = "$pref$range$suff";
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   377
#					print(STDERR "f = $pref . $range . $suff\n");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
					if (-f $f) { push(@exp,$f); }
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   379
#					else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
	            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
	        }
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   382
			@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
   383
				unless (@exp);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   384
		} elsif ($ARGV[$ai] =~ m{\(\(([^\)]+)\)\)}) {		# pref((file))suff
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   385
			my($pref) = $`; my($suff) = $';
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   386
			&antsAddDeps($1);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   387
			open(F,$1) || croak("$1: $!\n");
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   388
			while (<F>) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   389
				s/#.*//g; next if /^\s+$/;					# handle comments and empty lines
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   390
				s/\s*//g;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   391
				chomp($_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   392
				if ($_ =~ /^(\d+)-(\d+)$/) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   393
					my($fmt) = length($1)==length($2) ?
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   394
							   sprintf("$pref%%0%dd$suff",length($1)) : "$pref%d$suff";
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   395
					if ($2 > $1) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   396
						for (my($i)=$1; $i<=$2; $i++) {
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   397
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   398
							push(@exp,$f) if (-f $f);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   399
						}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   400
					} else {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   401
						for (my($i)=$1; $i>=$2; $i--) {
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   402
							my($f) = sprintf($fmt,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   403
							push(@exp,$f) if (-f $f);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   404
	                    }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   405
	                }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   406
				} else {
32
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   407
					push(@exp,"$pref$_$suff") if (-f "$pref$_$suff");
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   408
	            }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   409
	        }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   410
			close(F);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
		} else {										# regular argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
			next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
		&antsInfo("WARNING: special arg $ARGV[$ai] expands to nothing"),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
		push(@exp,$ARGV[$ai])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
			unless ($#exp >= 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
		splice(@ARGV,$ai,1,@exp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
	my($nargs) = $#ARGV + 1;							# check arg count
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
	&antsUsageError() if ($opt_U || ($min > 0) && ($nargs < $min));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
	$antsARGV0 = $ARGV[0];								# save 1st filename
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
	&antsParseHeader();									# get fields & params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
	for (my($i)=0; $i<=$#ARGV; $i++) {					# remove leading ! from args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
		$ARGV[$i] =~ s/^!//;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
	return $nargs;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
# argument typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
sub antsFieldInFileArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
	my($fn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
	open(F,$fn) || croak("$fn: $!\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
	if ($ARGV[0] =~ /^%/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		croak("$0: no PARAM $ARGV[0] in $fn\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
			unless (defined(&antsFileScanParam(F,$')));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
		$fnr = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
		$fnr = &antsFileScanFnr(F,$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
		unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
			print(STDERR "$0: WARNING: no field $ARGV[0] in $fn\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
			$fnr = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
		}	    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
    close(F);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
sub antsFieldArg($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
	my($paramsAllowed) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
	my($fnr) = &fnr($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
	croak("$0: $ARGV[0] is not a field\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
		unless (numberp($fnr) || $paramsAllowed);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
sub antsFieldOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
			${$opt} = &fnr(${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
			${$opt} = &fnr($default);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
		return defined($opt) ? &fnr($opt) :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
					defined($default) ? &fnr($default) : $opt;
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
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
sub antsFieldListOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
	my(@fn) = split(',',$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
	my(@fi);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
	for (my($i)=0; $i<@fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
		$fi[$i] = &fnr($fn[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
	return @fi;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
sub antsNewField($)										# allocate if needed
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
	my($fname) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
	my($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
	$fnr = &fnrNoErr($fname,1);							# exact match
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
	unless (defined($fnr)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
		return $antsBufNFields++						# external layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
			unless ($antsBufNFields==0 || @antsLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
		@antsNewLayout = @antsLayout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
			unless (@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
		push(@antsNewLayout,$fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
		$fnr = $#antsNewLayout;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
	$antsBufNFields = $fnr+1 if ($fnr >= $antsBufNFields);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
	return $fnr;
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 antsNewFieldOpt(@)									# allocate if does not exist
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
	my($fname,$fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
		if (defined(${$opt})) {							# defined => check,set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
			$fname = ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
		} elsif (defined($default)) {					# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
		if (defined($fname)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
			$fnr = &antsNewField($fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
			${$opt} = $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
			return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
		} else { return undef; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
			$fname = $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
		} elsif (defined($default)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
			$fname = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
		return defined($fname) ? &antsNewField($fname) : undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
sub antsNoFileErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
	croak("$0: $_[0] $_[1] is not a valid file\n")
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   547
		unless (-f $_[1]);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   548
	croak("$0: $_[0] $_[1] is not readable\n")
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
		unless (-r $_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
	&antsAddDeps($_[1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
sub antsFileArg()	# arg 1 => do not shift
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
	&antsNoFileErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
	my($res) = $ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
	shift(@ARGV) unless ($_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
sub antsFileOpt($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
	my($opt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
	&antsNoFileErr("Option Argument",$opt)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
		if (defined($opt));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
sub antsParamArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
	croak("$0: Argument $ARGV[0] is not a valid PARAM\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
		unless ($ARGV[0] =~ /^%/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
	return $';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
sub antsNoCardErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
	croak("$0: $_[0] $_[1] is not a cardinal number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
		unless (cardinalp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
sub antsCardArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
	&antsNoCardErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
sub antsCardOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
			&antsNoCardErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
			&antsNoCardErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
sub antsNoIntErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
	croak("$0: $_[0] $_[1] is not an integer\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
		unless (integerp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
sub antsIntArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
	&antsNoIntErr("Argument",$ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
	my($res) = 1.0*$ARGV[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
sub antsIntOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
			&antsNoIntErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
			&antsNoIntErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
sub antsNoFloatErr($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
	croak("$0: $_[0] $_[1] is not a number\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
		unless (numberp($_[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
sub antsFloatArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
	&antsUsageError() unless defined($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
	$ARGV[0] = &{&antsCompileConstExpr($')}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
		if ($ARGV[0] =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
	my($res) = str2num($ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
	&antsNoFloatErr("Argument",$res);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
	shift(@ARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
	return $res;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
sub antsFloatOpt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
	my($opt,$default) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
	if (ref($opt)) {									# reference => set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
		if (defined(${$opt})) {							# defined => check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
			$$opt = &{&antsCompileConstExpr($')} if ($$opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
			&antsNoFloatErr("Option Argument",${$opt});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
		} else {										# not defined => default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
			${$opt} = $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   683
		return ${$opt};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   684
	} else {											# not ref => do not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
		if (defined($opt)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
			$opt = &{&antsCompileConstExpr($')} if ($opt =~ m{^=});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
			&antsNoFloatErr("Option Argument",$opt);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
	        return $opt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
	    } else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
	    	return $default;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   691
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   692
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   693
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   694
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   695
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   696
# antsFunOpt(\$opt_x) parses the contents of $opt_x as follows:
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
#	name(value)	=> $opt_x = 'name'; $name = "value";
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   699
#	name		=> no change
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   700
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   701
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   702
sub antsFunOpt(@)
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   703
{
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   704
	my($opt) = @_;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   705
	return unless defined($opt);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   706
	croak("antsusage.pl: antsFunOpt(@_): argument is not a ref\n")
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   707
		unless ref($opt);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   708
	my($name,$param) = (${$opt} =~ m{^([^\)]+)\(([^\)]+)\)$});
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   709
	return unless defined($param);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   710
	eval(sprintf('$%s = "%s";',$name,$param));
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   711
	${$opt} = $name;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   712
}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   713
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   714
1;														# return true