TAA Tools
CHK400CMD      CHECK CL FOR USE BY i5/OS COMMANDS         TAACMDC

The CHK400CMD  command checks a  source member to  see if the  commands
used contain only i5/OS supplied commands.

For  example,  to  check  the  member  PAYROLLC in  QCLSRC,  you  would
specify:

      CHK400CMD    MBR(PAYROLLC)

The CHK400CMD could be used for the following functions:

  **   If  you  ship code  to  other systems  using  i5/OS and  want to
       ensure  that  the  code  only  contains  commands  that  can  be
       executed on the other systems.

  **   If you  want to  find the user  written commands within  your CL
       source.

  **   If  you want  to enforce  a standard  relative to  what commands
       can appear in CL programs.

  **   If you want  to check for CALL  commands in a  CL program.   See
       the special command parameter.

Any commands  not found  will cause  a listing to  occur.   The listing
will  contain the  source statement  where a command  was not  found as
well as summary counts  of the records and  commands found.  An  option
exists  to  always print  a  summary  listing.   An  option  exists  to
prevent any listing.

The  command  also  supports an  option  to  include  include CALL  and
TFRCTL commands.

If  any errors  are found, TAA9897  is sent as  an escape  message.  An
option provides  for 'checking only'  in which  case you could  monitor
for TAA9897  to determine  if any user  commands (and/or  CALL commands
exist).  No printing occurs for this option.

The  tool as  shipped  contains all  of the  i5/OS  commands and  a few
Program Product commands.  If you  want to include all of the  commands
found  in  your  version  of  QSYS,  use  CRTTAATOOL  to  recreate  the
CHK400CMD tool on your system.

In  addition,  you  can  also tailor  the  list  of  valid commands  by
entering the  specific commands  to be  added or  deleted by  modifying
certain source members:

  **   A source  member  exists where  you can  add  commands that  you
       want  to  be  considered valid.    The  member  is CHK400ADD  in
       TAATOOLSRC  in  the  TAATOOL  library.    The  commands  can  be
       entered using  SEU.    The first  10  positions of  each  record
       should be  used.  For example,  if you wanted to  add the EDTVAR
       and  MOVCHRDEC commands  to the list  of valid  values you would
       enter into CHK400ADD:

          Pos 1
              EDTVAR
              MOVCHRDEC

  **   A member  exists  where  you  can specify  that  existing  o5/OS
       commands  be considered  invalid.   The member  is CHK400RMV  in
       TAATOOLSRC in  the TAATOOL library.  For  example, if you wanted
       to flag any use of the  PWRDWNSYS and CRTTBL commands you  would
       enter into CHK400RMV:

          Pos 1
              PWRDWNSYS
              CRTTBL

Any time you  want to add or subtract  commands from the list  of valid
commands, the  CHK400CMD must be re-created using  CRTTAATOOL.  Part of
the  re-create  process  is  to  access all  of  the  commands  in QSYS
plus/minus those described in the specific source files.

The S/38  commands in QSYS38  are not  included (if  they exist in  the
member being checked, they will be flagged).

The i5/OS commands  are placed in an array within an  RPG program.  The
program  uses  a binary  search  technique  to quickly  determine  if a
command is valid.   This program  should not be  modified.  You  should
use the CRTTAATOOL command to re-create the CHK400CMD tool.

CHK400CMD is  not a 100%  match with CL syntax.   The vast  majority of
cases   are  processed  correctly.     See  the   later  discussion  of
exceptions.  The program  assumes that valid CL  syntax is being  used.

Special  handling  occurs  for  the  commands  IF,  ELSE,  MONMSG,  and
SBMJOB.   These  commands may have  an embedded  command which  is also
checked.

A standard source file (80 bytes of text) must be used.

If  any  exceptions  exist, the  command  will complete  and  then send
TAA9897 as an escape message.

