1 DCL_CHECK
      The DCL_CHECK procedure detects a variety of DCL coding errors and
      displays  diagnostic  messages  that  allow  you  to  correct  the
      problems. See "Diagnostics" for a list of the types of errors that
      DCL_CHECK can detect. See "Problems" for information on the limits
      of DCL_CHECK.

      When  you  execute  DCL_CHECK  with "HELP" as the first parameter,
      DCL_CHECK invokes the DCL Help utility.  If you provide additional
      parameters, they are passed to the Help utility.

      To exit the Help utility, press Return one or more times until the
      prompt "enter name of file:"  is displayed.


  Additional information available:

  DCLDIET        DCL_CHECK      DCL_DIET       Diagnostics
  Examples       Format         Installation   Line_counts
  Modifications  Output         Problems       Version
1 Version
      This is version V3.3 of the DCL_CHECK help file.
1 Format
      DCL_CHECK  is  a  DCL  command  procedure.   It is executed by the
      following DCL command:

          $ @[<disk>:][<directory>]DCL_CHECK.COM [<input> [<list>]]
          $ @[<disk>:][<directory>]DCL_CHECK.COM HELP [<topic>...]

      <disk>  and/or  <directory>  may  be omitted; the current defaults
      will be used.

      The   file   DCL_CHECK.HLB  must  be  in  the  same  directory  as
      DCL_CHECK.COM if you use the HELP function in DCL_CHECK. The files
      may be in any directory to which you have read access.

      If  you  use DCL_CHECK frequently, you may wish to assign a symbol
      in your LOGIN.COM file to execute DCL_CHECK.  For example, if  the
      DCL_CHECK.COM  and  .HLB files are in you login default directory,
      you might put the following in your LOGIN.COM:

          $ DCL_CHECK :== "@SYS$LOGIN:DCL_CHECK"

      Alternatively,  if  you  put  DCL_CHECK.COM  and  DCL_CHECK.HLB in
      SYS$SYSTEM, you might put the following in your SYS$SYLOGIN (which
      is normally SYS$MANAGER:SYLOGIN.COM):

          $ DCL_CHECK :== "@SYS$SYSTEM:DCL_CHECK"
2 Parameters
      Parameters  may  be  entered  on the command line; if there are no
      parameters on the command line, the  procedure  will  display  the
      prompt for parameters.

      The first parameter is either the file-name of a command procedure
      file to be checked, or one of the keywords "HELP" or "EXIT".

      If  a  file  name is entered, it will be checked.  If a device and
      directory are not supplied, the current default is used. If a file
      extension is not supplied, ".COM" is used.

      If  a  file  name is entered, the second parameter may provide the
      name of a listing file to contain the list of errors detected.  If
      a  device  and  directory are not supplied, the current default is
      used.  If a file extension is not supplied, ".LIS"  is  used.   If
      second parameter is not supplied, errors are listed on sys$output.

      If  the  first  parameter contains "HELP", the DCL Help utility is
      used to provide information  about  the  DCL_CHECK  utility.   Any
      additional parameters are passed to the HELP utility.

      If  the first parameter contains "EXIT", any additional parameters
      are ignored and the procedure exits.
1 Output
      If the second parameter (see HELP FORMAT PARAMETERS) is blank, all
      output of DCL_CHECK is displayed on the terminal.  If  the  second
      parameter  is a listing file name, some output is displayed on the
      terminal and diagnostic information  is  written  to  the  listing
      file.
2 Terminal_output
      Terminal output depends on whether or not there is a listing file.
3 Listing_file
      If there is a listing file, output similar to the following is
      displayed:


      -*- Charlie Hammond's unsupported DCL checker (Version 1.0) -*-
      Checking file <file-name>;

      Checking for DCL_CHECK$ logicals...
      No translation for logical name DCL_CHECK$*
      <or>
      "DCL_CHECK$SUPPRESS_WCT" = "TRUE"
      ...

      Starting Pass 1 -- <date-time>...
      ...processing line number xxx...
        ...
      Starting Pass 2 -- <date-time>...
      ...processing line number xxx...
        ...
      Starting Pass 3 -- <date-time>...

      Creating errors listing in <listing-file>;
      <date-time>


      For  Pass  1,  the  numbers  in  the  "processing line number xxx"
      displays will be in increments of 500.

      For  Pass  2,  the  numbers  in  the  "processing line number xxx"
      displays will be in increments of 1000.

      If no errors are found, the last two lines will be replaced to
      indicate this:

      No errors found
      ...listing file not created    <date-time>
