?? RIGHT := 110 ??
*copyc osd$default_pragmats
?? NEWTITLE := 'NOS/VE Device Management' ??
?? NEWTITLE := '  Module Header' ??
MODULE dmm$debug_command_processing;
?? RIGHT := 110 ??
?? PUSH (LISTEXT := ON) ??
?? TITLE := '  Common Decks', EJECT ??
*copyc oss$mainframe_pageable
*copyc oss$mainframe_paged_literal
*copyc sye$command_processor_errors
*copyc dmt$debug_actions
*copyc ost$signature_lock
*copyc ost$status
*copyc ost$wait
?? POP ??
*copyc osp$clear_signature_lock
*copyc osp$set_signature_lock
*copyc osp$set_status_abnormal
*copyc dmv$debug_options
?? TITLE := '  Global Variables', EJECT ??

  VAR
    dmv$store_debug_lock: [STATIC, oss$mainframe_pageable] ost$signature_lock := [0];

  VAR
    debug_command_options: [READ, oss$mainframe_paged_literal] array [1 .. 3] of record
      command_name: string (31),
      debug_ordinal: dmt$debug_codes,
    recend := [
{        } ['DEBUG_DAT_CHANGES', dmc$debug_dat_changes],
{        } ['DEBUG_DFL_CHANGES', dmc$debug_dfl_changes],
{        } ['DEBUG_DEVICE_MANAGER', dmc$debug_device_manager]];

?? TITLE := '  dmp$fetch_debug_option', EJECT ??

  PROCEDURE [XDCL] dmp$fetch_debug_option_value
    (    name: string ( * );
     VAR value: integer;
     VAR status: ost$status);

    VAR
      debug_set_member: dmt$debug_codes;

    status.normal := TRUE;

    process_command (name, debug_set_member, status);
    IF status.normal THEN
      IF debug_set_member IN dmv$debug_options THEN
        value := $INTEGER (TRUE);
      ELSE
        value := $INTEGER (FALSE);
      IFEND;
    IFEND;

  PROCEND dmp$fetch_debug_option_value;
?? TITLE := '  dmp$store_debug_option_value', EJECT ??

  PROCEDURE [XDCL] dmp$store_debug_option_value
    (    name: string ( * );
         value: integer;
     VAR status: ost$status);

    VAR
      debug_set_member: dmt$debug_codes,
      lock_status: ost$status;

    status.normal := TRUE;

    osp$set_signature_lock (dmv$store_debug_lock, osc$wait, lock_status);

    process_command (name, debug_set_member, status);
    IF status.normal THEN
      IF value = $INTEGER (FALSE) THEN
        dmv$debug_options := dmv$debug_options - $dmt$debug_actions [debug_set_member];
      ELSE
        dmv$debug_options := dmv$debug_options + $dmt$debug_actions [debug_set_member];
      IFEND;
    IFEND;

    osp$clear_signature_lock (dmv$store_debug_lock, lock_status);

  PROCEND dmp$store_debug_option_value;
?? TITLE := '  process_command', EJECT ??

  PROCEDURE process_command
    (    name: string ( * );
     VAR debug_set_member: dmt$debug_codes;
     VAR status: ost$status);

    VAR
      valid_command_option: boolean,
      upper_case_name: string (31),
      error_string: string (55),
      string_index: integer,
      command_options_index: integer;

    status.normal := TRUE;

    valid_command_option := FALSE;
    upper_case_name := name;

    FOR string_index := 1 TO STRLENGTH (upper_case_name) DO
      IF (upper_case_name (string_index) >= 'a') AND (upper_case_name (string_index) <= 'z') THEN
        upper_case_name (string_index) := $CHAR ($INTEGER (upper_case_name (string_index)) - $INTEGER ('a') +
              $INTEGER ('A'));
      IFEND;
    FOREND;

  /scan_command_table/
    FOR command_options_index := 1 TO UPPERBOUND (debug_command_options) DO
      valid_command_option := (upper_case_name = debug_command_options [command_options_index].command_name);
      IF valid_command_option THEN
        EXIT /scan_command_table/; {----->
      IFEND;
    FOREND /scan_command_table/;

    IF NOT valid_command_option THEN
      error_string := 'Unknown parameter name: ';
      error_string (25, * ) := upper_case_name;
      osp$set_status_abnormal ('SY', sye$unknown_parameter_name, error_string, status);
      RETURN; {----->
    IFEND;

    debug_set_member := debug_command_options [command_options_index].debug_ordinal;

  PROCEND process_command;

MODEND dmm$debug_command_processing;
