Precedent character defined message format input program.

The header is parsed and put into FIP header fields. The file is slotted into
the spool/2brouted queue for IPROUTE to process and route.

The parameter table can have :
    ;; comment line starts witha semicolon
    connect: connect string for dialup          default: none
    discon:  disconnect string for dialup           default: none
    soh:    start of header string              default: none
    stx:    start of text string                default: none
    eot:    end of text string              default: none
    complete-soh:  These are the same as soh and eot but are the COMPLETE
    complete-eot:   string to search for (ie ignoring any 'prestr' or
        'endstr'. Use these where the start/end is NOT tagged like
        the other fields.

Note that at least one of soh/stx/eot must be specified. The precedence
chr/string and the end string (if applicable) is assumed and should NOT be
specified in soh, stx or eot.

Up to 10 different soh and eots may be tracked at the same time (but NOT stx
You must specify EITHER one or more 'soh' OR one or more 'complete-soh' BUT not
mix them.

Other possible keywords are :

    prestr: key field start chr/string          default: "{"
    endstr: key field end   chr/string          default: none
    key:    key length and type in form key: (len) : (type) default: 2:p
        len is the length of the string or 0 for any length
        type is a-alphabetic, u-uppercase, l-lowercase
            n-number, p-printable, s-space(or tab, CR, NL or FF)
            b-binary (ie anything), x-alphanumeric,
            c-control (ie < 040 or >= 0177),
            z-anpa hdr field (ie alnum plus non-quad/format punct.
        (Note the type parameter is ignored in the current release)
        If length is 0 for any length, there MUST be an 'endstr'.
    fiphdr: codes to translate incoming header fields to FIP hdr fields
        eg :    fiphdr:slug:SN
        Note that ALL incoming fields MUST have a corresponding
        fip hdr field associated with it or it will be ignored.
        Please see the relevant chapter in the System Managers'
        Administration guide for further information.   default: none
    extra-fiphdr: (FipSeq)
    fixhdr:  (FipSeq) extra FipHeader field(s) - used to add more metadata
        fields or to force them to a fixed text. If more than
        one field is added, use # to separate them. default: none
    dup:    name of a DUPLICATE wire where 2 copies of the same
        file is required (SD).              default: none
    route:  use this routing table (SR : used in iproute)
        default is name as per -n
    case:   header is case INsensitive  - yes/no    default: yes
        (ie {SN = {sl = {Sl = {sL
    bits:   no of bits - 5, 6, 7, 8             default: 7
    ansbck: ansbck string to be send back on eot        default: none
    ansfile: send file back as answer back          default: no
        This will echo back the file just received. The parameter
        is the number of lines to send back; if 0 the whole file
        is returned. In all cases, only the data part is sent.
    anseof: For ansfile, optional end of file string    default: none
    answait: For ansfile, Wait in seconds after file has been received
        before the 'ansfile' is sent back. Only used if 'ansfile'
        has been specified.             default: 5 secs
    binary: binary file - do NOT put a header on the files  default: no
         - yes/no
    outfmt: Output format for IPOUT (DF)            default: pwire
    enq:    incoming enq (single) chr to prompt enqbck msg  default: none
    enqmsg: message string to be send back on enq       default: none
    archive: archive log name if NOT that of name (-n)  default: name
    noarchive: Do NOT archive any incoming data     def: do archive
    toptxt: Information to add BEFORE the text in the file  default: none
        made of fixed data and FIP header fields.
        Specify as toptxt: \n\XK - from SU)\n
    txtsoh: ignore duplicate soh in text            default: no
    hdratend: Hdr fields can also after the text/data part. default: no
        Normally all the header fields Precede all the data.
        Use this flag where the body or data part is in the middle
        or is the first bit of text.
        The first new Hdr field will end the body text.
    wild:   wild chr if not "*"   ie wild:$       default: "*"
        This must be the first parameter in the file or you could get
        strange results.
    seqno: add a sequence no to the filename
        and increment automatically         default: no
    timeout: timeout in secs for end of file.       default: none
        ie timeout:30   PWIRE will wait for a gap of 30 seconds
        with no data received before closing the file.
    zapondel: Delete previous chr if a DEL or       default: no
            BS (backspace) arrives in data.
    eol-ends-field: CR or NL ends any Header field
    allownohdr: allow data to pour in even though there MAYBE no hdr. def:no
        Normally we want a valid header for the file.
        This will start a new file for every valid start of header
        while the default is to NOT start if in a file.
    strip-top-spaces: Zap any spaces and blank lines at the top of the file.
    comm-error-msg: Message for when data arrives that is not correctly ended.
        default is ** Truncated ** Communication line is Offline **
    dump-data: This makes a copy in /fip/dump of all incoming raw data
        Show timings        default: no
    hash-in-fiphdr: (FipSeq)
        Replace the '#' chr in a FipHdr field with this chr.
        The '#' is considered an end-of-fiphdr-field chr so will be stripped
        if we do not map it out of the way. The default is x9D octal 236
        eg  hash-is-fiphdr:\035
        Echo all incoming data.                 default: no
    copy-folder: (FipSeq pathname)
        make a copy of all incoming data in this folder default: no
    ignore-file: (Fld)=(FipSeq Data)
        ignore the whole file if this header field contains his data
        Use this to stip/ignore ChkMsgs for example
            ; ignore all files which incoming field 25 -> mapped to FipHdr AB = 'M'

Note that all strings can be printable chrs, unix escape chrs (\r, \n etc)
or octal number (\003).

Note that Character '#' are converted if in the FipHdr to x9D.

Example :
Incoming file is Atex CCM like -
    {SL thisfile {QU rubbsh-wir {HJ Y0004.35 {PG 003 {PR 5 {CA SPT {OP
GDZILA;01/07,18:10 {BT .... text {ET

Parameter file:
    ; Pwire parameter file

Where there may be more than one 'soh' etc, just specify all the variants in
the parameter file.
; Start of header
; ... either
; ... or

Example 2 using complete-soh:
; Reuters NTM format

; Story Text is 'fs 17'

; Product Code
; Topic Codes
; Company Indent
; Story Type
; TabText Indicator
; Language
; Priority
; Headline
; Named Item
; Signoff
;Story Text is 17 = stx:
; No of Words
; Category Codes
; Message Type
; Slug
; TI

Input Parameters :
    Mandatory :
    -n : name of this wire (usually the agency)     default: none
either  -s : Spider name or TTY device name         default: none
    -p : Spider port number                 default: none
or  -P : Port on UnixBox to use for outbound        default: none
        This is only used where Terminal Servers canNOT run reverse telnet
        correctly and need to set a Permanent Virtual Connection across
        the ethernet to a fixed port number on the UnixBox
    Optional :
    -9 : do NOT use Speedy on a speedy system       default: do
    -L : For Passive (-P) type connections, reestablish the
        link after disconnection            default: no
    -o : Output Folder if not spool/2brouted        default: spool/2brouted
    -x : Wakeup string for pad or modem         default: none
        This wakes up the pad on startup.
    -y : Banner string to strip from terminal server.   default: SpiderBanner
    -Y : There is no banner to strip            default: as above
    -z : parameter file in tables/wire if different to -n name
    -v : Print the version number and exit

Version Control
;013b3  16nov04 added copydata:
    ;b3 14jun11 speedy -9, ignore-file added ;3 allow SU to be overwritten by
;012z   02nov99 added allownohdr, eol-ends-field, strip-top-spaces
    ;a 24jan00 bugette with sock being zapped.
    ;b 27apr00 new fiphdr date fields
    ;c 15aug00 minor tweaks and added com-error-msg
    ;d 23oct00 added completes
    ;e 15nov00 change '/' and '\' in a filename to '_'
    ;f/g/h 18may01 added dump-file:
    ;j 22oct01 dump-file/dump-data is now in /fip/dump with date
    ;k 19nov01 in FipHdr, convert '#' to PC_HASH (x9D)
    ;l 25jun02 added do_widgets
    ;m-n 03jul03 always get the seqno
    ;o 28oct03 added timing-stats:yes/no
    ;p 14nov03 added HASH-IN_FIPHDR
    ;q-t 19mar04 added echo-incoming-data:
    ;u 05jul04 added -o/outque
    ;v 12jul04 added -I for id
    ;w-z 20sep04 speedy plus bugette in dump-data
;011a   23may99 Added up to 10 soh/eots
        ;a 08jul99 allow $Hfilename as well as $h filename
;010c   21mar98 Trim each incoming FipHdr field to a max of 2k.
        ;a 23apr98 woops - altzone for HG
        ;b 30jun98 only start file on SOH - was on any tagstart
        ;c 12mar99 keylen <> 2
;009d   24jul97 added timeout and backspace ;a bad sock ;b timeoutbug ;c
        ;d 16oct97 added interim NT peek.
;008c    4oct96 HD/HM/HY and filename
        ;a 14mar97 WINNT tty/com
        ;b 27mar97 bugette - paxhdr NOT on after ProcessHdr
        ;c 16apr97 creat->open for WINNT
;007    21aug96 WINNT
;006    17jun96 strparse
;005    18jul95 bugo with -P
;004    11jan95 added -P for testing
;003a   26may93 added ansfile;a shm_name
;002    10feb92 added noarchive:
;000/1   5oct92 chris from vwire

-- todo
- for 'hidden's using ignore-file, log every x secs

-- stripped 20 sep04 cos of court case !
        The sender is GapCom, so interpret the binary header.   def:no
-- poss
    line:   Are header fields started/terminated by an eoln.default: no
    linesep: lines separator in header
        if not either CR or CR NL           no
    keepall: pass thru all including SOH STX and ETX    no
    - include standing file before text
        incbefore:path and filename         none
    - include standing file after text
        incafter:path and filename          none
        if param starts with '/' - absolute else in tables/wire

(copyright) 2017 and previous years FingerPost Ltd.