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