antsio.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 06 Dec 2022 12:42:44 -0500
changeset 55 b97c13151cab
parent 47 dde46143288c
permissions -rw-r--r--
V7.5
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 I O . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    doc: Fri Jun 19 19:22:51 1998
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
     5
#                    dlm: Tue Nov 30 12:28:03 2021
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1998 A.M. Thurnherr
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
     7
#                    uE-Info: 220 50 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
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Jun 19, 1998: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Dec 29, 1998: - added antsLineFlag and antsLinePrefix
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Dec 30, 1998: - added -P)assthrough option handling, arg to &antsFlush()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Jan 02, 1999: - changed -P to -T and added -P)refix for [./fnr]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Feb 17, 1999: - added &antsReadFile()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Feb 25, 1999: - added &antsInfo()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Mar 11, 1999: - set undefined ret-vals of &antsBufOut() to NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Mar 12, 1999: - added FILE to &antsPrintHeaders()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	Mar 14, 1999: - BUG ensured that $ants_[0] was defined when
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#				    typical &antsBufFull was called on empty buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#				  - added &antsPostFlush()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#				  - added &antsSetR_()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#				  - BUG padding by &antsSet_() was broken
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	Mar 20, 1999: - added code to abort if file on cmdline does not exist
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#				  - removed &antsReadFile()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#	Oct 31, 1999: - BUG when using -I
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Dec 06, 1999: - made &antsInfo() respect -Q
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Mar 07, 2000: - adapted to -M
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	Jul 31, 2000: - removed buffer auto growth unless $antsPadOut
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Aug 21, 2000: - allow for in-line comments on -T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Aug 28, 2000: - added opt_Z to remove leading zeroes on output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#				  - added %P handling
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Sep 03, 2000: - documentation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#	Sep 04, 2000: - ensure %PARAMS are not just whitespace strings
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	Oct 31, 2000: - added &antsReplaceParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	Nov 07, 2000: - added &antsFileScanParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	Nov 10, 2000: - made to ignore DOS EOF (BLOERKS!!!)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	Nov 16, 2000: - added comment about antsIO() bypassing &antsBufOut()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	Nov 17, 2000: - made -P override header PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	Jan 16, 2001: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	Feb 19, 2001: - added $antsNoHeaderCopy for [data]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	Mar  8, 2001: - adapted to -G)range
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	Mar 18, 2001: - BUG: -G had selected NaNs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	Mar 22, 2001: - added $antsNoEmbeddedHeaderCopy for [fields] [efields]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	Mar 28, 2001: - mark header info of utils used in pipelines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	Mar 31, 2001: - updated -G)range
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#				  - adapted to -F)ields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	Apr  3, 2001: - added appendfields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
# 	Apr  5, 2001: - removed string interpolation from &antsOut()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#				  - added prependfields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	May 15, 2001: - output NaN on undefined -F vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	Jun  4, 2001: - allowd %PARAMs on -F
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	Jun 19, 2001: - added pseudo param %FILE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#	Jul  9, 2001: - added Active ANTS stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#	Jul 10, 2001: - continued, split off &antsParseHeader()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#	Jul 11, 2001: - continued
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#	Jul 13, 2001: - replace -F fields names on 1st use
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#	Jul 16, 2001: - moved fchmod call to &antsPrintHeaders(), c.f. [Split]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#	Jul 19, 2001: - embedded error messages in pipeline
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#				  - copy header on -ve -H
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#	Jul 24, 2001: - BUG: set $antsNewLayout on -F
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#				  - BUG: remove % from -F layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#				  - moved fnr lookup for -G from [antsusage.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
#	Aug  1, 2001: - BUG: &antsIn() had not restored @ARGV on EOF
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
#	Aug  3, 2001: - added &antsFileScanLayout()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#	Aug  9, 2001: - BUG: $antsNewLayout was not set on prepend/append fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#	Aug 10, 2001: - added $opt_G to &antsFileIn()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#	Aug 19, 2001: - BUG: &antsReplaceParam() re-written
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#	Aug 29, 2001: - BUG: made -r into -f && -r
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#	Oct 28, 2001: - BUG: handled antsLinePrefix on parseHeader
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#	Nov 22, 2001: - added $antsParseHeader flag
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#	Nov 28, 2001: - allowed %param in -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#	Dec 30, 2001: - added &antsExit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
#	May 18, 2002: - added %BASENAME, %EXTN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
#	May 20, 2002: - added $antsNewFile
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
#	Jun 22, 2002: - added $antsPadIn
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
#	Jan  6, 2003: - added $antsGrex (-G regex support)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
#	Jan  8, 2003: - added &antsFileParams()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
#	Mar  4, 2003: - added %RECNO
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
#	Apr 14, 2003: - BUG: antsReplaceParam() removed because in-stream
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
#						 %PARAMs are not generally handled correctly
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#				  - BUG: antsFileScanParam() had returned the first
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
#						 value encountered, NOT the valid (last) one!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
#	Apr 24, 2003: - BUG: added default $antsPadIn = 1 (required for
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#						 [gamma_n])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
#	May  8, 2003: - made antsFileIn() respect -N (for [gshear])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
#	Jul  1, 2004: - BUG: $antsBufNFields was not set when an empty file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#						 with valid #ANTS#FIELDS# was read
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
#	Jul  9, 2004: - BUG: test of incompatible in-file field definitions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
#						 did not work
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
#	Dec  5, 2004: - BUG: Jul 1 fix did not work correctly in cases where
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
#						 subsequent #ANTS#FIELDS# lines would shrink the
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
#						 number of fields; new fix was not debugged!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#	Jan 17, 2005: - removed path from active files and used perl -S
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
#	Feb  8, 2005: - made activation-status copy more portable (i.e.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
#					independent of perl path)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
#	Mar  7, 2005: - added %DIRNAME (& cleaned up %BASENAME %EXTN)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
#	Nov  8, 2005: - changed -T to -P, -Z => -T, added -Z
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
#	Nov 17, 2005: - BUG: antsPreFlush() flushed one too few ([fmedian])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
#				  - BUG: antsFlagged was not set correctly any more
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
#	Nov 18, 2005: - finally allowed %PARAMs bounds in -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
#	Nov 21, 2005: - BUG: %PARAM bounds in -G had broken regexp capability
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
#	Dec  7, 2005: - BUG: embedded layout overrode @antsFName if $antsNewLayout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
#				  - replaced @antsFName by @antsLayout{In,Out}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
#	Dec  8, 2005: - Version 3.2 (see [HISTORY])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
#	Dec 12, 2005: - disable output padding in &antsOut() if new layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
#	Dec 14, 2005: - made &antsAddParams() set %P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
#				  - removed &antsReplaceParam()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
#	Dec 20, 2005: - BUG: empty field names in Layout replaced by undef
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
#				  - $# is buggy => implemented opt_M without $#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
#	Dec 23, 2005: - replaced defined(@array) (c.f. perlfunc(1))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
#                 - BUG: -F did not work ok when @antsNewLayout was set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#   Dec 29, 2005: - added $PARAMSonly to avoid output duplication on -F%param
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
#   Dec 30, 2005: - changed &antsFileIn() EOF return
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
#   Jan  3, 2006: - BUG: pseudo %PARAMs (e.g. BASENAME) were not set
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
#                        on EOF when buffer is not full
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
#                 - changed %FILE to %FILENAME
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
#                 - added support for -S)elect
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
#   Jan  4, 2006: - BUG: empty strings were not output as NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
#   Jan  9, 2006: - removed line flagging code
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
#   Jan 12, 2006: - replaced old -H)eader skip support with new -H)ead
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
#   Jan 13, 2006: - new [antsexprs.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
#                 - removed -G handling (now done as -S)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
#                 - renamed -T)rim to -C)anonical
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
#                 - removed -Z)ap handling
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
#   Jan 14, 2006: - continued removing -G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
#   Jan 31, 2006: - BUG: selecting last field per record with -I produced
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
#                        an extraneous empty line
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
#   May 18, 2006: - BUG: set pseudo-params before -S test, to allow e.g.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
#                        -S %RECNO==3 to work
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
#                 - BUG: set %RECNO on partially full buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
#                 - added %LINENO pseudo param
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
#   Jun 27, 2006: - BUG: added formal param @ to allow antsOut(NaN) to be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
#                        used in list -w
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
#				  - changed semantics of antsPadOut()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
#	Jul 10, 2006: - removed fchmod (now in perl chmod)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
#	Jul 21, 2006: - removed obsolete code
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
#	Jul 22, 2006: - shuffled &antsOut() to allow for -H0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
#	Jul 23, 2006: - BUG: -F%PARAM did not work any more
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
#	Jul 28, 2006: - BUG: pseudo-params were set during header parsing of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
#						 an empty file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
#	Jul 31, 2006: - BUG: @antsLayout was not set on 0-record files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
#				  - code cleanup
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
#	Aug 24, 2006: - added $antsIgnoreInputParams
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
#	Aug 28, 2006: - made antsIgnoreInputParams into eva'ed expr for [bindata]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
#	Oct 26, 2006: - allowed for empty lines in &antsFileScanParams()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
#	Nov 10, 2006: - suppressed copying of layout even if embedded headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
#					are copied
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
#	Dec 17, 2007: - modified behavior of antsIgnoreInputParams (see NOTES below)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
#	Jan 16, 2007: - re-implemented changes to -P mandated by Dec 14, 2006
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
#				    changes to [antsusage.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
#	May 31, 2007: - added support for -G)eographic coord format
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
#	Nov 14, 2007: - maded -G work with %PARAMS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
#				  - BUG: %FILENAME (& others) not set on %PARAMS-only files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
#	Nov 15, 2007: - BUG: -G had never worked correctly when selecting fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
#	Feb  8, 2008: - moved number output formatting to fmtNum() [antsutils.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
#	Mar 26, 2008: - modified/extended -F behavior
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
#	Mar 28, 2008: - fiddled
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
#	Apr 15, 2008: - BUG: pseudo params were not set during header parsing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
#						 => e.g. %RECNO could not be used in ded addr-expr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
#	May  1, 2008: - BUG: embedded header copy also copied embedded layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
#						 re-definitions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
#	May 22, 2008: - BUG: $antsPadOut = 0 did not suppress padding as intended
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
#						 in presence of layout or new layout => add option of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
#						 setting it to -1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
#	Jul 11, 2008: - BUG: file-name-related pseudo %PARAMs did not work
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
#						 correctly for input files without extensions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
#				  - added %FILENAME -> %PATHNAME
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
#	Jul 21, 2008: - fiddled with antsInfo()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
#	Jul 23, 2008: - added code to allow deleting %PARAMs by setting them
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
#					to undef in [list]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
#	Jul 29, 2008: - BUG: removed code to strip leading/trailing spaces from
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
#						 %PARAMs (before, a %PARAM containing just spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
#						 was deleted on an NCode/listNC combo --- there is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
#						 an example in [ubtest/NCode.TF]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
#	Jun 10, 2009: - added duplicate-output-field sanity check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
#	Aug  1, 2009: - BUG: duplicate unnamed output files generated error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
#	Aug 23, 2009: - V4.0: added &antsAddDeps
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
#	Aug 25, 2009: - BUG: '-' was added as a dep for STDIN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
#	Aug 27, 2009: - added pseudo %PARAM %DEPS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
#	Oct  3, 2009: - added $antsAllowEmbeddedLayoutChange
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
#	Oct 12, 2009: - changed antsAddDeps() to ignore empty dependencies
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
#	Oct 13, 2009: - removed antsAddDeps() defaults
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
#	Oct 15, 2009: - replaced \n by \\n in antsAddParams(); primarily for listNC
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
#	Nov  3, 2009: - BUG: <> dependencies were not set when $antsParseHeader was set to 0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
#	Nov  6, 2009: - BUG: stdin had sometimes produced empty dep
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
#	Aug 15, 2010: - turned error on duplicate output fields into warning
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
#	Aug 28, 2010: - moved dependency checks from [list] to here
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
#	Oct 18, 2010: - disabled dependency checks for files in other directories
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
#	Oct 19, 2010: - implemented &antsOut('EOF') to clear all static vars & other stuff to
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
#				    allow a single utility to output different ANTS files (used in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
#				    LADCPproc)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
#	Apr 28, 2011: - added code to make all nans lowercase to antsIn()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
#	May 20, 2011: - BUG: %LINENO had not been reset between files any more
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
#	May 22, 2011: - adapted to new antsCompileEditExpr()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
#	May 24: 2011: - BUG: forgot '$' in a variable (where???)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
#	Jul 28, 2011: - disabled adding of new deps on -D
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
#	Apr 11, 2012: - improved layout-change error message
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
#	Apr 26, 2012: - BUG: antsFileScanParam() was not properly anchored (%start_date matched %BT.start_date)
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   201
#	Jul 20, 2014: - adapted antsFileScanParam() to :: convention
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   202
#	Jul 22, 2014: - BUG: antsPadIn was done after handling -S & -N
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   203
#				  - removed antsPadIn flag (made it always be true)
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   204
#	Aug  7, 2014: - allow optional % in param name in &antsFileScanParam()
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   205
#	Oct 29, 2014: - implemented abbreviated Layout and %PARAM definitions
23
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   206
#	Sep 27, 2015: - BUG: antsDeps() accumulate with multiple input files; solution is to make sure that
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   207
#						 antsCheckDeps() is called whenever a new input file has been read for the first
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   208
#						 time (as in [list]), because antsCheckDeps() deletes the dependencies after
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   209
#						 checking
25
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 23
diff changeset
   210
