antsutils.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Sat, 24 Jul 2021 09:38:16 -0400
changeset 46 70e566505a12
parent 40 c1803ae2540f
child 47 dde46143288c
permissions -rw-r--r--
V7.3
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
40
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 39
diff changeset
     5
#                    dlm: Fri Apr  5 16:21:54 2019
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1998 A.M. Thurnherr
40
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 39
diff changeset
     7
#                    uE-Info: 106 55 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
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
# fnr notes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
#	- matches field names starting with the string given, i.e. "sig" is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
#     really "^sig"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#	- if exact match is desired, a $ can be appended to the field name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
#	- following regexp meta chars are auto-quoted: .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
# Flags
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
$antsFnrExactMatch = 0;				# set to force exact match, e.g. for antsNewField* [antsutils.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
# Error-Exit
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
sub croak($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
	print("#ANTS#ERROR# @_[0]") unless (-t 1 || $opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
	die(@_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
# Number-related funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   136
$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
   137
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
$PRACTICALLY_ZERO = 1e-9;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
$SMALL_AMOUNT	  = 1e-6;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
sub numberp(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
{ return  $_[0] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
sub numbersp(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
	foreach my $n (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
		return undef unless numberp($n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
	return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
sub equal($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
{ return (@_ >= 2) && (abs($_[0]-$_[1]) < $PRACTICALLY_ZERO); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
29
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   155
sub div2($$)
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   156
{ return $_[1] ? $_[0]/$_[1] : inf; }
f41d125405a6 version after ECOGIG EN586 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
   157
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   158
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
# check whether given val is member of a set
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   160
#	- set can either be an array or a comma-separated string
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   161
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   162
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
sub ismember($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
	my($val,@set) = @_;
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   166
	@set = split(',',$set[0])
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   167
		if (@set == 1 && !numberp($set[0]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
	for (my($i)=0; $i<@set; $i++) {
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   169
		if (numberp($val) && numberp($set[$i])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   170
			return 1 if ($val == $set[$i]);
6
b965580e8782 start of FZ1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   171
		} elsif (numberp($val) && ($set[$i] =~ m{-}) && numberp($`) && numberp($')) {
b965580e8782 start of FZ1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   172
			return 1 if (ismember($val,$`..$'));
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   173
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   174
			return 1 if ($val eq $set[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   175
		}
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
	return undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
sub isnan($) # perlfunc(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
{ return $_[0] != $_[0]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
sub cardinalp($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
{ return $_[0] =~ /^\+?\d+$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
sub integerp($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
{ return $_[0] =~ /^[+-]?\d+$/; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
sub antsNumbers(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
	my($n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
	foreach $n (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
		return 0 unless (&numberp(&antsVal($n)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
	return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
sub round(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
	return $_[0] >= 0 ? int($_[0] / $accuracy + 0.5) * $accuracy
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
					  : int($_[0] / $accuracy - 0.5) * $accuracy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
sub Ceil(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
	return int($_[0]/$accuracy + 1 - $PRACTICALLY_ZERO) * $accuracy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
sub Floor(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
	my($accuracy) = defined($_[1]) ? $_[1] : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
	return int($_[0]/$accuracy) * $accuracy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
sub frac($) { return $_[0] - int($_[0]); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
sub SQR($) { return $_[0] * $_[0]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
sub str2num($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	my($num) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
	$num =~ s/^\s*//;					# kill leading spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	$num =~ s/\s*$//;					# kill trailing spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
	$num = (substr($1,0,1) eq '-') ? $1-$2/60 : $1+$2/60	# degrees
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
		if ($num =~ /^([+-]?\d*):(\d*\.?\d*)$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	return $num unless (numberp($num));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
	$num =~ s/^(-?)0*/\1/;				# kill leading 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
	$num =~ s/(\.\d*[1-9])0*$/\1/;		# kill trailing fractional 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	$num =~ s/^\./0./;					# ensure digit before decimal pnt
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	$num =~ s/^-\./-0./;				# ditto
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	$num =~ s/\.$/.0/;					# ensure digit after decimal pnt
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	$num =~ s/^-0(\.0?)$/0/;			# 0 is positive
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	$num =~ s/\.0+$//;					# kill trailing fractional 0es
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	return ($num eq "") ? 0 : $num;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
sub fmtNum($$)							# format number for output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
	my($num,$fname) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
	$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
   244
										# not handled correctly by all progs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
	$num = str2num($num) if ($opt_C);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
	if ($opt_G && numberp($num)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
		$num = sprintf("%d:%04.1f%s",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
						(abs($num)-abs(int($num)))*60,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
						$num>=0 ? "N" : "S")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
			if (lc($fname) =~ /lat/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
		$num = sprintf("%d:%04.1f%s",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
						(abs($num)-abs(int($num)))*60,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
						$num>=0 ? "E" : "W")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
			if (lc($fname) =~ /lon/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
	if ($opt_T && numberp($num)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
		$num = sprintf("\\lat%s{%d}{%04.1f}",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
						$num>=0 ? "N" : "S",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
						(abs($num)-abs(int($num)))*60)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
			if (lc($fname) =~ /lat/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
		$num = sprintf("\\lon%s{%d}{%04.1f}",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
						$num>=0 ? "E" : "W",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
						abs(int($num)),
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
						(abs($num)-abs(int($num)))*60)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
			if (lc($fname) =~ /lon/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
	$num = sprintf($opt_M,$num)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
        if defined($opt_M) && numberp($num);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
    return $num;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   276
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
   277
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
# Layout-related funs
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
sub fname_match($$)									# modified regexp match
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
	my($pat,$trg) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
	return ($pat eq $trg) if ($antsFnrExactMatch);	# exact match (pre 3.4 behavior)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
#	print(STDERR "pattern: $pat -> ");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
	$pat =~ s/\./\\\./g;							# may want more of these
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
	$pat =~ s/^/\^/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
#	print(STDERR "$pat\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	return $trg =~ /$pat/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
sub fnrInFile(...)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
	my($fname,$file,$pref,$found) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
	my($fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
	local(*D);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
	open(D,$file) || return (undef,$fname);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
	while (<D>) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
		s/\s\b/ $pref/g	if m/^#\d+/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
		my(@fn) = split;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
		if (/^#\s*include\s*([^\s]+)\s*([^\s]+)?/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
			my($npref) = ($2 eq "") ? $pref : $2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
			if (substr($1,0,2) eq "./") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
				my($dirname) = $file;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
				$file = $1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
				$dirname =~ s@[^/]+$@@;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
				$file = $dirname . $file;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
				$file = $1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
			($found,$fullName) = &fnrInFile($fname,$file,$npref,$found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
		next unless ($fn[0] =~ /^#\d+$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
		for (my($i)=1; $i<=$#fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
			close(D),return ($1,$fname)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
				if (/^#(\d+)\b.*\b$fname\b/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
		for (my($i)=1; $i<=$#fn; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
			next unless fname_match($fname,$fn[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			croak("$0: $fname matches multiple fields in Layout files\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
			$fullName = $fn[$i];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
			($found) = ($fn[0] =~ /^#(\d+)/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
    close(D);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
	return ($found,$fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
sub localFnr($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
	my($fnm,@layout) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
	my($i,$fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
#	print(STDERR "finding $fnm...\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	croak("$0: illegal 0-length field name\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
		if ($fnm eq "");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
	return $fnm if ($fnm =~ /^%/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
	if ($fnm =~ /^\$/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
		croak("$0: invalid field identifier \$$'\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
			unless (cardinalp($'));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
		return $' - 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
	my($i,$found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
	if (@layout) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
		for ($i=0; $i<=$#layout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
			return $i if ($layout[$i] eq $fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
	    }
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
			next unless fname_match($fnm,$layout[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
			croak("$0: $fnm matches multiple fields ($layout[$found],$layout[$i],...)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
			$found = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
		for ($i=0; $i<=$#antsLayout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
			return $i if ($antsLayout[$i] eq $fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
	    }
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
			next unless fname_match($fnm,$antsLayout[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
			croak("$0: $fnm matches multiple fields ($antsLayout[$found],$antsLayout[$i],...)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
				if defined($found);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
			$found = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
	return $found;
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
sub fnrNoErr($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
	my($fnm,$exact) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
	my($tmp) = $antsFnrExactMatch;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
	$antsFnrExactMatch = $exact if defined($exact);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
	my($fnr) = &localFnr($fnm);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
	$antsFnrExactMatch = $tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
	my($fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
	return $fnr if defined($fnr); 						# internal layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
	my($tmp) = $antsFnrExactMatch;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
	$antsFnrExactMatch = $exact if defined($exact);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
	($fnr,$fullName) = &fnrInFile($fnm,"Layout","");	# external [Layout]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	$antsFnrExactMatch = $tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
    return undef unless defined($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
    return undef										# [Layout] cannod override
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
		if (defined($antsLayout[$fnr]) &&				# local definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
			!fname_match($fnm,$antsLayout[$fnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
	$antsLayout[$fnr] = $fullName if defined($fullName);# found -> add to local
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
	$antsBufNFields = $fnr+1							# can happen on externally
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
		if ($antsBufNFields < $fnr+1);					# ... defined fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
	return($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
sub fnr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
	my(@fnm) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
	my($f,@fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
	for ($f=0; $f<=$#fnm; $f++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
		$fnr[$f] = &fnrNoErr($fnm[$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
		next if defined($fnr[$f]);						# normal case -> done
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
	    croak("$0: Unknown field $fnm[$f]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
	    	unless defined($fnr[$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
	return(@fnr>1 ? @fnr : $fnr[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
# fnr()-equivalent but checks in output format
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
#	- only used for -F processing => single argument only
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
sub outFnr($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
	my($fnm) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
	my($f,$fnr,$fullName);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
	$fnr = &localFnr($fnm,@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
	return $fnr if defined($fnr); 					# normal case -> done
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
	($fnr,$fullName)  = &fnrInFile($fnm,"Layout","");	# look in [Layout]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
	croak("$0: Unknown field $fnm\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
		unless defined($fnr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
	$antsNewLayout[$fnr] = $fullName;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
	return $fnr;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
# model-loading funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   436
sub antsLoadModel(...)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
{
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   438
	my($opt,$pref,$default) = @_;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
	my($name);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
	for ($a=0;											# find model name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
		 $a<=$#ARGV && !($ARGV[$a] =~ m/^-\S*$opt$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
		 $a++) { }
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   444
	$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
   445
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   446
	return undef unless defined($name);
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   447
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   448
	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
   449
		&antsInfo("loading local $pref.$name...");
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   450
		require "$pref.$name";
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   451
		return $name;
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   452
	} else {											# load from ANTSlib 
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   453
		require "$ANTS/$pref.$name";
4
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
    }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
sub antsLoadModelWithArgs($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
	my($opt,$pref) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
	for ($a=0;											# find model name
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
		 $a<=$#ARGV && !($ARGV[$a] =~ m/^-\S*$opt$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
		 $a++) { }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
	if ($a < $#ARGV) {									# found
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
		my($name,$args) = ($ARGV[$a+1] =~ /([^\(]+)\(([^\)]*)\)$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
		$name = $ARGV[$a+1] unless defined($name);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
		if (-r "$pref.$name") {							# local
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
			&antsInfo("loading local $pref.$name...");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
			require "$pref.$name";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
			return ($name,split(',',$args));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
		} else {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   473
			require "$ANTS/$pref.$name";
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
			return ($name,split(',',$args));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
	return undef;
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
#----------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   481
# deal with lists of numbers
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   482
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   483
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   484
sub compactList(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   485
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   486
	my(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   487
	my($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   488
	my($lv) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   489
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   490
	foreach my $v (@_) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   491
		if (numberp($v)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   492
			if ($v == $lv+1) {						# we're in a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   493
				$seqStart = $lv						# record beginning value
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   494
					unless defined($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   495
			} elsif (defined($seqStart)) {			# we've just completed a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   496
				pop(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   497
				push(@out,"$seqStart-$lv");
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   498
				push(@out,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   499
				undef($seqStart);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   500
			} else {								# not in a sequence
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
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   503
			$lv = $v;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   504
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   505
			push(@out,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   506
			$lv = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   507
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   508
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   509
	if (defined($seqStart)) {						# list ends with a sequence
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   510
		pop(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   511
		push(@out,"$seqStart-$lv");					
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   512
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   513
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   514
	return @out;
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
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
# Misc funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
# return either current field value or PARAM
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
sub antsVal($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
{ return ($_[0] =~ /^%/) ? $P{$'} : $ants_[$ants_][$_[0]]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
# USAGE:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
# 	OLD: argc, type-string, errmesg, params to parse
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
# 	NEW: adds between errmesg & params:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
#		1) reference to static array for caching fnrs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
#		2) list (argc elts) of field names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
#	- backward compatible
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
#	- fnr_caching only works with fixed-argc funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
#	- undef field names denote required arguments that must be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
#	  supplied by the user, e.g. for dn2date
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
sub antsFunUsage($$$@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
	my($argc,$types,$msg,@params) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
	if (ref($params[0]) && @antsLayout>0 && @params<2*$argc+1) {  # default params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
		my(@newparams);									# 2nd test is for abc
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   543
		my($npi) = abs($argc)+1;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
		$listAllRecs = 1;								# special flag for list(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
		if (@{$params[0]} > 0) {						# fnrs already in cache
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
			for (my($i)=0; $i<@{$params[0]}; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
				push(@newparams,defined($params[0]->[$i]) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
							    &antsVal($params[0]->[$i]) :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
								$params[$npi++]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
			return(@newparams);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
	    
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   556
		for (my($i)=1; $i<=abs($argc); $i++) {				# fill cache & do tests
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
			if (defined($params[$i])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
				push(@{$params[0]},&fnr($params[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
				push(@newparams,&antsVal($params[0]->[$#{$params[0]}]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
				croak("usage: $msg\n") unless ($npi <= $#params);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
				push(@{$params[0]},undef);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
				push(@newparams,$params[$npi++]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
		croak("usage: $msg\n") unless ($npi > $#params);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
		@params = @newparams;
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   569
	} elsif (ref($params[0])) {								# remove array ref & list of field names
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   570
		splice(@params,0,abs($argc)+1);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
	if ($argc >= 0) {									# argument count
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   574
		croak("usage: $msg [params = @params]\n") unless (@params == $argc);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
	} else {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   576
		croak("usage: $msg [params = @params])\n") unless (@params >= -$argc);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
	for (my($i)=0; $i<length($types); $i++) {			# type checking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
		$_ = substr($types,$i,1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
		SWITCH: {
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   582
# 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
   583
#		  arguments is undefined. I do not know under what circumstances the code
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   584
#	      is required. Therfore I disabled it temporarily.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   585
#			last unless defined($params[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   586
			&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
   587
			&antsNoIntErr(sprintf("argument #%d in $msg",$i+1),$params[$i]),last SWITCH if (/i/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 29
diff changeset
   588
			&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
   589
			&antsNoFileErr(sprintf("argument #%d in $msg",$i+1),$params[$i]),last SWITCH if (/F/);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
			if (/\d/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
				croak("$0: $params[$i] is not a string of length $_\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
					unless ($_ == length($params[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
				last SWITCH;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
			last SWITCH if (/\./);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
			croak("&antsFunUsage: illegal type specifier $_\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
	return @params;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
} # sub antsfunusage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   603
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   604
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
sub antsRequireParam($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
	my($pn) = @_;
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   608
	my($pv) = antsParam($pn);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
	croak("$0: required PARAM $pn not set\n")
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   610
		unless defined($pv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   611
	return $pv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   612
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   613
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   614
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   615
sub antsFindParam($)								# find parameter using RE (e.g. antsFindParam('dn\d\d'))
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   616
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   617
	my($re) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   618
	foreach my $k (keys(%P)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   619
		return ($k,$P{$k}) if ($k =~ /^$re$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   620
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   621
	return (undef,undef);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   624
sub antsParam($)									# get parameter value for any ::-prefix
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   625
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   626
	my($pn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   627
	my($nfound,$val);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   628
	foreach my $k (keys(%P)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   629
		next unless ($k eq $pn) || ($k =~ /::$pn$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   630
		$val = $P{$k};
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   631
		$nfound++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   632
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   633
	croak("$0: %PARAM $pn ambiguous\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   634
		if ($nfound > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   635
	return $val;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   636
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   637
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   638
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
{ my($term);	# STATIC
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
sub debug($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
	my($prompt) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
	unless (defined($term)) {						# initialize
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
		use Term::ReadLine;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
		$term = new Term::ReadLine $ARGV0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
	do {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
		my($expr) = $term->readline("$prompt>");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
		return if ($expr eq 'return');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
		$res = eval($expr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
		if 	(defined($res)) {						# no error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
			print(STDERR "$res\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
		} else {									# error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
			print(STDERR "$@");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
	} while (1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
} # STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
1;