PROCEDURE list_legible_file, list_legible_files, lislf (
  file, files, f: any of
      key
        all
      keyend
      list 1..$max_list of file
    anyend = all
  output, o: file = $output
  include_line_numbers, iln: boolean = FALSE
  page_length, pl: (BY_NAME, ADVANCED) integer 1..6000 = 60
  status)

  " PURPOSE:
  "   List the specified legible files.
  " DESIGN:
  "   Print the specified files with the text broken up into pages with page
  "   headers and page numbers.
  "   An option to print line numbers is provided.
  "   Based on procedure LIST_PROCEDURE_CONTENT in $system.osf$site_command_library.

  VAR
    blank_line: string = ' '
    date_time: string = $date(iso)//'  '//$time
    file_being_listed: file = $unique(:$local)
    file_created_time: string = ' '
    file_modified_time: string = ' '
    files_list: list 0..$max_list of file = ()
    header: integer = 3
    ignore: status
    line_number: integer = 0
    lines_to_print: integer = 0
    listed_file_contents: list 0..$max_list of string
    number_of_files: integer = 0
    number_of_lines_per_page: integer = page_length - header
    legible_file_output: file = $unique(:$local)
    page_number: integer = 0
    title_line1: string = ' '
    title_line2: string = ' '
    total_lines: integer = 0
  VAREND

  WHEN exit DO
    detach_file file=legible_file_output status=ignore
  WHENEND

"Set necessary file attributes

  set_file_attributes file=legible_file_output file_content=list open_position=$asis

"Determine the file(s) to be listed.

  IF $generic_type(file) = 'KEY' THEN "list all files
    IF $string($working_catalog) = ':$LOCAL' THEN
      put_line line=(' ', '  The requested operation cannot be performed for files in $LOCAL catalog') ..
            output=$response
      EXIT PROCEDURE
    IFEND
    files_list = $wild_card_files(*)
  ELSE
    files_list = $parameter_value(file)
  IFEND

  FOR EACH file_being_listed IN files_list DO
    IF $path(file_being_listed, catalog) = ':$LOCAL' THEN
      put_line line=(' ', '  The requested operation cannot be performed for files in $LOCAL catalog') ..
            output=$response
      CYCLE
    ELSEIF $file_attributes(file_being_listed, object_type)(1).object_type = catalog THEN
      put_line line= (' ', $string(file_being_listed)//' not processed because it is a catalog') ..
            output=$response
      CYCLE
    ELSEIF $file_attributes(file_being_listed, file_contents)(1).file_contents <> legible_data THEN
      put_line line= (' ', $string(file_being_listed)//' not processed because it is not a legible file') ..
            output=$response
      CYCLE
    IFEND

    put_line line=(' Processing file '//$string(file_being_listed)//'...') output=$response

    file_created_time = $string($file_attributes(file_being_listed, creation_date_time)(1).creation_date_time)
    file_modified_time = $string(..
          $file_attributes(file_being_listed, last_modification_date_time)(1).last_modification_date_time)

    line_number = 0
    lines_to_print = 0

"  read the whole file

    get_lines variable=listed_file_contents input=file_being_listed.$asis line_count=lines_to_print
    WHILE line_number < lines_to_print DO
      IF ($mod(line_number, number_of_lines_per_page) = 0) THEN
        page_number = page_number + 1
        title_line1 = '1 LIST OF '//..
$justify($string(file_being_listed), 85, left)//'  '//date_time//'  PAGE '//$justify($string(page_number), 5..
, left)
        title_line2 = '          Created: '//file_created_time//'  Last Modified:'//file_modified_time
        put_lines lines=(title_line1, title_line2, blank_line) output=legible_file_output
      IFEND
      line_number = line_number + 1

      IF include_line_numbers THEN
        put_line line=' '//..
$justify($string(line_number), 5, right)//' '//$justify(listed_file_contents(line_number), 125, left) ..
              output=legible_file_output
      ELSE
        put_line line='  '//listed_file_contents(line_number) output=legible_file_output
      IFEND
    WHILEND

    number_of_files = number_of_files + 1
    total_lines = total_lines + lines_to_print
  FOREND " loop to next file in list of files being processed "

"Display final status.

  IF page_number = 0 THEN " no legible files"
    put_line line=(' ', '  No legible files in the file list') output=$response
  ELSE
    put_line line=(' ', '  Listed '//page_number//' pages containing '//total_lines//' lines and '//..
number_of_files//' files to '//$string(output)) output=$response
  IFEND

  rewind_file file=legible_file_output
  copy_file input=legible_file_output output=output status=status
  detach_file file=legible_file_output status=ignore

PROCEND list_legible_file
