Introduction.

pcBESTOP is an interpreter written for the IBM compatiple PC. It is a
32-bit program that runs under Windows-95 and Windows NT. My intent was 
to provide pretty much the same functionality as the BESTOP that is 
available on the IBM370; you should read BESTOP.DOC that was written for
the IBM370 version. Differences between the mainframe version and the PC 
version are noted below.

pcBESTOP allows you to quickly reformat files, extract data, summarize
data, match/merge files, perform table lookup and other functions. It
is a positional language with a one character operations code. In the PC
version though, I've added a couple of two character op codes. Programs
can be written very very quickly.


Installation.

After you have unzipped all the files, put the .DLL and .EXE files into
a subdirectory that is in your path; for example C:\WINDOWS.


Status.

This is a shareware program. It may be distributed freely. Educational
institutions and students need not send remuneration; a postcard or e-mail
would be nice though.


Contacting the author.  (see REGISTER.TXT)


--------------------------------------------------------------------------

4/6/97 release 1

This is the first version of pcBESTOP. The functions that are currently 
supported are listed below, they are checked with a "û" mark. Item marked
with an "*" will not be implemented, at leat not now. 

  OPERATION                        SYNTAX

û IF_(Character_Field_Comparison)  I field [EGLU] [field|const] [AO ]
û IF_(Numeric_Field_Comparison)    I N     field  [EGLU]        [field|const] [AO ]  
* IF_(Multiple_Comparison)         I M     field  [EU]          const [AO ]
û IF_(character_comparison)        I C     field  [EU]          const
û IF_(Control_Break)               I field [AO ]
û IF_(Printer_Line_Test)           I C     [EGLU] const         [AO ]
û IF_(Matched Files)               I [ABM] [AO ]
û IF_(Start/End of File)           I [SF]  [AO ]
û OTHERWISE                        O
û UNCONDITIONAL                    U
û MATCH_KEYS                       K field field  (field field)...
û MOVE                             M [field|const] field
û MOVE_(from_displaced_field)      M field D field field
û MOVE_(to_displaced_field)        M [field|const] field D field
û FIND                             F [field|const] field D field
û DO_AGAIN                         D
û EDIT                             E field field const
û CLEAR                            C field const
û ADD                              + [field|const]  field
û SUBTRACT                         - [field|const]  field
û MULTIPLY                         X field [field|const] (0-9) field
û DIVIDE                           / field [field|const] (0-9) field
û WRITE_(Numbered_Files)           W (1-6)
û WRITE_(Listing_with_Spaces)      W L [1-9H]
* WRITE_(Listing_with_Skip_to_Numbered_Line)       W L S const
* Write_(Space_Printer_without_Printing)           W S [1-9H]
* WRITE_(Skip_to_Numbered_Line_without_Printing)   W S const
û GET                              G
û HALT                             H  
û SUBROUTINE                       S [1-9A-Z]
û RETURN                           R
û BRANCH                           B [1-9A-Z]
û TABLE_DEFINITION                 T [1-9A-Z] field  field
û TABLE_ENTRY                      const
û LOOKUP                           L [1-9A-Z] [ELH] 
  

The files that are supported are 1 thru 6, L and S. Very little syntax
checking is being done; I expect the programs to be clean. Below is
a typical batch file. It shows how external files names are communicated
to the program. 


@set dd:sysprint=STDOUT:
@set dd:sysprint=dump,append(n)
@SET DD:PROGRAM=P3.BST 
@set dd:file1=file1
@set dd:file2=extract.dat,append(n)
@set dd:file3=MYCOMP.DSM
@set dd:listing=matched.dat,append(n)
BESTOP /T=1,A=1,B=3


*here is a test program.
K 1.2.5 3.2.5 
I M 
m 1.1.50 s.1.50
m s.41.50 l.1.10
C L.66 'a'
w l 
I 3.30 E '0'
M 3.1.66 2.1.66
W 2


When I ran this batch file and program, I got the following on a
200Mhz Pentium.


D:\HB2|t3
D:\HB2|BESTOP /T=1,A=1,B=3

pcBESTOP ;-) 97.095.10:08á  (C)1997 Hans J. Becker
Elapsed time=     2 sec
F1     23 F2    978 F3   7233 F4      0 F5      0 F6      0 List      23