The listing describes:

  **   Number of statements  read which  is a count  of the records  in
       the member.

  **   Number  of exceptions found.   For  each exception  there should
       be one source statement printed.

  **   Number  of  total commands.    This  is the  number  of commands
       sensed.  Not  every statement may contain  a command because  of
       continuation lines  or a statement may  be only a comment.   The
       commands  like IF,  ELSE and  MONMSG  normally have  an embedded
       command which will also be counted.

  **   Number of  'primary  commands'.   This  counts one  per  command
       found, but does not count the embedded commands.

  **   Number  of IF/ELSE/MONMSG/SBMJOB  commands.    The sum  of  this
       number plus  'primary commands' may not  equal 'Total commands'.
       For   example,  a  MONMSG  command  may  not  have  an  embedded
       command.

Exceptions
----------

  **   Any IF  or ELSE commands  that do not  have an embedded  command
       will be flagged.  This may not be an exception in your code.

  **   Most cases  where a  command name is  split over  two statements
       will be flagged.  For example, the following will be flagged:

              CRTCLP+
                  GM

  **   The  IF  command  is  properly  handled  in  most  cases.    One
       exception is  when  an  expression  contains a  test  against  a
       literal which  contains a parenthesis  as well as  other values.
       For example, the following would be flagged:

            IF  (&A *EQ '((' ) CHGVAR &B &Z
            IF  (&A *EQ 'CMD(' ) CHGVAR &B &Z

       The following would not be flagged

            IF  (&A *EQ '(' ) CHGVAR &B &Z
            IF  (&A *EQ ')' ) CHGVAR &B &Z

  **   The  MONMSG command  has an  optional parameter  CMPDTA followed
       by the  optional EXEC  parameter  which names  a command  to  be
       executed.  The  checking will only  occur when the  keyword EXEC
       is  specified.   Thus  if  you  have a  MONMSG  as follows,  the
       CHGVAR embedded command will not be checked:

           MONMSG    CPF0000  XXXXXX  (CHGVAR &X &Y)
           MONMSG    CPF0000  XXXXXX  CHGVAR &X &Y

       The following CHGVARs will be checked:

           MONMSG    CPF0000  EXEC(CHGVAR &X &Y)
           MONMSG    MSGID(CPF0000)  EXEC(CHGVAR &X &Y)
           MONMSG    MSGID(CPF0000)  CMPDTA(XXX) EXEC(CHGVAR &X &Y)
           MONMSG    CPF0000 XXX EXEC(CHGVAR &X &Y)

  **   The   SBMJOB  command  is  checked  for   the  use  of  the  CMD
       parameter.  If it is not found, an error is noted.

Exception conditions noted in the listing
-----------------------------------------

There  are  several  exception  conditions  that  may  appear  and  are
described in the left most column of the listing.

  **   'Not found'.  This means the command is not in the array.

  **   'GT 10 char'.   The command name given  exceeds 10 characters in
       length.    This  exception condition  is  not  acceptable  in CL
       syntax.

  **   'IF/ELSE err'.    This  is  produced if  the  CHK400CMD  program
       cannot find an embedded  command on an IF or  ELSE command.  For
       example,  this would be the  case if the  IF statement contained
       a test for a parenthesis as previously described.

  **   'CALL found'.   This  is produced  if the  CHK400CMD program  is
       requested to look for a CALL command.

  **   'TFRCTL found'.   This is produced  if the CHK400CMD  program is
       requested to look for a TFRCTL command.

  **   'No CMD  PARM'.  This is produced if  the CHK400CMD program does
       not find the CMD parameter on SBMJOB.

