antsutils.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Tue, 07 Jun 2022 17:17:54 -1000
changeset 49 789eddc6d4b3
parent 47 dde46143288c
child 50 4b59a02e6518
permissions -rw-r--r--
merged with F104 version
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 T I L S . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    doc: Fri Jun 19 23:25:50 1998
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 40
diff changeset
     5
#                    dlm: Tue Apr  5 21:20:29 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: 40
diff changeset
     7
#                    uE-Info: 157 0 NIL 0 0 70 10 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
# Miscellaneous auxillary functions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Mar 08, 1999: - added &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Mar 20, 1999: - added &fnr()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#				  - BUG &numberp() returned TRUE on "sigma2"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Mar 21, 1999: - added semantics of &antsFunUsage() to specify min
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#					args on negative number
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Mar 22, 1999: - added round(); NB: there's a BUG:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#					int(2.155*10**2+0.5)/100 returns 215!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	Jul 31, 1999: - added &cardinalp() and plugged into &fnr()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#				  - change &numberp() to conform with &antsFloatArg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	Sep 13, 1999: - added &SQR()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#				  - removed "" from valid numbers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	Sep 18, 1999: - added &integerp()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#				  - added typechecking to &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#	Sep 20, 1999: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Aug 24, 2000: - added #include directive to Description files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#				  - added stringlengths to &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	Aug 28, 2000: - added str2num to remove leading 0es & lead/trail spcs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#				  - changed opt_P to opt_A
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Aug 29, 2000: - added &antsRequireParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Sep 01, 2000: - added prefix as 2nd arg to #include directive
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#				  - disallow <> in #include directive
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#				  - debugged &str2num()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	Sep 03, 2000: - allowed for %param to pass through fnr w/o error check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	Sep 05, 2000: - str2num always kills leading/trailing spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	Sep 19, 2000: - added interpretation to ./ to #include
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#				  - inherit prefix for chained inclusion (do not chain, however)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	Nov 25, 2000: - backslashed leading + in regexp to increase portability
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	May 29, 2001: - adapted &antsNumbers() to handle %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#				  - added &antsVal()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	Jul  6, 2001: - added degree notation to str2num()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	Jul 12, 2001: - made $# notation 1-relative (awk, shell)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	Jul 15, 2001: - added field name to Description open error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	Jul 16, 2001: - added &localFnr()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	Jul 19, 2001: - added &croak()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	Aug  1, 2001: - BUG: numberp() returned false on "-.360"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	May  7, 2002: - BUG: numberp() returned true on "."
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#	Mar  8, 2003: - changed Description to Layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#   Dec  7, 2005: - antsFName -> antsLayout (not tested)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	Dec  8, 2005: - Version 3.2 (see [HISTORY])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	Dec 12, 2005: - BUG: &outFnr() was broken
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#				  - BUG: [Layout] overrode local #FIELDS#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#   Dec 23, 2005: - replaced defined(@array) (c.f. perlfunc(1))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#	Jan  2, 2006: - changed numberp to allow for multiple args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#				  - changed right back
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#	Jan  9, 2006: - BUG: fnrNoErr() had not increased $antsBufNFields on
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#					     import of an externally defined field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#	Jan 10, 2006: - added &antsLoadModel()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#	Jan 12, 2006: - removed -A support
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#	Jan 13: 2006: - BUG: str2num(3.00) did not yield 3
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#	Jul  1, 2006: - added isNaN (from perlfunc(1))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#				  - changed numberp() according to perldata(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
#	Jul 24, 2006: - added $PRACTICALLY_ZERO, &equal()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
#	Aug 23, 2006: - improved model loading (& added model w. params)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#	Aug 24, 2006: - made 2nd argument of round() optional
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#				  - added frac()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#	May 11, 2007: - added Floor(), Ceil()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#	Oct 17, 2007: - added default field names (w. caching) to &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#	Oct 18, 2007: - added support for optional parameters
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#	Oct 19, 2007: - generalized antsFunUsage to allow default %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#				  - BUG: make sure usage is printed in abc when called with
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#						 wrong # of args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
#	Nov 14, 2007: - made optional arguments to round, Floor, Ceil more intuitive
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
#	Dec 19, 2007: - added &numbersp()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
#	Mar  2, 2008: - adapted fnr to partial matches
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
#	Mar  4, 2008: - added $antsFnrExactMatch flag
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
#				  - BUG: couldn't select f1 if there is also an f10
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
#	Mar 26, 2008: - BUG: abbreviated field names were imported from external
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
#						 Layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
#	Mar 27, 2008: - added %pi
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#	Mar 28, 2008: - move %pi to [argtest]; when set here filediff -e bombs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
#	Apr 15, 2008: - added &log10()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
#	Apr 16, 2008: - MAJOR CHANGE: suppress croak() STDOUT error output on -Q
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#	Apr 29, 2008: - added &ismember()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
#	Jun 11, 2008: - adder perl 5.8.8 bug workaround (0*-0.1 = -0)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
#	Nov 12, 2008: - added opt_T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#	Mar 21, 2009: - added debug()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
#	Nov 17, 2009: - added listAllRecs flag for list(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
#	May 12, 2010: - BUG: round() did not work correctly for -ve numbers
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 6
diff changeset
    91