NOTES:


If an output file previously exists, then new data will be appended unless
it does not previously exist or 'append(n)' has been specified.

All subroutines need to be coded at the "end" of the program. The table
follows the subroutines.

Results from arithmetic calculations will be stored in zoned-decimal
format. Since fields involved in calculations are implictly identified
as numeric, resulting fileds will be zero filled.

The KEY instruction, if used, must be the first instruction in the program.

All comments and blank lines are ignored and not stored (v. ";" below).

Use single quote to delimit strings.

"W L 2" means write AFTER skipping one lines; i.e. 2 lines are written.

The default values are LNSIZE=80 and PGSIZE=60 for LISTING. These values
can be overriden in the execute statement as follows

    BESTOP /I=1,LNSIZE=133,PGSIZE=55

To write a header for a report, typically code something like this

    I C L '02'
    C L.1.80 '*'
    W L 1
    C L.1 '*'
    C L.80 '*'
          [more header info]
    W L
    C L.1.80 '*'
    W L 1
    U

When the number of lines on a page exceed PGSIZE, a new page and header
will be written. The LISTING file has the "print" attribute, therefore
it starts out with a 0x0C.

Control-break processing and matched-file processing are 
mutually exclusive.


--------------------------------------------------------------------------

Changes:

4/9/97   

   Clear buffer i for W i, i.e. clear the buffer after a write.

   BESTOP can now do a table look-up. You can have only one table
   and it has to be an internal table i.e. part of the program.


4/10/97  

   The look-up table gets sorted and the search is a binary search
   when L i E was coded. A sequential search is used whenever
   L i L or L i H is coded.



4/11/97  

   Multiply and divide works now. The scale factor for division is 6;
   i.e. you can specisfy up to 6 decimal places.

   Added E(diting) facility. You can have a period as an insertion
   character  and blanks are uses for zero suppression; this is
   the only editing than can be done at this time.

4/12/97  

   Consolidated compound condition processing for the various forms
   of the IF statement. 

   Added Character Compare IF.


4/13/97  

   DO AGAIN  has been added. 

