?? PUSH (LISTEXT := ON) ??
*copyc amt$file_identifier
*copyc amt$tape_failure_isolation
*copyc bat$tape_descriptor
*copyc osp$append_status_parameter
?? POP ??

  PROCEDURE [INLINE] bai$check_tape_error (file_identifier:
    amt$file_identifier;
        file_instance: ^bat$task_file_entry;
        tape_failure_modes: amt$tape_failure_modes;
    VAR found_error: boolean;
    VAR status: ost$status);

    VAR
      delimiter: char,
      error_text: string (255),
      error_index: integer,
      tape_descriptor: ^bat$tape_descriptor,
      tape_error: amt$tape_failure_mode;

    found_error := FALSE;
    tape_descriptor := bai$tape_descriptor (file_instance);
    tape_descriptor^.failure_isolation.failure_modes := tape_failure_modes;

    IF status.normal THEN
      RETURN;
    IFEND;

    error_text := '';
    error_index := 1;
    delimiter := '[';

    FOR tape_error := LOWERVALUE (amt$tape_failure_mode) TO UPPERVALUE
          (amt$tape_failure_mode) DO
      IF tape_error IN tape_failure_modes THEN
        found_error := TRUE;
        CASE tape_error OF
        = amc$tfm_agc_gains_not_set =
          append_text (delimiter, ' agc_gains_not_set', error_text, error_index);
        = amc$tfm_bad_id_burst =
          append_text (delimiter, ' bad_id_burst', error_text, error_index);
        = amc$tfm_blank_tape_read =
          append_text (delimiter, ' blank_tape_read', error_text, error_index);
        = amc$tfm_data_parity_error =
          append_text (delimiter, ' data_parity_error', error_text, error_index);
        = amc$tfm_device_not_ready =
          append_text (delimiter, ' device_not_ready', error_text, error_index);
        = amc$tfm_erase_error =
          append_text (delimiter, ' erase_error', error_text, error_index);
        = amc$tfm_record_fragment =
          append_text (delimiter, ' record_fragment', error_text, error_index);
        = amc$tfm_hardware_failure =
          append_text (delimiter, ' hardware_failure', error_text, error_index);
        ELSE
          append_text (delimiter, ' unknown failure mode', error_text, error_index);
        CASEND;
        delimiter := ',';
      IFEND;
    FOREND;
    IF found_error THEN
      append_text (' ', ']', error_text, error_index);
      osp$append_status_parameter (' ', error_text, status);
    IFEND;

  PROCEND bai$check_tape_error;


  PROCEDURE [INLINE] append_text (delimiter: char;
        text: string ( * );
    VAR error_text: string ( * );
    VAR error_index: integer);

    error_text (error_index) := delimiter;
    error_index := error_index + 1;
    error_text (error_index, *) := text;
    error_index := error_index + STRLENGTH (text);

  PROCEND append_text;