#	May 21, 2011: - added support for $antsFnrNegativeOk
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
#	Nov 11, 2011: - added exact flag to fnrNoErr()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
#	Feb 13, 2012: - BUG: failure to specify exact flag resulted in ignoring antsFnrExactMatch
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#				  - BUG: fnrNoErr disregarded exact flag for external layouts
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    95
#	May 16, 2012: - adapted to V5.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    96
#	May 31, 2012: - changed ismember() semantics for use in psSamp
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    97
#	Jun 12, 2012: - added &compactList()
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    98
#	Dec 17, 2012: - added default to antsLoadModel()
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    99
#	Sep  5, 2013: - FINALLY: added $pi
6
b965580e8782 start of FZ1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   100
#	May 23, 2014: - made ismember understand "123,1-10"
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 6
diff changeset
   101
#	Jul 22, 2014: - removed support for antsFnrNegativeOk
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   102
#	May 18, 2015: - added antsFindParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   103
#	Jun 21, 2015: - added antsParam(), modified antsRequireParam()
29
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   104
#	May 12, 2016: - added &div2() to prevent division by zero errors
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   105
#	Apr  5, 2019: - disabled weird line of code in antsFunUsage() (see comment)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   106
#				  - improved error messages in antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   107
#				  - BUG: antsFunUsage did not work with -ve argc (variable argument funs)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   108
#	Aug 30, 2019: - BUG: antsLoadModel() did not respect $ANTS
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 40
diff changeset
   109
#	Nov 29, 2021: - made fmtNum() return NaN on undefined input	
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 40
diff changeset
   110