4/18/97
  
   Added the DATE are, i.e. YYMMDD is in D.27.31
   
   Allow for stacked commands using the semicolon as the parsing
   character (see program example P8). Be aware that the semicolon
   also terminates a comment, i.e. the following line will produce
   and error
                *TESTING NUMERIC IF; CONTROL BREAK

   since it parses as
     
                *TESTING NUMERIC IF
                CONTROL BREAK              <- error

   Added the CHange command 

                CH 'target' [col1][/col2] 'replacement'


   There are several useful command line switches:

   DEBUG prints the program after it has been resolve by the parsing
   routine. Use this to verify that this is what you expected the
   program to do. Only the fields 1 thru 5 are displayed.
 

   D:\HB2\EXAMPLES|BESTOP /I=1,DEBUG
   
   pcBESTOP ;-) 97.109.08:30  (C)1997 Hans J. Becker
   001 1: I          2: 1.3        3: E          4: '9'        5: O
   002 1: I          2: 1.11.13    3: E          4: 'rwx'      5:
   003 1: M          2: 1.1.80     3: S.1.80     4:            5:
   004 1: CH         2: 'ico'      3: 6/20       4: '&&&&'     5:
   005 1: CH         2: 'DATA'     3: 'data'     4:            5:
   006 1: CH         2: '\NETSCAPE 3: ''         4:            5:
   007 1: CH         2: '5'        3: '$'        4:            5:
   008 1: CH         2: ':'        3: 48         4: '='        5:
   009 1: CH         2: ' '        3: 11/50      4: '_'        5:
   010 1: M          2: S.1.80     3: L.1.80     4:            5:
   011 1: W          2: L          3: 1          4:            5:
   012 1: U          2: STOP       3: HERE       4:            5:
   Elapsed time=     1 sec     04/19/97      08:36.32
   F1      81 F2       0 F3       0 F4       0 F5       0 F6       0 List       46
   

   VERBOSE prints the program as it is read.


   D:\HB2\EXAMPLES|BESTOP /I=1,verbose
   
   pcBESTOP ;-) 97.109.08:30  (C)1997 Hans J. Becker
   *TEST  CHange
   I 1.3 E '9' O
   I 1.11.13 E 'rwx'
   M 1.1.80 S.1.80           *ch is made only in "S"
   CH 'ico' 6/20   '&&&&'    *note ch in size
   CH 'DATA' 'data'
   ch '\NETSCAPE' ''         *note ch in size
   CH '5' '$'
   ch ':' 48   '='           *ch in specific col
   CH ' ' 11/50  '_'         *ch between specific cols
   M S.1.80 L.1.80
   W L 1
   Elapsed time=     0 sec     04/19/97      08:56.24
   F1      81 F2       0 F3       0 F4       0 F5       0 F6       0 List       46
   
   
   TRACE shows order in which the program statements are executed. Use
   this to checks your program logic.   
   
   
   D:\HB2\EXAMPLES|BESTOP /I=1,trace

   pcBESTOP ;-) 97.109.08:30  (C)1997 Hans J. Becker                    
   <LOGIC>
   001 1: I          2: 1.3        3: E          4: '9'        5: O         
   002 1: I          2: 1.11.13    3: E          4: 'rwx'      5:           
   003 1: M          2: 1.1.80     3: S.1.80     4:            5:           
   004 1: CH         2: 'ico'      3: 6/20       4: '&&&&'     5:           
   005 1: CH         2: 'DATA'     3: 'data'     4:            5:           
   006 1: CH         2: '\NETSCAPE 3: ''         4:            5:           
   007 1: CH         2: '5'        3: '$'        4:            5:           
   008 1: CH         2: ':'        3: 48         4: '='        5:           
   009 1: CH         2: ' '        3: 11/50      4: '_'        5:           
   010 1: M          2: S.1.80     3: L.1.80     4:            5:           
   011 1: W          2: L          3: 1          4:            5:           
   012 1: U          2: STOP       3: HERE       4:            5:           
   <LOOP><001><002><001><002><001><002><001><002><001><002><001><002><001><002><001
   ><002><001><002><001><002><003><004><005><006><007><008><009><010><011><001><002
   ><001><002><001><002><001><002><003><004><005><006><007><008><009><010><011><001
   ><002><001><002><001><002><001><002><001><002><001><002><001><002><001><002><001
   ><002><001><002><001><002><001><002><001><002><003><004><005><006><007><008><009
   ><010><011><001><002><001><002><001><002><001><002><001><002><001><002><001><002
   ><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004><005
   ><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009><010
   ><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004
   ><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009
   ><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003
   ><004><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008
   ><009><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002
   ><003><004><005><006><007><008><009><010><011><001><002><003><004><005><006><007
   ><008><009><010><011><001><002><003><004><005><006><007><008><009><010><011><001
   ><002><003><004><005><006><007><008><009><010><011><001><002><003><004><005><006
   ><007><008><009><010><011><001><002><003><004><005><006><007><008><009><010><011
   ><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004><005
   ><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009><010
   ><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004
   ><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009
   ><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003
   ><004><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008
   ><009><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002
   ><003><004><005><006><007><008><009><010><011><001><002><003><004><005><006><007
   ><008><009><010><011><001><002><003><004><005><006><007><008><009><010><011><001
   ><002><003><004><005><006><007><008><009><010><011><001><002><003><004><005><006
   ><007><008><009><010><011><001><002><003><004><005><006><007><008><009><010><011
   ><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004><005
   ><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009><010
   ><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003><004
   ><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008><009
   ><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002><003
   ><004><005><006><007><008><009><010><011><001><002><003><004><005><006><007><008
   ><009><010><011><001><002><003><004><005><006><007><008><009><010><011><001><002
   ><003><004><005><006><007><008><009><010><011><001><002><001><002><001><002><001
   ><002>
   Elapsed time=     0 sec     04/19/97      08:58.36
   F1      81 F2       0 F3       0 F4       0 F5       0 F6       0 List       46
   

                                                          
   DUMP=n causes n input records to be dumped to FILEDUMP. This is particularly
   useful when trying match/merge files. The dumped output lists the file number
   followed by a colon and then the data.
      
      