3 No_listing_file
      If there is no listing file, output similar to the following is
      displayed:


      -*- Charlie Hammond's unsupported DCL checker (Version 1.0) -*-
      Checking file <file-name>;

      Checking for DCL_CHECK$ logicals...
      No translation for logical name DCL_CHECK$*
      <or>
      "DCL_CHECK$SUPPRESS_WCT" = "TRUE"
      ...

      Starting Pass 1 -- <date-time>...
      ...processing line number xxx...
        ...
      Starting Pass 2 -- <date-time>...
      ...processing line number xxx...
        ...
      Starting Pass 3 -- <date-time>...

      Procedure contains:   nnnn total lines
                            nnnn code lines (including nn lines w/ comments)
                             nnn continuation lines
                              nn lines w/i $DECK/$EOD pairs
                             nnn comment only lines
                             nnn blank lines

       LINE  CODE  --DIAGNOSTIC MESSAGE--
          .
          .
          .
      -*- END OF LISTING -*-   13-OCT-1997 10:57:28.07


      For  Pass  1,  the  numbers  in  the  "processing line number xxx"
      displays will be in increments of 500.  Occasionally they will not
      be exact multiples of 500.

      For  Pass  2,  the  numbers  in  the  "processing line number xxx"
      displays will be in approximate increments of 1000. Because pass 2
      is processing an abbreviated file (comment lines removed) the line
      numbers will seldom be exact multiples of 1000.

      The  LINE  reported with the DIAGNOSTIC MESSAGE for diagnostics in
      lines that are continued will be the line number of the  original,
      continued line.
2 File_output
      If a listing file is being used, it contains information similar
      to the following.

      -*- Charlie Hammond's unsupported DCL checker (Version R1.0 -*-)
      Checking file WORK8:[HAMMOND]DCL_CHECK.COM_SOURCE;
      <date_time>

      Procedure contains:   nnnn total lines
                            nnnn code lines (including nn lines w/ comments)
                             nnn continuation lines
                              nn lines w/i $DECK/$EOD pairs
                             nnn comment only lines
                             nnn blank lines

       LINE  CODE  --DIAGNOSTIC MESSAGE--
          .
          .
          .
      -*- END OF LISTING -*-

      The  LINE reported with the DIAGNOSTIC MESSAGE for diagnostics in
      lines that are continued will be the line number of the original,
      continued line.
1 Line_counts
      DCL_CHECK displays (or lists to a file) the following line counts.

      Procedure contains:   nnnn total lines
                            nnnn code lines (including nn lines w/ comments)
                             nnn additional continuation lines
                              nn lines w/i $DECK/$EOD pairs
                             nnn comment only lines
                             nnn blank lines
                              nn diagnostics

      There is an explanation for each of these.
2 total_lines
      Total lines is a count of every physical line in the file being
      checked.  It is the same as the number of records in the file.
2 code_lines
      Code  lines  is  a  count  of  lines of code.  It does not include
      continuation lines, lines within a $DECK/$EOD pair, comment  lines
      or blank lines.

      Immediately  following  the  count of code lines is a count of the
      number of code lines that also include comments. Note that this is
      included in the count of code lines.
2 continuation_lines
      Continuation  lines is a count of the number of lines of code that
      are continued from a code line.  A continued code line ends with a
      hyphen  (-)  that is not a comment (i.e., not preceded by an "!");
      lines   following   continued   line   are   continuation   lines.
      Continuation  lines  may  be  continued.   i.e. a code line may be
      continued on two or more continuation lines.
2 deck_lines
      Deck  lines is a count of lines that are within a $DECK/$EOD pair.
      These lines are input to  programs  or  utilities.   They  may  be
      commands or text used by the program or utility.
2 comment_lines
      Comment lines are lines that are not within $DECK/$EOD pairs which
      contain only comments.  i.e. the  first  non-blank  following  the
      dollar  sign  ($)  is an exclamation point (!).  Comments may also
      appear on code lines following DCL commands;  these  comments  are
      not counted.
2 blank_lines
      Blank lines are lines which are totally blank (which also generate
      diagnostic messages) or which contain only a blank comment. (Blank
      comments   are  often  used  to  insert  white  space  to  improve
      readability.)
2 diagnostics
      This is the number of diagnostic message output.
1 Problems
      DCL_CHECK does not and cannot catch all DCL problems.

          Not all syntax errors are detected.
          Misspelled commands and variable names are not detected.
          Logic errors cannot be detected.
          Errors that result from execution time symbol substitution
              cannot be detected.
          See help on diagnostics LND additional_information
              for information on problems detecting lines that
              do not start with "$".

      In  addition, the detection of one problem may obscure one or more
      other  problems  --  or  may  cause  problems  to  be  erroneously
      detected.   For  this  reason,  you should always re-run DCL_CHECK
      after correcting errors.
2 Called_procs
      If  you  use DCL_CHECK to check a command procedure that is called
      by another procedure, various diagnostics may be miss-reported. In
      particular,   diagnostics  related  to  file  operations  can  be
      miss-reported if the OPEN, READ, WRITE and CLOSE commands  are  in
      different files.