# HISTORY END
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
# fnr notes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#	- matches field names starting with the string given, i.e. "sig" is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
#     really "^sig"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
#	- if exact match is desired, a $ can be appended to the field name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
#	- following regexp meta chars are auto-quoted: .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
# Flags
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
$antsFnrExactMatch = 0;				# set to force exact match, e.g. for antsNewField* [antsutils.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
# Error-Exit
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
sub croak($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
	print("#ANTS#ERROR# @_[0]") unless (-t 1 || $opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
	die(@_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
# Number-related funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   138
$pi = 3.14159265358979;		# from $PI in [libvec.pl]
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   139
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
$PRACTICALLY_ZERO = 1e-9;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
$SMALL_AMOUNT	  = 1e-6;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
sub numberp(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
{ return  $_[0] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
sub numbersp(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
	foreach my $n (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
		return undef unless numberp($n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
	return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
sub equal($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
{ return (@_ >= 2) && (abs($_[0]-$_[1]) < $PRACTICALLY_ZERO); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
29
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   157
sub div2($$)
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   158
{ return $_[1] ? $_[0]/$_[1] : inf; }
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   159
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   160
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
# check whether given val is member of a set
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   162
#	- set can either be an array or a comma-separated string
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   163
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   164
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
sub ismember($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
	my($val,@set) = @_;
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   168
	@set = split(',',$set[0])
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   169
		if (@set == 1 && !numberp($set[0]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
	for (my($i)=0; $i<@set; $i++) {
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   171
		if (numberp($val) && numberp($set[$i])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   172
			return 1 if ($val == $set[$i]);
6
b965580e8782 start of FZ1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   173
		} elsif (numberp($val) && ($set[$i] =~ m{-}) && numberp($`) && numberp($')) {
b965580e8782 start of FZ1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   174
			return 1 if (ismember($val,$`..$'));
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   175
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   176
			return 1 if ($val eq $set[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   177
		}
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	return undef;
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
sub isnan($) # perlfunc(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
{ return $_[0] != $_[0]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
sub cardinalp($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
{ return $_[0] =~ /^\+?\d+$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
sub integerp($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
{ return $_[0] =~ /^[+-]?\d+$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
sub antsNumbers(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
	my($n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
	foreach $n (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
		return 0 unless (&numberp(&antsVal($n)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
	return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
sub round(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
	return $_[0] >= 0 ? int($_[0] / $accuracy + 0.5) * $accuracy
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
					  : int($_[0] / $accuracy - 0.5) * $accuracy;
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
sub Ceil(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	return int($_[0]/$accuracy + 1 - $PRACTICALLY_ZERO) * $accuracy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
sub Floor(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
	return int($_[0]/$accuracy) * $accuracy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
sub frac($) { return $_[0] - int($_[0]); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
sub SQR($) { return $_[0] * $_[0]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
sub str2num($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	my($num) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
	$num =~ s/^\s*//;					# kill leading spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	$num =~ s/\s*$//;					# kill trailing spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	$num = (substr($1,0,1) eq '-') ? $1-$2/60 : $1+$2/60	# degrees
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
		if ($num =~ /^([+-]?\d*):(\d*\.?\d*)$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
	return $num unless (numberp($num));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	$num =~ s/^(-?)0*/\1/;				# kill leading 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	$num =~ s/(\.\d*[1-9])0*$/\1/;		# kill trailing fractional 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	$num =~ s/^\./0./;					# ensure digit before decimal pnt
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	$num =~ s/^-\./-0./;				# ditto
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	$num =~ s/\.$/.0/;					# ensure digit after decimal pnt
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	$num =~ s/^-0(\.0?)$/0/;			# 0 is positive
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	$num =~ s/\.0+$//;					# kill trailing fractional 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
	return ($num eq "") ? 0 : $num;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
sub fmtNum($$)							# format number for output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
	my($num,$fname) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
	
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 40
diff changeset
   245
	$num = NaN unless defined($num);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
	$num = 0 if ($num eq '-0');			# perl 5.8.8: 0*-0.1 = -0, which is 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
										# not handled correctly by all progs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
	$num = str2num($num) if ($opt_C);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
	if ($opt_G && numberp($num)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
		$num = sprintf("%d:%04.1f%s",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
						(abs($num)-abs(int($num)))*60,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
						$num>=0 ? "N" : "S")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
			if (lc($fname) =~ /lat/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
		$num = sprintf("%d:%04.1f%s",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
						(abs($num)-abs(int($num)))*60,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
						$num>=0 ? "E" : "W")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
			if (lc($fname) =~ /lon/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
	if ($opt_T && numberp($num)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
		$num = sprintf("\\lat%s{%d}{%04.1f}",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
						$num>=0 ? "N" : "S",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
						(abs($num)-abs(int($num)))*60)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
			if (lc($fname) =~ /lat/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
		$num = sprintf("\\lon%s{%d}{%04.1f}",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
						$num>=0 ? "E" : "W",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
						(abs($num)-abs(int($num)))*60)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
			if (lc($fname) =~ /lon/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
	$num = sprintf($opt_M,$num)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
        if defined($opt_M) && numberp($num);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
    return $num;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   279
sub log10 { my $n = shift; return ($n>0) ? log($n)/log(10) : nan; }	# c.v. perlfunc(1)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
# Layout-related funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
sub fname_match($$)									# modified regexp match
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
	my($pat,$trg) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
	return ($pat eq $trg) if ($antsFnrExactMatch);	# exact match (pre 3.4 behavior)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
#	print(STDERR "pattern: $pat -> ");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	$pat =~ s/\./\\\./g;							# may want more of these
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
	$pat =~ s/^/\^/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
#	print(STDERR "$pat\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
	return $trg =~ /$pat/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
sub fnrInFile(...)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
	my($fname,$file,$pref,$found) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
	my($fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
	local(*D);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
	open(D,$file) || return (undef,$fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
	while (<D>) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
		s/\s\b/ $pref/g	if m/^#\d+/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
		my(@fn) = split;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
		if (/^#\s*include\s*([^\s]+)\s*([^\s]+)?/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
			my($npref) = ($2 eq "") ? $pref : $2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
			if (substr($1,0,2) eq "./") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
				my($dirname) = $file;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
				$file = $1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
				$dirname =~ s@[^/]+$@@;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
				$file = $dirname . $file;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
				$file = $1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
			($found,$fullName) = &fnrInFile($fname,$file,$npref,$found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
		next unless ($fn[0] =~ /^#\d+$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
		for (my($i)=1; $i<=$#fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
			close(D),return ($1,$fname)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
				if (/^#(\d+)\b.*\b$fname\b/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
		for (my($i)=1; $i<=$#fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
			next unless fname_match($fname,$fn[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
			croak("$0: $fname matches multiple fields in Layout files\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
			$fullName = $fn[$i];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
			($found) = ($fn[0] =~ /^#(\d+)/);
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
    close(D);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	return ($found,$fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
sub localFnr($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
	my($fnm,@layout) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	my($i,$fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
#	print(STDERR "finding $fnm...\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
	croak("$0: illegal 0-length field name\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
		if ($fnm eq "");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
	return $fnm if ($fnm =~ /^%/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
	if ($fnm =~ /^\$/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
		croak("$0: invalid field identifier \$$'\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
			unless (cardinalp($'));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
		return $' - 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
	my($i,$found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
	if (@layout) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
		for ($i=0; $i<=$#layout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
			return $i if ($layout[$i] eq $fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
		for ($i=0; $i<=$#layout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
			next unless fname_match($fnm,$layout[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
			croak("$0: $fnm matches multiple fields ($layout[$found],$layout[$i],...)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
			$found = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
		for ($i=0; $i<=$#antsLayout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
			return $i if ($antsLayout[$i] eq $fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
		for ($i=0; $i<=$#antsLayout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
			next unless fname_match($fnm,$antsLayout[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
			croak("$0: $fnm matches multiple fields ($antsLayout[$found],$antsLayout[$i],...)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
			$found = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
	return $found;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
sub fnrNoErr($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
	my($fnm,$exact) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
	my($tmp) = $antsFnrExactMatch;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
	$antsFnrExactMatch = $exact if defined($exact);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
	my($fnr) = &localFnr($fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
	$antsFnrExactMatch = $tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
	my($fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
	return $fnr if defined($fnr); 						# internal layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	my($tmp) = $antsFnrExactMatch;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
	$antsFnrExactMatch = $exact if defined($exact);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
	($fnr,$fullName) = &fnrInFile($fnm,"Layout","");	# external [Layout]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
	$antsFnrExactMatch = $tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
    return undef unless defined($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
    return undef										# [Layout] cannod override
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
		if (defined($antsLayout[$fnr]) &&				# local definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
			!fname_match($fnm,$antsLayout[$fnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
	$antsLayout[$fnr] = $fullName if defined($fullName);# found -> add to local
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
	$antsBufNFields = $fnr+1							# can happen on externally
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
		if ($antsBufNFields < $fnr+1);					# ... defined fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
	return($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
sub fnr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
	my(@fnm) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
	my($f,@fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
	for ($f=0; $f<=$#fnm; $f++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
		$fnr[$f] = &fnrNoErr($fnm[$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
		next if defined($fnr[$f]);						# normal case -> done
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
	    croak("$0: Unknown field $fnm[$f]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
	    	unless defined($fnr[$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
	return(@fnr>1 ? @fnr : $fnr[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
# fnr()-equivalent but checks in output format
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
#	- only used for -F processing => single argument only
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
sub outFnr($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
	my($fnm) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
	my($f,$fnr,$fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
	$fnr = &localFnr($fnm,@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
	return $fnr if defined($fnr); 					# normal case -> done
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
	($fnr,$fullName)  = &fnrInFile($fnm,"Layout","");	# look in [Layout]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
	croak("$0: Unknown field $fnm\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
		unless defined($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
	$antsNewLayout[$fnr] = $fullName;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
# model-loading funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   439
sub antsLoadModel(...)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
{
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   441
	my($opt,$pref,$default) = @_;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
	my($name);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
	for ($a=0;											# find model name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		 $a<=$#ARGV && !($ARGV[$a] =~ m/^-\S*$opt$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
		 $a++) { }
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   447
	$name = ($a < $#ARGV) ? $ARGV[$a+1] : $default;		# use default if not found
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   448
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   449
	return undef unless defined($name);
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   450
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   451
	if (-r "$pref.$name") { 							# load in local directory
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   452
		&antsInfo("loading local $pref.$name...");
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   453
		require "$pref.$name";
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   454
		return $name;
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   455
	} else {											# load from ANTSlib 
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   456
		require "$ANTS/$pref.$name";
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   457
		return $name;
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   458
    }
0
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 antsLoadModelWithArgs($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
	my($opt,$pref) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
	for ($a=0;											# find model name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
		 $a<=$#ARGV && !($ARGV[$a] =~ m/^-\S*$opt$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
		 $a++) { }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
	if ($a < $#ARGV) {									# found
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
		my($name,$args) = ($ARGV[$a+1] =~ /([^\(]+)\(([^\)]*)\)$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
		$name = $ARGV[$a+1] unless defined($name);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
		if (-r "$pref.$name") {							# local
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
			&antsInfo("loading local $pref.$name...");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
			require "$pref.$name";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
			return ($name,split(',',$args));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
		} else {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   476
			require "$ANTS/$pref.$name";
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
			return ($name,split(',',$args));
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
	return undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
#----------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   484
# deal with lists of numbers
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   485
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   486
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   487
sub compactList(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   488
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   489
	my(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   490
	my($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   491
	my($lv) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   492
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   493
	foreach my $v (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   494
		if (numberp($v)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   495
			if ($v == $lv+1) {						# we're in a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   496
				$seqStart = $lv						# record beginning value
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   497
					unless defined($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   498
			} elsif (defined($seqStart)) {			# we've just completed a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   499
				pop(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   500
				push(@out,"$seqStart-$lv");
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   501
				push(@out,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   502
				undef($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   503
			} else {								# not in a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   504
				push(@out,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   505
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   506
			$lv = $v;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   507
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   508
			push(@out,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   509
			$lv = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   510
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   511
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   512
	if (defined($seqStart)) {						# list ends with a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   513
		pop(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   514
		push(@out,"$seqStart-$lv");					
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   515
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   516
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   517
	return @out;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   518
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   519
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   520
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
# Misc funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
# return either current field value or PARAM
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
sub antsVal($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
{ return ($_[0] =~ /^%/) ? $P{$'} : $ants_[$ants_][$_[0]]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
# USAGE:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
# 	OLD: argc, type-string, errmesg, params to parse
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
# 	NEW: adds between errmesg & params:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
#		1) reference to static array for caching fnrs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
#		2) list (argc elts) of field names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
#	- backward compatible
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
#	- fnr_caching only works with fixed-argc funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
#	- undef field names denote required arguments that must be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
#	  supplied by the user, e.g. for dn2date
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
sub antsFunUsage($$$@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
	my($argc,$types,$msg,@params) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
	if (ref($params[0]) && @antsLayout>0 && @params<2*$argc+1) {  # default params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
		my(@newparams);									# 2nd test is for abc
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   546
		my($npi) = abs($argc)+1;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
		$listAllRecs = 1;								# special flag for list(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
		if (@{$params[0]} > 0) {						# fnrs already in cache
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
			for (my($i)=0; $i<@{$params[0]}; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
				push(@newparams,defined($params[0]->[$i]) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
							    &antsVal($params[0]->[$i]) :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
								$params[$npi++]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
			return(@newparams);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
	    
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   559
		for (my($i)=1; $i<=abs($argc); $i++) {				# fill cache & do tests
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
			if (defined($params[$i])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
				push(@{$params[0]},&fnr($params[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
				push(@newparams,&antsVal($params[0]->[$#{$params[0]}]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
				croak("usage: $msg\n") unless ($npi <= $#params);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
				push(@{$params[0]},undef);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
				push(@newparams,$params[$npi++]);
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
		croak("usage: $msg\n") unless ($npi > $#params);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
		@params = @newparams;
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   572
	} elsif (ref($params[0])) {								# remove array ref & list of field names
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   573
		splice(@params,0,abs($argc)+1);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
	if ($argc >= 0) {									# argument count
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   577
		croak("usage: $msg [params = @params]\n") unless (@params == $argc);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
	} else {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   579
		croak("usage: $msg [params = @params])\n") unless (@params >= -$argc);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
	for (my($i)=0; $i<length($types); $i++) {			# type checking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
		$_ = substr($types,$i,1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
		SWITCH: {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   585
# 4/5/19: The following line of code prevents proper type checking when one of the
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   586
#		  arguments is undefined. I do not know under what circumstances the code
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   587
#	      is required. Therfore I disabled it temporarily.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   588
#			last unless defined($params[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   589
			&antsNoCardErr(sprintf("argument #%d in $msg (params = @params)",$i+1),$params[$i]),last SWITCH if (/c/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   590
			&antsNoIntErr(sprintf("argument #%d in $msg",$i+1),$params[$i]),last SWITCH if (/i/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   591
			&antsNoFloatErr(sprintf("argument #%d in $msg (params = @params)",$i+1),$params[$i]),last SWITCH if (/f/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   592
			&antsNoFileErr(sprintf("argument #%d in $msg",$i+1),$params[$i]),last SWITCH if (/F/);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
			if (/\d/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
				croak("$0: $params[$i] is not a string of length $_\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
					unless ($_ == length($params[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
				last SWITCH;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
			last SWITCH if (/\./);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
			croak("&antsFunUsage: illegal type specifier $_\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
	return @params;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
} # sub antsfunusage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   606
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   607
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
sub antsRequireParam($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
	my($pn) = @_;
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   611
	my($pv) = antsParam($pn);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
	croak("$0: required PARAM $pn not set\n")
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   613
		unless defined($pv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   614
	return $pv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   615
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   616
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   617
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   618
sub antsFindParam($)								# find parameter using RE (e.g. antsFindParam('dn\d\d'))
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   619
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   620
	my($re) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   621
	foreach my $k (keys(%P)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   622
		return ($k,$P{$k}) if ($k =~ /^$re$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   623
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   624
	return (undef,undef);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   627
sub antsParam($)									# get parameter value for any ::-prefix
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   628
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   629
	my($pn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   630
	my($nfound,$val);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   631
	foreach my $k (keys(%P)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   632
		next unless ($k eq $pn) || ($k =~ /::$pn$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   633
		$val = $P{$k};
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   634
		$nfound++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   635
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   636
	croak("$0: %PARAM $pn ambiguous\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   637
		if ($nfound > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   638
	return $val;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   639
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   640
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   641
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
{ my($term);	# STATIC
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
sub debug($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
	my($prompt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
	unless (defined($term)) {						# initialize
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
		use Term::ReadLine;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
		$term = new Term::ReadLine $ARGV0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
	do {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
		my($expr) = $term->readline("$prompt>");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
		return if ($expr eq 'return');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
		$res = eval($expr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
		if 	(defined($res)) {						# no error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
			print(STDERR "$res\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
		} else {									# error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
			print(STDERR "$@");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
	} while (1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
} # STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
1;