4/23/97

   Type 2 match (T=2) one-for-one/many now works.      
      
4/25/97
  
   added a TRanslate function

      TR field source-const target-const

   added find and both forms of the displacement moves   
   
   One more dubugging tool is the DMP option; it causes all the varliables
   to be dummped at the end of the program or when an error occured.
   e.g.

   BESTOP /T=1,A=1,B=3,LNSIZE=120,PGSIZE=9999,DUMP=100,DMP

   and here is a partial listing of the output


pcBESTOP ;-) 97.116.13:55  (C)1997 Hans J. Becker
Elapsed time=     2 sec     04/27/97      08:33.35
F1      91 F2       0 F3      84 F4       0 F5       0 F6       0 List      160
 . . . . . . . . . . . . . . . . . . .DUMP. . . . . . . . . . . . . . . . . . .
ICH='pcBESTOP ;-) 97.116.13:55  (C)1997 Hans J. Becker                    '
LOWER='abcdefghijklmnopqrstuvwxyz'              UPPER='ABCDEFGHIJKLMNOPQRSTUVWXY
Z'                      AKEY='ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'                 BKEY='ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'                 BUFFER='
total 968'              BLOCK='total 968            '                   CNT1=
         91             CNT2=             0     CNT3=            84     CNT4=
          0             CNT5=             0     CNT6=             0     CNTL=
        160             COL1=        0          COL2=        0          COND='0'
B                       DEBUG='0'B              DMP='1'B                DUMP=
   100                  EXTENT=        2        EOF='1'B                EOT='0'B
                        EOF1='1'B               EOF2='1'B               EOF3='1'
B                       EOF4='1'B               EOF5='1'B               EOF6='1'
B                       EOP='1'B                ERROR=       0          FALSE='0
'B                      FILE_CODE='L'           FIRST_PRINT='0'B        FIRST_RE
AD='0'B                 FIRST_TIME='0'B         FLD='L.112.116'         HEX00='


5/2/97

   In oder to stay with a one character op-code, 
   let A (alter) be an alias for the CHange command and
   let Z (zap?)  be an alias for the TRanslate command. 

----------------------------VERSION 1.1--------------------------------------
 
5/28/97

   new command: Parse (P)

   P field1 const field2 field3 ... fieldn
   where field1 gets parsed into field2 etc usg const, for example
   give a comma-delimited-file

"1981 Average        ", 8572 , 1609 , 4396 , 256 , 4141 , 83 , 5 , 336 ,
"1982 Average        ", 8649 , 1696 , 3488 , 165 , 3323 , 71 , 3 , 174 ,
"1983 Average        ", 8688 , 1714 , 3329 , 234 , 3096 , 114 , 2 , 234
"1984 Average        ", 8879 , 1722 , 3426 , 197 , 3229 , 185 , 2 , 195
"1985 Average        ", 8971 , 1825 , 3201 , 118 , 3083 , 145 , 1 , 117
"1986 Average        ", 8680 , 1867 , 4178 , 48 , 4130 , 139 , 0 , 50 ,
"1987 Average        ", 8349 , 1962 , 4674 , 73 , 4601 , 145 , 0 , 80 ,

   and this program

P 1.1.120 ',' S.1.20 S.21.25 S.26.30  S.31.35 S.36.40 S.41.45
M S.1.80 L.1.80; W L 1
C S.1.200 ' '

   produces the following

"1981 Average        8572 1609 4396 256  4141 
"1982 Average        8649 1696 3488 165  3323 
"1983 Average        8688 1714 3329 234  3096 
"1984 Average        8879 1722 3426 197  3229 
"1985 Average        8971 1825 3201 118  3083 
"1986 Average        8680 1867 4178 48   4130 
"1987 Average        8349 1962 4674 73   4601 



5/29/97

   new command: J - right justify, i.e. instead of Move use Justify
   to move a field if you want the result to be right justified. Use
   this in conjunction with the Parse command when dealing with numeric
   fields.


----------------------------VERSION 1.2--------------------------------------