#	Jan 15, 2016: - BUG: antsCheckDeps() cannot delete the dependencies after checking because,
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 23
diff changeset
   211
#						 otherwise, dependencies are not inherited => presumably, Sep 27 bug fix has been
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 23
diff changeset
   212
#						 reversed
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   213
#	Sep 13, 2016: - modified &antsAddParams to make more flexible
32
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   214
#	Mar 10, 2017: - BUG: antsCheckDeps() used ctime instead of mtime!!!
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   215
#	Apr  5, 2017: - BUG: stale file mtime dependency info was not printed correctly
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   216
#	Apr 23, 2018: - BUG: @antsLayout was not kept up-to-date when layout-changes are allowed
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   217
#	Apr 10, 2019: - disabled dependency warnings
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   218
#	Oct 14, 2021: - changed nan to NaN, to make gnuplot work nicely again
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   219
#	Nov 30, 2021: - finally made -F not croak on division-by-zero, etc.
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   220
#				  - BUG: some NaNs were still nans
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   221
# HISTORY END
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   223
# GENERAL NOTES:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
#	- %P was named without an ants-prefix because associative arrays
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
#	  are rare (and perl supports multiple name spaces for the
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
#	  different variable types) and to facilitate its use in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
#	  [list]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
#	- copying of embedded (i.e. not appearing at start) headers is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
#	  required e.g. for subsample -i ... | list %some-param
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   231
# ABBREVIATED LAYOUT & PARAM DEFINITIONS
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   232
#	- # definition [definition [...]]
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   233
#	- definition := field_name | %PARAM_def
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   234
#	- field_name := {string}
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   235
#	- %PARAM_def := string{string|num}
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   236
#	- implemented in October 2014 in order to make ANTS format easier to use for others
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   237
#	- abbreviated and full headers must not be used together
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   238
#	- abbreviated field definitions are additive (rather than replacing, as in the full headers)
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   239
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
# $antsIngoreInputParams:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
#	- is eval'ed first time antsIn() is called (usually while parsing header)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
#	- if it evaluates to TRUE, all input %PARAMS are ignored (even if it would
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
#	  later eval to FALSE)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
#	- during header parsing, @ARGV only contains additional file arguments,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
#	  i.e. setting $antsIgnoreInputParams = '@ARGV>0' before antsUsage() is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
#	  called ignores all input %PARAMs if there is more than 1 file argument
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
# Default Behaviour 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
# Flags
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
$antsFixedFormat = 0;						# remove leading & trailing stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
$antsParseHeader = 1;						# parse header on &antsUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
$antsIgnoreInputParams = 0;					# ignore %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
$antsAllowEmbeddedLayoutChange = 0;			# disallow layount changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
# Standard Fixed Size Buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
sub antsBufFull()							# default buffer full
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
    {return $#ants_+1 == $antsBufSize;}   
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
sub antsBufOut($)                           # default constructor
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
    {return $ants_[$ants_][$_[0]]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
# Setup Size 1 Buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
$antsBufSize = 1;							# default
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
$antsBufSkip = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
# Interface
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
sub antsInstallBufFull($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
	eval "sub antsBufFull() { $_[0] }";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
	croak($@) if ($@);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
	&antsReCompile();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
sub antsInstallBufOut($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
	eval "sub antsBufOut(\$) { my(\$fnr)=\@_; $_[0] }";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
	croak($@) if ($@);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
	&antsReCompile();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
sub antsActivateOut()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	$antsActiveHeader = "#!/usr/bin/perl -S list\n" unless ($opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
# antsCheckDeps([filename]):
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
#	- call only after header has been parsed
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
#	- by default, tests current <> file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   300
{ my($warned) = 1;									# disable dependency warning
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
  sub antsCheckDeps()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
  {
23
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   304
#	  print(STDERR "checking dependencies of file $infile (deps = @antsDeps)\n");
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   305
	  return unless (@antsDeps);					# no dependency info
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   306
	  return if ($opt_D);							# suppressed by user
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   307
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
	  my($infile) = @_ ? $_[0] : $ARGV; 			# default: check current input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
	  my($indir) = ($infile =~ m{^(.*)/[^/]*$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
	  return if defined($indir) && $indir ne '.';	# not in current directory
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
	  
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
	  my(@stat) = stat($infile);					# get time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
	  return unless (@stat);						# happens on stdin?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
	  
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   315
	  my($mtimef) = 9; my($mtime) = $stat[$mtimef];
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
	  for (my($d)=0; $d<=$#antsDeps; $d++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
		  @stat = stat($antsDeps[$d]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
		  if (@stat) {
32
4c6434bb5124 before Hamburg
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 30
diff changeset
   319
			  croak("$0: <$infile> ($mtime) is stale with respect to <$antsDeps[$d]> ($stat[$mtimef])\n")
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   320
				  unless ($stat[$mtimef] <= $mtime);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
		  } elsif (!$warned) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			  &antsInfo("WARNING: dependency $antsDeps[$d] (&, possibly, others) not found");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
			  $warned = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
		  }
23
a4fef65fd959 V6.2 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 15
diff changeset
   325
	  }
25
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 23
diff changeset
   326
#	  undef(@antsDeps);								# don't check again; BUG: 01/15/2016
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
  }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
} # static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
sub antsParseHeader()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	return if ($antsFixedFormat || !$antsParseHeader);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
	$antsDoParseHeader = 1;						# glorks!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
	my($success) = &antsIn();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
	&antsCheckDeps();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
	return $success;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   341
sub def_abbrev($)
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   342
{
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   343
	my($def) = @_;
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   344
	if ($def =~ /^\{(\w+)\}$/) {
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   345
		push(@Layout,$1);
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   346
	} else {
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   347
		my($name,$val) = ($def =~ /(\w+)\{([^\}]+)\}/);
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   348
		$P{$name} = $val;
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   349
	}
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   350
}
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   351
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
sub antsReCompile()								# re-compile with funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
{ eval '
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
sub antsIn()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
{
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   357
	local(@Layout);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
	undef(@Layout);								# needed, but unclear why
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
	undef($antsNewFile);						# assume no new file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
	unless ($antsHeaderParsed || $antsDoParseHeader) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
		for (my($i)=0; $i<=$#ARGV; $i++) {		# check file params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
			open($ARGV[$i]),croak("$0: $ARGV[$i]: $!\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
				unless (-f $ARGV[$i] && -r $ARGV[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
		&antsAddDeps($ARGV,@ARGV);				# <> files
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
		$antsCurHeader =~ s/\]/\] |/			# mark as pipeline
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
			unless (-t 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
	    $antsHeaderParsed = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
	my(@tempARGV);								# temporily remove non-file args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
	if ($antsDoParseHeader) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
		my($ai) = $#ARGV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
		while ($ai >= 0 && -f $ARGV[$ai]) { $ai-- }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
#		print(STDERR "before: @ARGV\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
		push(@tempARGV,splice(@ARGV,0,$ai+1));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
#		print(STDERR "after: @ARGV\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
		if ($#ARGV < 0 && -t 0) {					# donot wait on stdin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
			push(@ARGV,@tempARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
			$antsDoParseHeader=0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
			return 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	splice(@ants_,0,$antsBufSkip);					# shift buffers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
	IN: until ($#ants_>=0 && &antsBufFull()) {		# fill buffer; NEEDS RECOMPILE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
		if (defined($antsPeekBuffer)) {				# from header parsing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
			$_ = $antsPeekBuffer;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
			$antsPeekBuffer = undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
			unless ($_ = <>) {						# get next record
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
				# EOF before buffer is full (can be partially filled)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
				unshift(@ARGV,@tempARGV);			# restore ARGV list
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
				@antsLayout = @Layout if (@Layout);	# set last defined layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
				$antsBufNFields = @antsLayout		# adjust buffer width
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
					if (@antsLayout > $antsBufNFields);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
				my($lastFile) = $P{PATHNAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
				$P{PATHNAME} = $ARGV;				# set pseudo %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
				($P{DIRNAME},$P{FILENAME}) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
					($ARGV =~ m{^(.*)/([^/]+)$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
				unless (defined($P{DIRNAME})) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
					$P{DIRNAME} = ".";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
					$P{FILENAME} = $P{PATHNAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
				($P{BASENAME},$P{EXTN}) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
					($P{FILENAME} =~ m{^([^\.]+)\.(.+)$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
				unless (defined($P{EXTN})) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
					$P{BASENAME} = $P{FILENAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
					$P{EXTN} = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
				$P{DEPS} = "@antsDeps";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
				return 0 if ($antsDoParseHeader);	# empty file!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
				$P{RECNO} = -1						# set pseudo %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
					unless defined($P{RECNO});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
	    		$P{RECNO}++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
			    $P{LINENO} = ($ARGV eq $lastFile) ? $P{LINENO}+1 : 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
				return 0;							# return EOF
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
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
		next IN if (length == 1 && ord == 26);		# handle MS-DOG EOF
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
		&antsActivateOut(),next IN					# copy activation status
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
			if (m{^#![^\s]*/perl\s.*list$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
		exit(1) if (/^#ANTS#ERROR#/);				# error in pipeline
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
		if (/^#ANTS#PARAMS# ([^\{]+)\{([^\}]*)\}/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
			if (eval($antsIgnoreInputParams)) {		# eval only 1st time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
				$antsIgnoreInputParams = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
				next IN;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
			do {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
				if ($2 eq "") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
					delete($P{$1});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
					$P{$1} = $2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
			} while ($\' =~ m/ ([^\{]+)\{([^\}]*)\}/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
		} elsif (/^#ANTS#DEPS# \{([^\}]*)\}/) {		# handle dependencies
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
			do { push(@antsDeps,$1); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
				while ($\' =~ m/ \{([^\}]*)\}/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
		} elsif (/^#ANTS# \[[^\]]*\] [^|]/) {		# pipe-head => restart dependencies
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
			undef(@antsDeps);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
		} elsif (/^#ANTS#FIELDS# \{([^\}]*)\}/) {	# handle layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
			undef(@Layout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
			do {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
				push(@Layout,$1 eq "" ? undef : $1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
			} while ($\' =~ m/ \{([^\}]*)\}/);
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   459
		} elsif (/^# (\{\w+\}|\w+\{[^\}]+\})+/) {		# ABBREVIATED DEFINITIONS
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   460
			my($match) = $1; my($rem) = $\';
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   461
			do {
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   462
				def_abbrev($match);
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   463
				($match,$rem) = ($rem =~ /(\{\w+\}|\w+\{[^\}]+\})(.*)/);
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   464
			} while ($match);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
		}
8
248fef05e79d begin Version 6.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   466
				
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
		if (!($opt_Q || $antsNoHeaderCopy) && /^#ANTS#/) {	# handle headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
			if (defined($antsHeadersPrinted)) {		# embedded headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
# The following is somewhat subtle because it must prevent embedded
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
# layout definitions to be copied 1) even if embedded headers are requested
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
# (because otherwise there will be embedded-layout-change errors) 2) but not
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
# if there has not been a layout defined already (ubtest common_opts);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
				print unless ($antsNoEmbeddedHeaderCopy ||
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
								(/^#ANTS#FIELDS#/ && @antsLayout));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
				$antsOldHeaders .= $_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
			next IN;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
		if (/^#/) {								# handle non-header comments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
			&antsPrintHeaders(STDOUT,@antsNewLayout),print if ($opt_P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
			next IN;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
		next IN if /^\s*$/;						# skip empty lines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
		unless ($antsFixedFormat) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
			s/^\s+//;							# strip leading space
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
			s/#.*$// unless ($opt_P);			# strip trailing comments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
			s/\s+$//;							# strip trailing space
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
		# DONE WITH HEADER PARSING
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
		
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   495
		# Handle Layout changes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   496
		#	- only allow when $antsAllowEmbeddedLayoutChange is set
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   497
		#	- ensure that antsLayout always contains up-to-date Layout
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   498
		if (!$antsAllowEmbeddedLayoutChange && @Layout && @antsLayout && ("@Layout" ne "@antsLayout")) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   499
			my(@OL) = @antsLayout;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   500
			my(@NL) = @Layout;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   501
			while ($OL[0] eq $NL[0]) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   502
				shift(@OL); shift(@NL);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   503
			}
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   504
			croak("$0: embedded layout change when reading file $ARGV <@OL[0..3] ...> -> <@NL[0..3] ...>")
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   505
		}
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
   506
		@antsLayout = @Layout if (@Layout);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
		$P{RECNO} = -1 unless defined($P{RECNO});	# set pseudo %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
		$P{LINENO} = -1 unless defined($P{LINENO});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
		$P{DEPS} = "@antsDeps";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
		my($lastFile) = $P{PATHNAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
		$P{PATHNAME} = $ARGV;		    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
		($P{DIRNAME},$P{FILENAME}) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
			($ARGV =~ m{^(.*)/([^/]+)$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
		unless (defined($P{DIRNAME})) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
			$P{DIRNAME} = ".";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
			$P{FILENAME} = $P{PATHNAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
		($P{BASENAME},$P{EXTN}) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
			($P{FILENAME} =~ m{^([^\.]+)\.(.+)$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
		unless (defined($P{EXTN})) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
			$P{BASENAME} = $P{FILENAME};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
			$P{EXTN} = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
		if ($antsDoParseHeader) {					# done parsing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
			unshift(@ARGV,@tempARGV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
			$antsDoParseHeader = undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
			$antsPeekBuffer = $_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
			$antsPadOut = $antsBufNFields = split($opt_I,$antsPeekBuffer);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
			return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
		}
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   534
		
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
	    $P{RECNO}++;								# update pseudo %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
	    $P{LINENO} = ($ARGV eq $lastFile) ? $P{LINENO}+1 : 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   538
		s/[Nn][Aa][Nn]/NaN/g;						# turn all nan into NaN 
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   540
        local(@in) = split($opt_I);                 # needs to be local for -S 
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   541
		if (@in > $antsBufNFields) {				# increase # of fields to expect
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   542
			$antsBufNFields = @in;
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   543
			for ($i=0; $i<$#ants_; $i++) {			# update recs already in buffer
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   544
				push(@{$ants_[$i]},NaN)
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   545
					while ($#{$ants_[$i]}+1 < $antsBufNFields);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   546
            }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
		}
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   548
		push(@in,NaN)								# pad current record
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   549
            while (@in<$antsBufNFields);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   551
        if (defined($opt_S)) {                      # -S)elect
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   552
            $opt_S = &antsCompileAddrExpr($opt_S,\'$in\')
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   553
                unless ref($opt_S);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   554
            next IN unless (&$opt_S);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   555
        }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   556
        
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   557
        if (@antsNFNames) {                         # -N)ums
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   558
            for (my($i)=0; $i<=$#antsNFNames; $i++) {
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   559
                unless (defined($antsNfnr[$i])) {
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   560
                    if ($antsNFNames[$i] =~ /^%/) {
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   561
                        croak("$0: illegal -N option ($antsNFNames[$i] undefined)\n")
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   562
                            unless (defined($P{$\'}));
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   563
                        next IN unless (numberp($P{$\'}));
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   564
                    } else {
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   565
                        $antsNfnr[$i] = &fnr($antsNFNames[$i]);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   566
                        next IN unless (numberp($in[$antsNfnr[$i]]));
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   567
                    }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   568
                } else {
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   569
                    next IN unless (numberp($in[$antsNfnr[$i]]));
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   570
                }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   571
            }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   572
        }
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   574
        chomp;
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   575
        $antsLineBuf = $_;                      # save
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   576
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   577
        push(@ants_,[@in]);                     # add to buffer
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   578
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   579
###		if ($#{$ants_[$#ants_]}+1 > $antsBufNFields) {	# grow # of fields
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   580
###			$antsBufNFields = $#{$ants_[$#ants_]} + 1;
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   581
####			print("antsBufNFields := $antsBufNFields --- $_");
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   582
###				for ($i=0; $i<$#ants_; $i++) {
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   583
###					push(@{$ants_[$i]},NaN)
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   584
###						while ($#{$ants_[$i]}+1 < $antsBufNFields);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   585
###	            }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   586
###	        }
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   587
###		}
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   588
###		push(@{$ants_[$#ants_]},NaN)			# pad this
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   589
###	        while ($#{$ants_[$#ants_]}+1 < $antsBufNFields);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
	$ants_ = ($#ants_ - $#ants_%2) / 2;			# set current idx to centre
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
#	print(STDERR "reading done; $#ants_+1 recs in buf, $ants_ is cur\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
	if ($antsLastFileName ne $ARGV) {			# signal new file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
		$antsLastFileName = $ARGV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
		$antsNewFile = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
	} 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
	return $#ants_+1;							# ok
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
{ my(@ofn);				# output layout				# STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
  my(@OEparam);			# -F %PARAMs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
  my(@OEfield);			# -F fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
  my(@OEexpr);			# -F exprs (compiled)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
  my($EOparamsOnly);	# nothing but %PARAMs in -F
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
  sub antsOut(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
  {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
	my(@out) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
	if (@out == 1 && $out[0] eq "EOF") {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
		undef(@ofn); undef(@OEparam); undef(@OEfield); undef(@OEexpr); undef($EOparamsOnly);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
		undef($antsHeadersPrinted); undef(@antsOutExprs);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
		$antsPadOut = $antsBufNFields = @antsNewLayout;	# NB: MUST BE SET BEFORE &antsOut("EOF");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
		return;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
	# STEP 0: PREPARE STUFF
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
	@ofn = @antsNewLayout unless (@ofn);			# output layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
	@ofn = @antsLayout unless (@ofn);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
	# STEP 1: CONSTRUCT @out IF NEEDED
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
	unless (@out > 0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
		for (my($fnr)=0; $fnr<$antsBufNFields; $fnr++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
       		$out[$fnr] = &antsBufOut($fnr);			# calc; NEEDS RECOMPILE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
	# STEP 2: HANDLE FIELD SELECTION (-F)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
	if (@antsOutExprs) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
		unless ($antsOutExprsCompiled) {			# parse/compile
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
			my(@ofn_buf) = @ofn;					# save current output layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
			undef(@ofn);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
			
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
			$OEparamsOnly = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
			for (my($if)=my($of)=0; $if<@antsOutExprs; $if++,$of++) {
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   644
#				if ($antsOutExprs[$if] =~ m{^%([\w\.]+)$}) {	# %PARAM
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   645
				if ($antsOutExprs[$if] =~ m{^%([^=]+)$}) {		# %PARAM
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
					$ofn[$of] = $1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
					$OEparam[$of] = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
	            } elsif ($antsOutExprs[$if] eq \'$@\') {		# all fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
					undef($OEparamsOnly);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
	            	for (my($i)=0; $i<@ofn_buf; $i++,$of++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
	            		$ofn[$of] = $ofn_buf[$i];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
	            		$OEfield[$of] = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
	            	}
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   654
#				} elsif ($antsOutExprs[$if] =~ m{^[\w\.]+$}) { 	# single field
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   655
				} elsif ($antsOutExprs[$if] =~ m{^[^=]+$}) { 	# single field
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   656
					undef($OEparamsOnly);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   657
					$ofn[$of] = $antsOutExprs[$if];
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   658
					$OEfield[$of] = &outFnr($antsOutExprs[$if]);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
	            } else {										# expression
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
					undef($OEparamsOnly);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
					my($expr);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   662
	            	($ofn[$of],$expr) = ($antsOutExprs[$if] =~ m{^([^=]*)=(.*)$});
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
	            	croak("$0: cannot parse -F $antsOutExprs[$if]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
	            		unless defined($expr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
	            	my(@tmp) = @antsLayout;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
	            	@antsLayout = @ofn_buf;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
	            	$OEexpr[$of] = &antsCompileEditExpr($expr,\'$out_buf\');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
	            	@antsLayout = @tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
	            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
	        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
			$antsOutExprsCompiled = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
		local(@out_buf) = @out;						# save current output data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
		undef(@out);								# accessible from within exprs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
		for (my($f)=0; $f<@ofn; $f++) {				# create @out according to -F
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
			if ($OEparam[$f]) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
				$out[$f] = $P{$ofn[$f]};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
			} elsif (defined($OEfield[$f])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
				$out[$f] = $out_buf[$OEfield[$f]];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
			} else {
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   683
				eval(\'$out[$f] = &{$OEexpr[$f]};\');	# print errors and continue
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   684
				print(STDERR $@) unless ($@ eq "");
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
	# STEP 3: PRINT HEADERS 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   691
	if (@antsNewLayout || @antsOutExprs) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   692
		&antsPrintHeaders(STDOUT,@ofn);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   693
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   694
		&antsPrintHeaders(STDOUT);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   695
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   696
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   697
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   698
	# STEP 4: DONE, DUE TO -H RUNNING OUT
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   699
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   700
	&antsExit() if (defined($opt_H) && ($opt_H-- == 0));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   701
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   702
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   703
	# STEP 5: PRINT DATA
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   704
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   705
	$antsPadOut = @ofn if ($antsPadOut >= 0 && @ofn);
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   706
	push(@out,NaN) while (@out < $antsPadOut);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   707
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   708
	my($outStr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   709
	for (my($fnr)=0; $fnr<=$#out; $fnr++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   710
		$out[$fnr] =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   711
			fmtNum($out[$fnr],
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   712
				   @antsNewLayout ? $antsNewLayout[$fnr] : $antsLayout[$fnr]);
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   713
		$outStr .= (defined($out[$fnr]) && $out[$fnr] ne "" ? $out[$fnr] : NaN)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   714
				 . ($fnr == $#out ? $opt_R : $opt_O);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   715
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   716
	print($outStr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   717
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   718
	# STEP 6: DONE, DUE TO -F WITH PARAMS ONLY
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   719
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   720
	&antsExit() if ($OEparamsOnly);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   721
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   722
  } # antsOut()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   723
} # STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   724
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   725
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   726
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   727
sub antsIO()									# combine input and output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   728
{												# NB: BYPASSES &antsBufOut()!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   729
	my($i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   730
	for ($i=0; $i<$antsBufSkip && $i<=$#ants_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   731
		&antsOut(@{$ants_[$i]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   732
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   733
	return &antsIn();							# re-fill
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   734
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   735
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   736
sub antsPreFlush()								# pre-flush buffer to cur
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   737
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   738
	my($i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   739
	for ($i=0; $i<=$ants_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   740
		&antsOut(@{$ants_[$i]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   741
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   742
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   743
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   744
sub antsPostFlush()								# post-flush buffer after cur
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   745
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   746
	my($i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   747
	for ($i=$ants_; $i<=$#ants_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   748
		&antsOut(@{$ants_[$i]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   749
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   750
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   751
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   752
sub antsFlush()									# flush buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   753
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   754
	&antsOut(@{$ants_[0]}),shift(@ants_)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   755
		while ($#ants_ >= 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   756
}'; die("antsReCompile: $@\n") if ($@);			# re-compile functions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   757
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   758
} # of antsReCompile()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   759
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   760
&antsReCompile();								# compile
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   761
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   762
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   763
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   764
sub antsSetR_($$$)								# set field in any rec
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   765
{ my($r,$f,$v) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   766
	$antsBufNFields = $f+1						# auto extension
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   767
		if ($antsBufNFields-1 < $f);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   768
	while ($#{$ants_[$r]} < $f-1) {	
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 39
diff changeset
   769
		push(@{$ants_[$r]},NaN);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   770
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   771
	$ants_[$r][$f] = $v;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   772
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   773
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   774
sub antsSet_($$)								# set field in current rec
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   775
{ &antsSetR_($ants_,$_[0],$_[1]); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   776
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   777
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   778
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   779
{ my(%sExprs); # multiple layouts -> multiple compiled -S exprs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   780
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   781
sub antsFileIn()								# read from a file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   782
{ 	my($f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   783
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   784
	REDO:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   785
		return () unless ($_ = <$f>);			# get next record (return EOF)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   786
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   787
		goto REDO if /^#/;						# skip comments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   788
		goto REDO if /^\s*$/;					# skip empty lines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   789
		s/^\s+//;								# remove leading spaces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   790
		s/#.*$//;								# remove trailing comments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   791
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   792
		local(@in) = split($opt_I);				# needs to be local for -S 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   793
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   794
		if (defined($opt_S)) {					# -S)elect
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   795
			$sExprs{$f} = &antsCompileAddrExpr($opt_S,'$in')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   796
				unless defined($sExprs{$f});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   797
			goto REDO unless (&{$sExprs{$f}});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   798
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   799
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   800
		if (@antsNFNames) {						# handle -N)ums
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   801
			for (my($i)=0; $i<=$#antsNFNames; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   802
				if ($antsNFNames[$i] =~ /^%/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   803
					croak("$0: illegal -N option ($antsNFNames[$i] undefined)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   804
						unless (defined($P{$'}));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   805
					goto REDO unless (numberp($P{$'}));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   806
				} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   807
					$antsNfnr[$i] = &fnr($antsNFNames[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   808
					goto REDO unless (numberp($in[$antsNfnr[$i]]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   809
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   810
	        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   811
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   812
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   813
		return @in;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   814
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   815
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   816
} # static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   817
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   818
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   819
# Utilities
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   820
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   821
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   822
sub antsPrintHeaders($@)						# handle headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   823
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   824
	return if ($antsHeadersPrinted);			# do only once
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   825
    $antsHeadersPrinted = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   826
	local(*fh,@newLayout) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   827
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   828
	if (@newLayout) {							# check for duplicate field names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   829
		my(%fn);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   830
		for (my($i)=0; $i<=$#newLayout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   831
			next unless defined($newLayout[$i]) && $newLayout[$i] ne '';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   832
			if ($fn{$newLayout[$i]}) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   833
				&antsInfo("duplicate output field <$newLayout[$i]> changed to <$newLayout[$i]_>");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   834
				$newLayout[$i] .= '_';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   835
				again;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   836
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   837
			$fn{$newLayout[$i]} = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   838
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   839
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   840
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   841
	return if ($opt_Q);							# suppress
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   842
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   843
	if (defined($antsActiveHeader)) {			# activate file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   844
		chmod(0777&~umask,*fh);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   845
		print(fh $antsActiveHeader);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   846
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   847
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   848
	print(fh $antsOldHeaders);					# old headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   849
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   850
	print(fh $antsCurHeader) unless ($opt_X);	# new headers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   851
	print(fh $antsCurParams);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   852
	print(fh $antsCurDeps) unless ($opt_X);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   853
	if (@newLayout) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   854
		print(fh "#ANTS#FIELDS# ");				
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   855
		for (my($i)=0; $i<=$#newLayout; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   856
			print(fh "{$newLayout[$i]} ");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   857
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   858
		print(fh "\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   859
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   860
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   861
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   862
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   863
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   864
sub antsExit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   865
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   866
	&antsPrintHeaders(STDOUT,@antsNewLayout);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   867
	exit(0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   868
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   869
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   870
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   871
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   872
# NB: to use antsInfo in expressions, a return value of 1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   873
#	  has been assumed!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   874
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   875
sub antsInfo(@)									# add info to header & STDERR
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   876
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   877
	return 1 if ($opt_Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   878
	my($fmt,@args) = @_;						# can't do it directly!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   879
	my($msg) = sprintf($fmt,@args);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   880
	$antsCurHeader .= "#ANTS# $0: $msg\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   881
	print(STDERR "$0: $msg\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   882
	return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   883
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   884
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   885
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   886
# %PARAM-related stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   887
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   888
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   889
sub antsAddParams(@)							# add params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   890
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   891
	my($i);	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   892
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   893
	$antsCurParams .= "#ANTS#PARAMS#";			# first, create new param spec
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   894
	for ($i=0; $i<$#_; $i+=2) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   895
		my($v) = $_[$i+1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   896
		$v =~ s/\n/\\n/g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   897
		$antsCurParams .= " $_[$i]\{$v\}";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   898
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   899
	$antsCurParams .= "\n";
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   900
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   901
	for ($i=0; $i<$#_; $i+=2) {					# then, set (overwrite) param vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   902
		my($v) = $_[$i+1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   903
		$v =~ s/\n/\\n/g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   904
		$P{$_[$i]} = $v;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 25
diff changeset
   905
	}
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   906
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   907
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   908
sub antsFileParams()							# get params from file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   909
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   910
	my($f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   911
	my(%P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   912
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   913
	while ($_ = <$f>) {							# get next record
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   914
		if (/^#ANTS#PARAMS# ([^\{]+)\{([^\}]*)\}/) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   915
			do {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   916
				$P{$1} = $2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   917
				$P{$1} =~ s/^\s*//;				# ensure non-null
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   918
			} while ($' =~ m/ ([^\{]+)\{([^\}]*)\}/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   919
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   920
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   921
	seek($f,0,0) || croak("$0: $@\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   922
	return %P;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   923
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   924
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   925
# antsFileScanParam() only scans the 1st header!!!!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   926
#	empty lines are ok, though
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   927
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   928
sub antsFileScanParam()							# find param in file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   929
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   930
	my($f,$pn) = @_;
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   931
	my($v1,$v2);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   932
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 12
diff changeset
   933
	$pn = $' if ($pn =~ /^%/);					# strip optional leading %
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   934
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   935
	while ($_ = <$f>) {							# get next record
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   936
		last unless (/^#/ || /^\s*$/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   937
		next unless (/^#ANTS#PARAMS# /);
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   938
		$v1 = $1 if (/ $pn\{([^\}]*)\}/);
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   939
		$v2 = $1 if (/::$pn\{([^\}]*)\}/);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   940
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   941
	seek($f,0,0) || croak("$0: $@\n");
12
58c5aa230550 just before adding new special arg 'prefix(file)suffix'
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   942
	return defined($v1) ? $v1 : $v2;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   943
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   944
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   945
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   946
# Layout-related stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   947
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   948
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   949
sub antsFileLayout($)							# return layout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   950
{ 	my($f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   951
	my(@lo);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   952
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   953
	while ($_ = <$f>) {							# get next record
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   954
		next unless (/^#ANTS#FIELDS# /);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   955
		@lo = split(' ',$');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   956
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   957
	seek($f,0,0) || croak("$0: $@\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   958
	for (my($i)=0; $i<=$#lo; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   959
		$lo[$i] =~ s/^\{(.*)\}$/$1/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   960
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   961
	return @lo;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   962
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   963
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   964
sub antsFileScanFnr($$)							# find fnr in file
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   965
{ 	my($f,$fn) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   966
	my(@lo) = &antsFileLayout($f);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   967
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   968
	for (my($f)=0; $f<=$#lo; $f++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   969
		return $f if ($fn eq $lo[$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   970
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   971
	return undef;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   972
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   973
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   974
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   975
# Deps-related stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   976
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   977
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   978
sub antsAddDeps(@)								# add Deps
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   979
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   980
	my(@deps) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   981
	return if $opt_D || (@deps==1 && ($deps[0] eq '-' || $deps[0] eq ''));	# STDIN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   982
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   983
	$antsCurDeps .= '#ANTS#DEPS#';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   984
	for (my($i)=0; $i<=$#deps; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   985
		next if (length($deps[$i]) == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   986
		$antsCurDeps .= " \{$deps[$i]\}";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   987
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   988
	$antsCurDeps .= "\n";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   989
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   990
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   991
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   992
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   993
1;