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