6/5/97

   Implemented the If_Multiple command 

      I M field [E,U] const [ ,A,O]

   where the constant is of the form 'a,b,c,d'. Since the members in the
   set 'a,b,c,d' are alphanumeric, a range such as '4-7' is NOT allowed.
   This is different from the general documentation.
 

6/10/97

   Added NP (NoParse) switch to turn off parsing using the semicolon. Use
   this if there is ambiguity e.g. when a semicolon is used in constant.
   To turn parsing of, code the following
                                
        BESTOP /NP

6/11/97

   new command: DEL const field   (Q is an alias for DEL)

   whenever the "constant" occurs in the "field" causes the main processing
   routine to exit and GET the next record; the DEL acts much like a GET.


----------------------------VERSION 1.3--------------------------------------

6/13/97

   Added comprehensive debugging capability, i.e. there is a new command:

        !

   put "!" into the program and it causes a formatted dump of all variables
   and the file and scratch buffers (see below). 



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        1  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TODAY='06/13/97  '      NOW='08:47.59'          LOOPCOUNT=            48
T=0                     A=0                     B=0                     J=
N=       45             N1=     1001            N2=     1080            U=
AKEY=' '                BKEY=' '                BLOCK='''Table 56. Net Movements
                        CNT1=             2     CNT2=             1     CNT3=
CNT5=             0     CNT6=             0     CNTL=             0     COL1=
COND='0'B               DEBUG='0'B              DEL='0'B                DMP='0'B
EXTENT=       93        EOF='0'B                EOT='0'B                EOF1='0'
EOF3='1'B               EOF4='1'B               EOF5='1'B               EOF6='1'
ERROR=       0          FALSE='0'B              FILE_CODE='S'           FIRST_PR
FIRST_TIME='0'B         FLD=''' '''             IF_S='0'B               LASTCOMP
LC=             0       MASK=' '                MATCH='0'B              MORE='1'
NEVERMORE='0'B          I=1                     T=0                     A=0
OLDRESULT='1'B          ONCE='0'B               NP='0'B                 PC=' '
PARM='I=1'              RESULT='0'B             TARGET2='                    '
TOTAL=        3         TRACE='0'B              TRUE='1'B               VERBOSE=
HI=        5            MID=        5;
{S}    |123456789a123456789b123456789c123456789d123456789e123456789f123456789g12
        |_______________________________________________________________________
{S} 0001|00002
{S} 0101|Table 2.
{S} 0201|
{S} 0301|
{S} 0401|
{S} 0501|
{S} 0601|
{S} 0701|
{S} 0801|
{S} 0901|
{S} 1001|Mar 1997
{S} 1101|



   Suppose we want to track what is in the scratch buffer 1001.1080. Given
   that we captured the dump in a file called DUMP, then to view what is
   in scratch area, use the lollowing commands:

        FIND "{S} 1001" DUMP > SCR
        LIST SCR

   and would typically get the following:


---------- DUMP
{S} 1001|Mar 1997
{S} 1001|(Thousand Barrels)
{S} 1001|---------------------------------------------------------------------
{S} 1001|                                               Supply
{S} 1001|                          -------------------------------------------
{S} 1001|
{S} 1001|   Commodity                   Field       Refinery
{S} 1001|                            Production    Production      Imports
{S} 1001|---------------------------------------------------------------------
{S} 1001|Crude Oil                    E 200,563           --       237,604
{S} 1001|
{S} 1001|NGLs and LRGs                   59,126       20,065         5,044
{S} 1001|  Pentanes Plus                 10,220           --         1,130
{S} 1001|  LPGs                          48,906       20,065         3,914
{S} 1001|    Ethane/Ethylene             21,218          622           445
{S} 1001|    Propane/Propylene           16,840       16,164         2,612
{S} 1001|    N Butane/Butylene            4,714        3,127           333
{S} 1001|    Isobutane/Isobutylene        6,134          152           524
          


    New command: SELect which is the converse of DEL

        SEL const field

    When the program gets read in and a "SEL" command has been detected, 
    then REJECT is set to TRUE i.e. all records are rejected a priori. 
    Records are "accepted" if the selection criteria are met. You can have 
    multiple SEL statements. SEL is part of the WRITE routine, i.e. it is 
    during the output process that records get selected or skipped. The data
    for the current records is processed by the program but is not written
    to the output file unless the SEL condtion is true.
    

6/18/97

   new command: ECHO const|field

   The ECHO cause the "const" or "field" to be displayed on SYSPRINT


6/26/97

  Converted IF DEBUG comments to preprocessor statements, i.e. DEBUG
  statements have a "%" in col 1. Use the MAKE.BAT to compile the
  program. MAKE.BAT calls BESTOP programs that include/excluse these
  statements prior to compilation.

8/9/97

  mod Parse routine such that we don't look for the PARSING CHARACTER
  PC inside a double-quoted string

8/11/97

  clean up parsing quoted strings, i.e. if there are none;
  in forming akey/bkey if key length exceeds buffer length, use the
  latter

10/28/97 1.3.07

  added debugging code in the ADD routine & minor changes

11/4/97  1.3.08

  expand parsing charater to a multiple character field

11/13/97 1.3.09

  enhanced CHange command

  option 1: CHange 'TARGET' [COL1][/COL2] 'REPLACEMENT'  (original)
  option 2: CH     <  'REPLACEMENT'             (beginning of line)
  option 2: CH     >  'REPLACEMENT'                   (end of line)


11/17/97 1.3.10

  mod parse command as follows

  P field1 [field|const] field2 field3 ... fieldn

  const is used verbatim, but blanks will be trimmed from field

11/20/97 1.3.11

  fix > vs '>' and < vs '<'

12/7/97

  put debugging code back into the LOGIC routine
  tighten up how the HOLD area gets refreshed

1/11/98  1.13

  add debugging code to flush out "INVALD INPUT FILE"

2/7/98 V1.14  98.038.11:38

  CH ['TARGET'|<|>] [COL1][/COL2] ['REPLACEMENT'|field]


3/30/98 V1.17  98.089.11:13

  allow for file specifications on the command line as
  positional paramters:

     BESTOP /'program;listing;file1;file2...;file6;filedump;PARM'

  example:

     BESTOP /'/MOV.BST;/LST.LST;/TEST.BAT;;;;;;;I=1'

3/31/98 V1.18

  enter a small program thru the console

     D:\IBMPLIW\TEST|BESTOP /'*;/LST.LST;/TEST.BAT;/out.TXT;;;;;;I=1'
     
     pcBESTOP V1.18á 98.090.15:49 (C)1998 Hans J. Becker ;-)
     M 1.1.80 2.1.80;W 2
     ./
     
     Elapsed time=     8 sec     03/31/98      15:54.09
     F1       6 F2       6 F3       0 F4       0 F5       0 F6       0 List        0
     
     D:\IBMPLIW\TEST|

4/1/98  V1.19

  change the order of the parm and file-specs where the 1st "/" seperates
  the PARM and the FILE-SPEC
  e.g.

      BESTOP /'I=1/*;/LST.LST;/TEST.BAT;/out.TXT'
  or
      BESTOP /'I=1,DEBUG/MOV.BST;/LST.LST;/TEST.BAT'


4/6/98  v1.20

  accommodate FILEA and FILEB using the new command line format

4/24/98 V1.21  98114.0935

  trim any blanks from the end of the command line

4/28/98 V1.22  98118.1937

  find out why the program can blow up in BUILD_AKEY
  put '''' into "clear"

5/2/98  V1.23  98122.0819

  let I=1 be the default

  IF LENGTH(PARM) = 0, then print file counts etc in SYSPRINT

5/8/98  V1.24  98128.0841

  change from DATE to DATETIME function, mod date area
  i.e. DATE=YYDDMM bacame DATETIME=YYYYMMDDHHMISS in D.25.38


5/12/98 V1.25  98132.2013

  TAG const field

  TAG any record in which the "const" is a substr within "field",
  this command is akin to the SEL command except that all records
  are passed thru and TAG is either True of False, also, an asteric
  will be placed into D.99 when TAG is True.


5/14/98 V1.26  98134.1931

  fix the "I F *" problem

  UNTAG const field - reverse of TAG and mark D.98 with an asterik


----------  VERSION 2.00  ----------------------------------------


5/16/98  V2.00  98136.1044

  UNTAG only makes sense if a line has been TAGgged