Command parameters                                    *CMD
------------------

   MBR           The  member to be  processed.  The  special value *ALL
                 may be  entered in which  case all  members in a  file
                 will be  checked.  If the file  contains many members,
                 this command should be submitted to batch.

   SRCFILE       The  qualified  CL  source file  name  to  be checked.
                 The file name  defaults to QCLSRC.   The library  name
                 defaults to *LIBL.

   PRINT         Print options.   *EXCPT is  the default to  print only
                 those   members  with   exceptions.     Every  listing
                 includes  the  total  number  of  statements  and  the
                 number of commands found.   If this is needed  for all
                 members,  specify *ALL.   If  *EXCPT is  specified and
                 no  exceptions  are  found,  a  completion  message is
                 sent (no listing is produced).

                 The special option  *NONE is  provided which can  only
                 be  specified  if  a  single  member  is  named.    It
                 provides  no  printed output  (the  intent  being that
                 you would  monitor for  TAA9897 to  determine  whether
                 exceptions exist).

   CALLCMDS      Call commands.   The  default is  *NO meaning  no CALL
                 or TFRCTL  commands will be considered.   *ONLY can be
                 specified  to  check  for  CALL  and  TFRCTL  commands
                 only.  *YES  may be specified  to include a  check for
                 both  CALL/TFRCTL commands  and commands  that  do not
                 pass the checking.

   TAACMDS       Whether  to  include  TAA commands.    The  default is
                 *YES.

                 *NO may be  specified to bypass  TAA commands.  If  no
                 library  qualifier is  used, the  definition of  a TAA
                 command  is one  that exists  in the  TAATOOL library.
                 If a  TAATOOL  library  qualifier  is  specified,  the
                 command is still checked to see if it exists.

   PRTERRORS     Whether to  print error  conditions.   The default  is
                 *YES.   Error  conditions such  as the  command cannot
                 be found or  invalid command syntax  would be  listed.
                 If OUTPUT  is not *OUTFILE,  the error  conditions are
                 noted in  the normal listing.   If OUTPUT(*OUTFILE) is
                 used,  a separate spooled file  occurs for each member
                 with an error condition.

                 *NO may be specified  to bypass the printing of  error
                 conditions.   If  OUTPUT(*OUTFILE)  is specified,  the
                 outfile  will   contain  an  indication  of  an  error
                 conditions (such as NOTFOUND or INVALID).

   OUTPUT        The type  of output.    * is  the default  and  causes
                 spooled output.   *OUTFILE may be specified  to create
                 an outfile of the exceptions.

   OUTFILELIB    The  library for  the CMDFILP  file.   The  default is
                 *LIBL.   A  specific  library must  be  named  if  the
                 CMDFILP file does  not already exist.  The  model file
                 in TAATOOL  is TAACMDCP with a format  name of CMDRCD.

                 If  OUTPUT(*)  is  used,  a library  name  may  not be
                 used.

   REPLACE       Whether the data in  the CMDFILP file will  be cleared
                 before  new data  is written.   The  default  is *YES.
                 *NO  may  be  specified  to  add  new  records  to  an
                 existing file.

Restrictions
------------

  **   See the previous exceptions.

  **   The source file must be 80 bytes of data.

  **   By  default  only  the  commands  in  QSYS  are  used  to  check
       against.

  **   The CMTAA  field for TAA  commands is set  to *YES or  *NO based
       on  whether  the command  exists in  TAATOOL.   This  is  not an
       indication that the command  will be run  from TAATOOL unless  a
       library qualifier exists.

Prerequisites
-------------

The following TAA Tools must be on your system:

          EDTVAR         Edit variable
          RTVSYSVAL3     Retrieve system value 3
          SNDCOMPMSG     Send completion message
          SNDESCMSG      Send escape message
          SNDSTSMSG      Send status message

Implementation
--------------

The tool  is ready  to use  for the  i5/OS commands and  a few  Program
Product  commands.  You  may further tailor  the list of  commands that
are considered valid.  See the previous discussion.

Objects used by the tool
------------------------

   Object        Type       Attribute      Src member     Src file
   ------        -----      ---------      ----------     -----------

   CHK400CMD     *CMD                      TAACMDC        QATTCMD
   TAACMDCC      *PGM          CLP         TAACMDCC       QATTCL
*  TAACMDCC2     *PGM          CLP         TAACMDCC2      QATTCL
   TAACMDCR      *PGM          RPG         TAACMDCR       QATTRPG
*  TAACMDCR2     *PGM          RPG         TAACMDCR2      QATTRPG
       No object                           TAACMDCR3      QATTRPG
   TAACMDCR4     *PGM          RPG               No source
   TAACMDCP      *FILE         PF          TAACMDCP       QATTDDS

* The programs are implicitly deleted after TAACMDCR4 is created
					

Added to TAA Productivity tools April 1, 1995


Home Page Up to Top