2 File_Diagnostics
      DCL_CHECK's  file  diagnostics, NLN, ONC, INR, ANR, ONW, RNR, WNW,
      UNU and CNO, operate by matching OPEN, READ, WRITE and  CLOSE  DCL
      statements based on the logical name that these statements use. If
      symbol  substitution  is  used  for  these  logical  names,  these
      diagnostics may incorrectly generate warnings.

      Because  DCL_CHECK  does  not  know  the  order in which a command
      procedure will actually execute, no attempt is made to ensure that
      OPEN statements precede and CLOSE statements follow READ and WRITE
      statements.  For the same reason, no attempt is made to  sort  out
      the  possible  errors  that  may  occur  if  a  procedure contains
      multiple OPEN and/or CLOSE statements for the same file.

      One  of  the  main  purposes  of  these  diagnostics  is  to catch
      different [miss]spellings of the logical name used for the file.
2 Single_quote
      DCL_CHECK  is  imperfect  in  its checking for use of single-quote
      characters.  For this reason it lists such errors as "probable" or
      "possible".

      Some  syntactically invalid lines may be missed.  Lines containing
      an even number of errors may "cancel out".

      If  one single-quote is used to start symbol substitution within a
      quoted string (instead of two single-quotes) DCL_CHECK will report
      this  as an error, and will also flag the single-quote used to end
      the symbol substitution.  Although this may  seem  like  a  single
      error, DCL_CHECK sees it as two possible single-quote errors.

      Some  valid  uses of a single single-quote (') will be reported as
      errors.


3 Contractions
      DCL_CHECK  removes  the following contractions before checking for
      single-quotes.  Note that this is case sensitive  --  upper  case,
      lower  case and capitalized (i.e. only first letter in upper case)
      will  be  removed.   Any  other  mixed  case  versions  of   these
      contractions will not be removed.

      (Exception:  The personal pronoun "I" is always upper case.)

          aren't          he'd            shouldn't      we've
          can't           he'll           they'd         weren't
          couldn't        I'd             they'll        won't
          didn't          I'll            they're        wouldn't
          doesn't         I'm             they've        you'd
          don't           I've            wasn't         you'll
          hadn't          isn't           we'd           you're
          hasn't          she'd           we'll          you've
          haven't         she'll          we're
3 Possessives
      Within  a  quoted  string,  DCL_CHECK  considers  the string "'s "
      (upper or  lower  case  --  note  the  trailing  space)  as  valid
      possessives and does not report them.
2 Angle_brackets
      DCL_CHECH  will  detect  angle  brackets  ("<"  and  ">")  used to
      delineate directories as invalid comparison  operators.   You  can
      either  ignore  this  error or change the angle brackets to square
      brackets ("[" and "]").
2 Lexicals
      DCL_CHECK  assumes  that  every  instance  of  "F$"  that  is  not
      immediately preceded by a letter or a digit introduces  a  lexical
      function.   If  "F$"  is used as part of a symbol or logical name,
      this  may  be  reported  as  a  possible  truncated  or   possible
      misspelled lexical.
2 Parentheses
      DCL_CHECK  may  detect unpaired parentheses within quoted strings.
      These may or may not be errors.
1 Examples
  EXAMPLE 1:  This example checks the file MY_COMMAND.COM in the current
              default directory and displays any errors found on the terminal.

      $ @DCL_CHECK MY_COMMAND


  EXAMPLE 2:  This example checks the file MY_COMMAND.TEST in a directory
              "TEST" located under the users login directory, and creates a
              file TEST.LIS in the current directory if any errors are found.

      $ @DCL_CHECK SYS$LOGIN:[TEST]MY_COMMAND.TEST TEST


  EXAMPLE 3:  This example check the file MY_COMMAND.COM in the current
              default directory and creates a file ERROR.REPORT in the users
              login directory if any errors are found.

      $ @DCL_CHECK MY_COMMAND ERROR.REPORT


  EXAMPLE 4:  This example requests general help

      $ @DCL_CHECK HELP


  EXAMPLE 5:  This example requests help on know problems

      $ @DCL_CHECK HELP PROBLEMS


  The following shows how the above examples could be entered by typing
  only @DCL_CHECK at the DCL prompt and then answering the procedures prompt.
  Note that line-wrap will occur differently than shown.

  Example 1:
  enter name of procedure file to be checked (or HELP or EXIT): MY_COMMAND

  Example 2:
  enter name of procedure file to be checked (or HELP or EXIT):
                                      SYS$LOGIN:[TEST]MY_COMMAND.TEST TEST
  Example 3:
  enter name of procedure file to be checked (or HELP or EXIT):
                                      MY_COMMAND ERROR.REPORT
  Example 4:
  enter name of procedure file to be checked (or HELP or EXIT): HELP

  Example 5:
  enter name of procedure file to be checked (or HELP or EXIT): HELP PROBLEMS

1 Diagnostics
      Diagnostic  messages  are  identified  by  a three character code.

      The  LINE reported with the DIAGNOSTIC MESSAGE for diagnostics in
      lines that are continued will be the line number of the original,
      continued line.

      Descriptions and explanations are available for all errors.  Enter
      one of the following codes for more details:

        CODE-       Diagnostic Message
         Severity

             Errors related to file operations
        NLN-S  An OPEN, READ, WRITE or CLOSE statement has no logical name
        ONC-E  A file that is opened has no close statement
        INR-E  A file that is opened for read is not read
        ANR-E  A file that is opened for append is not written
        ONW-E  A file that is opened for write is not written
        RNR-S  A file that is not opened for read is being read
        WNW-S  A file that is not opened for write or append is being written
        UNU-S  A file that is not opened for read and write is being updated
        CNO-S  A file that is closed has no open statement
        OCE-I  OPEN or CLOSE statement with /END qualifier

             Errors related to if-then-else-endif
        INT-S  IF statement not terminated
        EFB-S  "=" found between IF and THEN
        ICO-S  invalid comparison or logical operator
        TML-S  too many levels of IF statements
        TRH-S  THEN statement required here
        TNA-S  THEN statement not allowed here
        ENA-S  ELSE statement not allowed here
        DNA-S  ENDIF statement not allowed here
        WCT-E  wrong constant type for comparison
        MEC-S  missing expression for comparison

             Errors related to subroutines
        SNT-S  SUBROUTINE statement not terminated
        TMS-S  too many levels of IF and SUBROUTINE statements
        RNA-S  ENDSUBROUTINE statement not allowed here
        LNS-S  referenced label "<label>" is not in this subroutine

             Errors related to labels
        DL--E  duplicate label "<label>"
        RLI-S  referenced label "<label>" is in if-group at lines <range>
        RLS-W  referenced label "<label>" is in subroutine at lines <range>
        LNF-S  label "<label>" not found
        TLS-I  target label "<label>" provided by symbol substitution
        LDS-I  label "<label>" defined by symbol substitution
        LNR-I  label "<label>" not referenced

             Errors related to parentheses and quotes
        UMP-S  unmatched parentheses (not in quoted string)
        USP-W  unmatched parentheses in quoted string
        UMB-S  unmatched brackets (not in quoted string)
        USB-W  unmatched brackets in quoted string
        UPQ-S  unpaired quotation marks (")
        PSQ-W  possible error using single-quote (') in quoted string
        PRQ-E  probable error using single-quote (')

             Errors related to lexical functions
        PTL-E  possible truncated lexical (<lexical>)
        PML-E  possible misspelled lexical (<lexical>)

             Errors related to unreachable lines
        CRE-W  code cannot be reached due to EXIT at line <line>
        CRG-W  code cannot be reached due to GOTO at line <line>

             Errors related to continuation lines
        CLD-S  continuation line starts with "$"
        NCL-S  no continuation line at EOF
        CCN-I  continuation character ("-") not preceded by space
        CLS-I  comment line separates continuation line

             Errors related to $DECK and $EOD
        NED-S  no $EOD for $DECK at <line>
        DFB-I  $DECK found between $DECK and $EOD
        EFN-W  $EOD found with no corresponding $DECK

             Miscellaneous errors
        LC--S  line contains END_IF, END IF, GO_TO, GO TO, GO_SUB or GO SUB
        BL--I  blank line
        LOD-I  line contains only "$"
        LFF-I  line contains only form-feed (<FF>)
        LND-E  line does not start with "$"
        ICF-W  invalid character found (#, %, ^ or &)
2 Severity
      DCL_CHECK diagnostics are categorized by severity codes similar to
      those used throughout OpenVMS -- S, E, W and I.  Within  DCL_CHECK
      these  should  be  interpreted  as follows.  Note that some errors
      could  be  assigned  different   severity   codes   in   different
      situations.  DCL_CHECK assigns the most severe code.

      S -- Severe Error --

        o This will almost certainly cause a run-time error, or
        o This almost certainly indicates a logic error.

        It is strongly recommended that Severe Error should be corrected.

      E -- Error --

        o This violates a clearly stated DCL coding rule, or
        o It is likely but not certain that this represents
          a coding or logic error.

      W -- Warning  --

        It  is possible but not certain that this represents a coding or
        logic error.

      I -- Information -- Indicates one of more of the following:

        o This is a matter of "coding style"; you may or may not want
          to change this, or
        o This is information that you may wish to be aware of, or
        o This may cause DCL_CHECK to miss-diagnose other conditions.
2 Suppress_diag
      You  can  suppress DCL_CHECK's reporting of diagnostic messages by
      defining logical names.  For each diagnostic message you  wish  to
      suppress, define the logical name DCL_CHECK$SUPPRESS_xxx to "TRUE"
      (or to "1").  "xxx" is the two or three  character  code  for  the
      diagnostic message.  (Do not include the SEVERITY code.)

      If  the  translation  of DCL_CHECK$SUPPRESS_xxx evaluates as true,
      then the diagnostic message identified by the "xxx" code will  not
      be   generated.    If  the  translation  of DCL_CHECK$SUPPRESS_xxx
      evaluates as false, or if DCL_CHECK$SUPPRESS_xxx is  not  defined,
      then the message will be generated if the error is found.
2 Insert_Comments
      If  a line in the procedure file being checked by DCL_CHECK starts
      with:

          $! DCL_CHECK COMMENTS:

      The  remainder  of  the line will be inserted into the diagnostics
      listing.  No formatting is done; the line appears exactly as it is
      in the command procedure; "$!  DCL_CHECK COMMENTS:" is removed and
      the line number is added.

      Note  that  this  line must contain these exact characters, except
      that spaces may be omitted or additional spaces may be added.

      This  feature  can  be  added to add a note when DCL_CHECK creates
      diagnostics that  you  want/need  to  ignore,  of  for  any  other
      purpose.
2 ANR
      A file that is opened for append is not written

          An  OPEN  statement  specifies  /APPEND  but there is no WRITE
          statement (without /UPDATE) for this file.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.

2 BL
      blank line (warning)

          This line is blank.  This may indicate a coding error.

          If you want blank lines to add white space for readability,
          consider using blank comment lines ("$!").

          (Blank lines within $DECK/$EOD pairs are allowed.)

          Note that neither DCL_DIET nor DCLDIET remove blank lines.
          Lines with only "$" or "$!" are removed.
2 CCN
      continuation character ("-") not preceded by space (warning)

          DCL  logically appends a continuation line to the line that is
          continued.  If there is no space  preceding  the  continuation
          character ("-"), and there is no space at the beginning of the
          continuation line, this can result in keywords, qualifiers  or
          parameters being incorrectly concatenated.

          Examples:

           1. DCL will interpret the following lines

                  $ SHOW-
                  LOGICAL

              as  SHOWLOGICAL,  which  will  be  taken  as an acceptable
              misspelling of SHOW -- "LOGICAL" will be ignored  and  DCL
              will prompt for what to show.

           2. DCL will interpret the following lines

                  $ open/write-
                  testfile test.file

              as OPEN/WRITETESTFILE TEST.FILE.

          The  qualifier "/WRITETESTFILE" will be taken as an acceptable
          misspelling of  /WRITE;  "TEST.FILE"  will  be  taken  as  the
          logical  name for the file, rather than as the file name.  DCL
          will either prompt for the file name (if interactive) or  fail
          (if not interactive).

          DCLDIET will remove spaces and may cause this problem.

          Preceding  the  continuation character with at least one space
          is recommended.
2 CLD
      continuation line starts with "$"

          DCL continuation lines may NOT start with "$".
2 CLS
      comment line separates continuation line (warning)

          This usually makes code harder to read and maintain.
          It also cause DCLDIET to generate code that is wrong.
          Consider changing this.
2 CNO
      A file that is closed has no OPEN statement

          A file, identified by a logical name, has been closed at least
          once, but there is no OPEN statement for this file.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 CRE
      code cannot be reached due to EXIT at line <line>

          Code following an unconditional EXIT statement is unreachable
          until a label, ENDIF or ELSE is encountered.
2 CRG
      code cannot be reached due to GOTO at line <line>

          Code following an unconditional GOTO statement is unreachable
          until a label, ENDIF or ELSE is encountered.
2 DFB
      $DECK found between $DECK and $EOD

          DECK and EOD delimit an input stream for a command or program.
          They must be paired and may not be nested.
2 DL
      duplicate label "<label>"

          The same label has been defined on two or more lines.
2 DNA
      ENDIF statement not allowed here

          An  ENDIF statement may only be used with an IF statement that
          does NOT have THEN on the same line as the IF.

          This  can  be  caused  by overlapping SUBROUTINES and IF-ENDIF
          groups.  SUBROUTINES and IF-ENDIF groups may  be  disjoint  or
          nested; they may not overlap.

          There may not be more than one ENDIF for each such IF
          statement.
2 EFB
      "=" found between IF and THEN

          The  equals  sign ("=") is probably being used for comparison.
          "=" is used for  assignment.   Use  ".EQ."   or  ".EQS."   for
          comparison.
2 EFN
      $EOD found with no corresponding $DECK

          DECK and EOD delimit an input stream for a command or program.
          They must be paired and may not be nested.
2 ENA
      ELSE statement not allowed here

          An ELSE statement may be used only between an IF statement and
          the corresponding ENDIF.

          This  can  be  caused  by overlapping SUBROUTINES and IF-ENDIF
          groups.  SUBROUTINES and IF-ENDIF groups may  be  disjoint  or
          nested; they may not overlap.

          There may not be more than one ELSE statement for each IF.
2 ICF
      possible invalid character found (& in PIPE) (warning)
      possible invalid character found ( % or &) (warning)
      invalid character found (# or ^)

          #, %, ^ and & are generally not valid in commands.

          Exceptions:

              %X and %O for hex and octal radix indication
                  These occurrences are not reported and may suppress
                  additional ICF instances in the same line.

              & for symbol substation and % for wildcard
                  These occurrences are incorrectly reported.
                  Lines with & or % are marked as warnings.

          Rational:

              The rational for checking these particular characters and
              not various others is this:

                  The "#" and "%" keys are adjacent to the "$" key and
                  can be easily typed by mistake.

                  The "^" character can be miss-used to indicate
                  exponentiation.  (DCL expressions do not include an
                  exponentiation operator.)

                  The "&" can be miss-used in place of "+" or ".AND.".
2 ICO
      invalid comparison or logical operator

          Please use DCL HELP and see
              SPECIFY EXPRESSION ARITHMETIC or
              SPECIFY EXPRESSION STRING
          for a list of valid operators.

          This  message  indicates  that  one  or more of the following,
          invalid operators was found.  Notice that many  of  these  are
          valid operators with the leading and/or trailing period (".")
          missing.

              " .eq "     " eq. "     " eq "
              " .ge "     " ge. "     " ge "
              " .gt "     " gt. "     " gt "
              " .le "     " le. "     " le "
              " .lt "     " lt. "     " lt "
              " .ne "     " ne. "     " ne "
              " .or "     " or. "     " or "
              " .not "    " not. "    " not "
              " .and "    " and. "    " and "
              " .eqs "    " eqs. "    " eqs "
              " .ges "    " ges. "    " ges "
              " .gts "    " gts. "    " gts "
              " .les "    " les. "    " les "
              " .lts "    " lts. "    " lts "
              " .nes "    " nes. "    " nes "
              " .new "    " new. "    " .new. "
              " .eas "    " eas. "    " .eas. "
              " .gs. "    " .ls. "    " .es. "
              " .ns. "    ">"         "<"
              "=>"        ">="        "<="
              "=<"        " _ " (underscore)

      Note  that  this  will  sometimes  consider  "<>"  pairs  used for
      directories to be invalid comparison  operators.   Either  ignore
      this or use "[]" in place of "<>".
2 INR
      A file that is opened for read is not read

          An  OPEN  statement specifies /READ, explicitly or by default,
          but there is no READ statement for this file.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 INT
      IF statement not terminated

          A  multi-line IF  statement  is  not  terminated  by  an ENDIF
          statement.  This does not apply to IF statements with THEN  on
          the same line (or a continuation line).

          This  can  be  caused  by overlapping SUBROUTINES and IF-ENDIF
          groups.  SUBROUTINES and IF-ENDIF groups may  be  disjoint  or
          nested; they may not overlap.
2 LC
      line contains END_IF, END IF, GO_TO, GO TO, GO_SUB or GO SUB

          ENDIF, GOTO and GOSUB are often miss-coded in one of these
          ways.
2 LFF
      line contains only form-feed (<FF>)

          This line contains only a form-feed character (<FF>).

          If you want to insert a form-feed to paginate a listing of
          this procedure consider using a comment line ("$!<FF>").
2 LND
      line does not start with "$"

          All  DCL  lines  except  continuation lines and lines within a
          $DECK/$EOD pair must start with a "$".

          If this line is input to a command or procedure, it may not be
          an error.  However, consider enclosing such input lines within
          a  $DECK/$EOD  pair  to  make  this  intention  clear.   Using
          $DECK/$EOD may also avoid other false diagnostics.

          If  you  want  to include a form-feed to force a new page when
          printing the command procedure, consider using "$!<FF>".
2 LNF
      label "<label>" not found

          A  label  that  is  not  defined has been referenced.

          This  diagnostic is also issued if the label cannot be reached
          because either the label or this statement is in a subroutine,
          and they are not both in the same subroutine.

          See also LNS
2 LNR
      label "<label>" not referenced (warning)

          A  label  is  defined  but not referenced.  Since unreferenced
          labels are  often  used  in  DCL  procedures  as  a  style  of
          documentation, this may not be a problem.
2 LNS
      referenced label "<label>" is not in this subroutine

          A label referenced in a subroutine is not in the subroutine.
2 LDS
      Label "<label>" defined by symbol substitution (warning)

      A  label  will  be  constructed  at  execution  time  using symbol
      substitution.  The validity of this label and of references to  it
      cannot  be  checked  before execution.  This code and the logic it
      implements should be carefully reviewed.

2 LOD
      line contains only a $ (warning)

          This line contains only a "$".  This may indicate a coding
          error.

          If you want blank lines to add white space for readability,
          consider using blank comment lines ("$!").

          (Blank lines within $DECK/$EOD pairs are allowed.)

          Note that neither DCL_DIET nor DCLDIET remove blank lines.
          Lines with only "$" or "$!" are removed.
2 MEC
      missing expression for comparison

          A comparison operator is the first or last thing on a line and
          does not have a comparison value preceding of following it.
2 NCL
      no continuation line at EOF

          The last non-comment line in the file ended with a
          continuation character (-).
2 NED
      no $EOD for $DECK at <line>

          $DECK and $EOD delimit an input stream for a command or
          program.  They must be paired and may not be nested.
2 NLN
      An OPEN, READ, WRITE or CLOSE statement has no logical name

          An OPEN, READ WRITE or CLOSE statement has be found which does
          not include the required logical name to reference the file.
2 OCE
      OPEN or CLOSE statement with /END qualifier

          Although DCL accepts and /END qualfier on OPEN and CLOSE
          commands without error, this is not documented or supported
          and it has no effect.  You may want to eliminate this
2 ONC
      A fine that is opened has no CLOSE statement

          A file, identified by a logical name, has been opened at least
          once, but there is no CLOSE statement for this file.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 ONW
      A file that is opened for write is not written

          An  OPEN  statement  specifies  /WRITE  but  there is no WRITE
          statement (without /UPDATE) for this file.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 PML
      possible misspelled lexical (<lexical>)

          This line contains what appears to be a misspelled lexical
          function.

          This  diagnostic  message  may  be displayed if a valid symbol
          name starts with  the  characters  "F$".   See  HELP  PROBLEMS
          LEXICALS for more information.
2 PRQ
      probable error using single-quote  (')

          When  single-quotes  (')  are used outside a quoted string for
          symbol substitution, there must be one single-quote  preceding
          the  symbol  and  one  following  it.   This  also  applies to
          substituting values provided by lexical functions.

          Example:

          This line follow the rule:
              $ help/libr='help_dir'dcl_check DCL_CHECK

          This line does not follow the rule:
              $ this_node_name := 'f$getsyi("NODENAME")

          Although  omitting  the  single-quote  following the symbol or
          lexical function will not cause problems in some cases, it  is
          recommended that this be corrected.

          NOTE:   When  one  or  more  single quotes are enclosed within
          double quotes as part of a text string, false PRQ  errors  may
          be  generated.   Common English contractions and perceives are
          recognized and do not usually cause PRQ errors.
2 PSQ
      possible error using single-quote (') in quoted string

          When  single-quotes (') are used in a quoted string for symbol
          substitution, there  must  be  two  consecutive  single-quotes
          preceding  the symbol and one following it.  This also applies
          to substituting values provided by lexical functions.

          Examples:

              $ write sys$output "My name is ''name'."
              $ write sys$output "This is a ''f$getsyi("ARCH_NAME")'."

          The  line which generated this diagnostic does not follow this
          rule.   In  some  cases  this  may  be  valid  text,  such  as
          contractions or possessives.  Check to ensure that this is not
          a coding error.

      See also HELP PROBLEMS SINGLE-QUOTE
2 PTL
      possible truncated lexical (<lexical>)

          This  line  contains  what  appears  to be a lexical function.
          However, it has been truncated to  less  than  six  characters
          (including the "F$").

          Although  this  may  not  be  a  problem  in some cases, it is
          recommended that it be corrected.

          This  diagnostic  message  may  be displayed if a valid symbol
          name starts with  the  characters  "F$".   See  HELP  PROBLEMS
          LEXICALS for more information.
2 RLI
      referenced label "<label>" is in if-group at lines <line-range>

          A  label  that  is  within an if-group has been reference by a
          statement that is not in the same if-group.  The label  cannot
          be seen from this statement.
2 RLS
      referenced label "<label>" is in subroutine at lines <line-range>

          A  label  that  is within a subroutine has been reference by a
          statement that is not in the same subroutine. The label cannot
          be seen from this statement.

          NOTE:  Similar labels can be used in different subroutines. If
          no instance of the label can be accessed from this statement a
          LNF diagnostic is also issued.

2 RNA
      ENDSUBROUTINE statement not allowed here

          An  ENDSUBROUTINE  statement  may  be  used  only  following a
          SUBROUTINE statement.

          This  can  be  caused  by overlapping SUBROUTINES and IF-ENDIF
          groups.  SUBROUTINES and IF-ENDIF groups may  be  disjoint  or
          nested; they may not overlap.

          There  may  not  be  more than one ENDSUBROUTINE statement for
          each SUBROUTINE.
2 RNR
      A file that is not opened for read is being read

          A  file  is  being  read,  but the only OPEN statement for the
          logical name used to identify this file specifies /WRITE

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 SNT
      SUBROUTINE statement not terminated

          A SUBROUTINE is not terminated by an ENDSUBROUTINE statement.

          This  can  be  caused  by overlapping SUBROUTINES and IF-ENDIF
          groups.  SUBROUTINES and IF-ENDIF groups may  be  disjoint  or
          nested; they may not overlap.
2 TLS
      target label "<label>" provided by symbol substitution (warning)

          A  reference  to a label will be constructed at execution time
          using symbol substitution.  The  validity  of  this  reference
          cannot be checked before execution. This code and the logic it
          implements should be carefully reviewed.
2 TML
      too many levels of IF statements

          IF statements may be nested to a maximum of 15 levels.
          This message indicates that this limit has been exceeded.
2 TMS
      too many levels of IF and SUBROUTINE statements

          DCL_CHECK  tracks the combined IF and SUBROUTINE statements to
          a maximum or 20 combined levels. This limit has been exceeded.
          This is not a DCL limit; it is a DCL_CHECK limit.
2 TNA
      THEN statement not allowed here

          A THEN statement may only be used immediately following an IF
          statement.

          There may not be more than one THEN for each IF.
2 TRH
      THEN statement required here

          If  THEN does not appear on the same line with an IF statement
          (or on a continuation line), then the next line must be a THEN
          statement.
2 UMP
      unmatched parentheses (not in quoted string)

          This line contains an unmatched set of open-parentheses, "(",
          and close-parentheses, ")", in that part of the command
          EXCLUDING quoted strings.  Note that this requires not only
          that the number of open- and close-parentheses match, but also
          that each close-parenthesis follows its paired open-parenthesis.

2 USP
      unmatched parentheses in quoted sstring

          This  line  contains  an  un-equal number of open-parentheses,
          "(", and close-parentheses, ")".  In some cases  this  may  be
          valid text.  Check to ensure that this is not a coding error.

          In  checking form unmatched parentheses, DCL_CHECK attempts to
          ignore quoted strings that consist of a single open- or close-
          parenthesis. This usually reduces invalid UMP diagnostics, but
          in some cases, in can create an invalid UMP diagnostics.
2 UMB
      unmatched brackets (not inquoted string)

          This line contains an unmatched set of open-brackets, "[",
          and close-brackets, "]", in that part of the command
          EXCLUDING quoted strings.  Note that this requires not only
          that the number of open- and close-brackets match, but also
          that each close-bracket follows its paired open-bracket.

2 USB
      unmatched brackets in strings

          This line contains an unmatched set of open-brackets, "[",
          and close-brackets, "]", in that part of the command
          within quoted strings.  Note that this requires only that
          the number of left- and right-brackets match; there is
          no check on their order.  In some cases  this  may  be
          valid text.  Check to ensure that this is not a coding error.

          In making this check, isolated strings that consist of a single
          open- or close-bracket, "[" and "]", will NOT be counted.  This
          usually reduces invalid USB diagnostics, but in some cases
          it can create an invalid USB diagnostic.
2 UNU
      A file that is not opened for read and write is being updated

          A  file  is  being written with the /UPDATE qualifier, but the
          file has not been opened for /READ and /WRITE.

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.
2 UPQ
      unpaired quotation marks  (")

          This line contains an uneven number of double-quotes, (").
2 WCT
      wrong constant type for comparison

          Either  a  numeric comparison operator is preceded or followed
          by a quoted string, or

          a  string  comparison  operator  is preceded of followed by an
          numeric constant.

      NOTE:  A comparison operater within a quoted string may generate a
      false WCT error.  For example:

          $ abbr_list = ".NO.LE.MA."
2 WNW
      A file that is not opened for write or append is being written

          A  file  is being written, but the only OPEN statement for the
          logical name used to identify this  file  specifies  /READ  or
          /APPEND.  (/READ may be implicit -- by default.)

          NOTE:  This may be erroneously reported if symbol substitution
          is used for the logical name used to reference the file.

1 Modifications
      You  can  modify  or  "customize" DCL_CHECK by editing the command
      procedure, DCL_CHECK.COM. However, DCL_CHECK.COM is a "compressed"
      version  of  the  procedure.   To  save  disk  space  and  improve
      performance,  all  comments  and  unnecessary  spacing  have  been
      removed  from  DCL_CHECK.COM.  This makes it difficult to read and
      understand the procedure.

      It  should  be  much easier to edit the file DCL_CHECK.COM_SOURCE,
      which contains commands  and  is  formatted  to  facilitate  human
      reading.   You  can recreate a "compressed" version of the command
      procedure by using DCL_DIET.COM.
2 Help
      DCL_CHECK.HLB   is   a   standard  help  library.   You  can  edit
      DCL_CHECK.HLP and use the command

          $ LIBRARY /CREATE /HELP DCL_CHECK DCL_CHECK

      to create the new DCL_CHECK.HLB.
1 DCL_DIET
      DCL_DIET  is  a  command  procedure  that  accepts  as input a DCL
      command procedure file.  It compresses, or "diets",  the  file  by
      removing  comments and unnecessary spaces.  The compressed version
      is created as output.

      The smaller size of the compressed file has two advantages:

          o It takes up less space on disk or tape.

          o It executes faster
              -- especially for larger command procedures.

      DCL_DIET is not part of DCL_CHECK.  It is provided separately.

      See also DCLDIET (no "_")
2 Installation
      To install DCL_DIET put the file

          DCL_DIET.COM

      wherever  you  want  it.  You then execute DCL_DIET as an indirect
      command procedure, supplying the file to be dieted as P1.

      For example:

          $ @SYS$LOGIN:DCL_DIET:MY_COMMAND.COM

      DCL_DIET.COM  is  provided in "dieted" form.  You may also wish to
      have the file DCL_DIET.COM_SOURCE available;  this  is  the  fully
      commented version of the procedure.
1 DCLDIET

      DCLDIET is a utility used within OpenVMS engineering to "diet" DCL
      command procedure files.  It functions similarly to DCL_DIET.

      See also DCL_DIET (with "_")
1 Installation
      To install DCL_CHECK you must put the files

          DCL_CHECK.COM and
          DCL_CHECK.HLB

      into the same directory. You then execute DCL_CHECK as an indirect
      command procedure.  See "Format" for additional information.

      DCL_CHECK.COM  is provided in "dieted" form.  You may also wish to
      have the file DCL_CHECK.COM_SOURCE available; this  is  the  fully
      commented version of the procedure.
