*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$build_term_char_values;
?? TITLE := 'MODULE iim$build_term_char_values' ??

?? PUSH (LISTEXT := ON) ??
*copyc IIT$CONNECTION_DESCRIPTION
*copyc IIV$INTERACTIVE_TERMINATED
*copyc OST$STATUS
*copyc PMP$LOG
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$build_term_char_values', EJECT ??

  PROCEDURE [XDCL] iip$build_term_char_values (open_file_desc_pointer:
    ^iit$open_file_description);

    VAR
      ofdp: ^iit$open_file_description,
      status: ost$status,
      field_value_pointer: ^iit$field_value;

    ofdp := open_file_desc_pointer;  { for coding convenience. }

  { Set break key action.

    IF ofdp^.attributes.break_key_action.value = 0 THEN
      ofdp^.term_char_values [iic$key_user_break_1] := 0;           {iic$key_user_break_1 maps to BR:  FN=33(16)}
    ELSE
      ofdp^.term_char_values [iic$key_user_break_1] := 1;
    IFEND;

  { Set input editing mode.

    IF ofdp^.attributes.input_editing_mode.value = ifc$normal_edit THEN
      ofdp^.term_char_values [iic$key_trans_input_mode] := 0;       {iic$key_trans_input_mode:  FN=34(16)}
    ELSEIF ofdp^.attributes.input_editing_mode.value = ifc$trans_edit THEN
      ofdp^.term_char_values [iic$key_trans_input_mode] := 1;
    ELSE
      pmp$log (' Attribute value is out of range in iim$build_tc_values', status);
    IFEND;

  { Set input output mode.

    IF (ofdp^.attributes.input_output_mode.value = ifc$unsolicited_output) THEN
      ofdp^.term_char_values [iic$key_full_duplex] := 0;            {iic$key_full_duplex:  FN=57(16)}
      ofdp^.term_char_values [iic$key_solicited_mode] := 0;
    ELSEIF (ofdp^.attributes.input_output_mode.value =
          ifc$solicited) THEN
      ofdp^.term_char_values [iic$key_full_duplex] := 0;
      ofdp^.term_char_values [iic$key_solicited_mode] := 1;
    ELSEIF (ofdp^.attributes.input_output_mode.value =
          ifc$full_duplex) THEN
      ofdp^.term_char_values [iic$key_full_duplex] := 1;
      ofdp^.term_char_values [iic$key_solicited_mode] := 0;
    ELSE
      pmp$log (' Attribute value is out of range in iim$build_tc_values', status);
    IFEND;

  { Set partial character forwarding.

    IF ofdp^.attributes.partial_char_forwarding.value THEN
    { block mode }
      ofdp^.term_char_values [iic$key_input_device] := iiv$downline_input_device_conv
            [ifc$block_mode_input];
    ELSE
    { keyboard input device }
      ofdp^.term_char_values [iic$key_input_device] := iiv$downline_input_device_conv
            [ifc$keyboard_input];
    IFEND;

  { Set store backspace character.

    IF ofdp^.attributes.store_backspace_character.value THEN
      IF NOT (ofdp^.attributes.store_nuls_dels.value) THEN
      { turn special editing on }
        ofdp^.term_char_values [iic$key_special_editing] := 1;
      IFEND;
    ELSE
      { turn special editing off }
        ofdp^.term_char_values [iic$key_special_editing] := 0;
    IFEND;

  { Set store nuls dels.

    IF ofdp^.attributes.store_nuls_dels.value THEN
      IF ofdp^.attributes.store_backspace_character.value THEN
      { turn full ascii on }
        ofdp^.term_char_values [iic$key_full_ascii] := 1;
      IFEND;
    ELSE
      { turn full ascii off }
        ofdp^.term_char_values [iic$key_full_ascii] := 0;
    IFEND;

  { Set transparent character mode.

    CASE ofdp^.attributes.trans_character_mode.value OF
    = ifc$no_trans_char =
      ofdp^.term_char_values [iic$key_trans_delim_char_select] := 0;  { FN=38(16) }
    = ifc$trans_char_terminate =
      ofdp^.term_char_values [iic$key_trans_delim_char_select] := 1;
    = ifc$trans_char_forward, ifc$trans_char_fwd_terminate =
      ofdp^.term_char_values [iic$key_trans_delim_char_select] := 1;
    ELSE
      pmp$log (' Attribute value is out of range in iim$build_tc_values', status);
    CASEND;

  { Set transparent length mode.

    CASE ofdp^.attributes.trans_length_mode.value OF
    = ifc$no_trans_len =
      ofdp^.term_char_values [iic$key_trans_delim_count_most] := 0;  { FN=39(16) }
      ofdp^.term_char_values [iic$key_trans_delim_count_least] := 0;  { FN=3A(16) }
    = ifc$trans_len_terminate =
    = ifc$trans_len_forward, ifc$trans_len_forward_exact =
    ELSE
      pmp$log (' Attribute value is out of range in iim$build_tc_values', status);
    CASEND;

  { Set transparent timeout mode.

    CASE ofdp^.attributes.trans_timeout_mode.value OF
    = ifc$no_trans_timeout =
      ofdp^.term_char_values [iic$key_trans_delim_timeout] := 0;  { FN=3C(16) }
    = ifc$trans_timeout_terminate =
      ofdp^.term_char_values [iic$key_trans_delim_timeout] := 1;
      ofdp^.term_char_values [iic$key_trans_mode_delim_lock] := 0; { FN=92(16) 'sticky' }
    = ifc$trans_timeout_forward =
      ofdp^.term_char_values [iic$key_trans_delim_timeout] := 1;
      ofdp^.term_char_values [iic$key_trans_mode_delim_lock] := 1;
    ELSE
      pmp$log (' Attribute value is out of range in iim$build_tc_values', status);
    CASEND;

  { Set transparent input type.

    IF (ofdp^.attributes.trans_character_mode.value = ifc$trans_char_forward) OR
          (ofdp^.attributes.trans_character_mode.value = ifc$trans_char_fwd_terminate) OR
          (ofdp^.attributes.trans_length_mode.value = ifc$trans_len_forward) OR
          (ofdp^.attributes.trans_length_mode.value = ifc$trans_len_forward_exact) OR
          (ofdp^.attributes.trans_timeout_mode.value = ifc$trans_timeout_forward) THEN
      ofdp^.term_char_values [iic$key_trans_input_type] := 1;       { FN=46(16) }
    ELSE
      ofdp^.term_char_values [iic$key_trans_input_type] := 0;
    IFEND;

  { Set transparent delimiter end count, i.e., transparent message length.

    IF ofdp^.attributes.trans_length_mode.value <>
          ifc$no_trans_len THEN
      ofdp^.term_char_values [iic$key_trans_delim_count_most]
            := ofdp^.attributes.trans_message_length.value
            DIV 100(16);
      ofdp^.term_char_values [iic$key_trans_delim_count_least]
            := ofdp^.attributes.trans_message_length.value
            MOD 100(16);
    ELSE
      ofdp^.term_char_values [iic$key_trans_delim_count_most] := 0;
      ofdp^.term_char_values [iic$key_trans_delim_count_least] := 0;
    IFEND;

  { Set transparent forwarding character.

    field_value_pointer := #LOC (ofdp^.attributes.trans_forward_character.value.value);
    ofdp^.term_char_values [iic$key_trans_delim_character] := field_value_pointer^;  { FN=3B(16) }

  { Set transparent terminate character.

    field_value_pointer := #LOC (ofdp^.attributes.trans_terminate_character.value.value);
    ofdp^.term_char_values [iic$key_trans_mode_delim_char] := field_value_pointer^;  { FN=45(16) }

  PROCEND iip$build_term_char_values;
MODEND iim$build_term_char_values;
