?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE SCL Interpreter : Debug Commands and Functions' ??
MODULE clm$debug_commands;

{
{ PURPOSE:
{   This module contains processors for the debug environment commands.
{
?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc clt$parameter_list
*copyc clt$value
*copyc cle$ecc_miscellaneous
*copyc clt$name
*copyc ost$status
?? POP ??
*copyc clp$get_set_count
*copyc clp$get_value
*copyc clp$scan_parameter_list
*copyc osp$set_status_abnormal
*copyc pmp$change_debug_library_list
*copyc pmp$set_job_debug_ring

?? TITLE := 'clp$set_debug_ring_command', EJECT ??

  PROCEDURE [XDCL] clp$set_debug_ring_command
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PDT set_debug_ring_pdt (
{   ring, r : INTEGER osc$min_ring .. osc$max_ring = $REQUIRED
{   STATUS)

?? PUSH (LISTEXT := ON) ??

    VAR
      set_debug_ring_pdt: [STATIC, READ, cls$pdt] clt$parameter_descriptor_table :=
            [^set_debug_ring_pdt_names, ^set_debug_ring_pdt_params];

    VAR
      set_debug_ring_pdt_names: [STATIC, READ, cls$pdt_names_and_defaults] array [1 .. 3] of
            clt$parameter_name_descriptor := [['RING', 1], ['R', 1], ['STATUS', 2]];

    VAR
      set_debug_ring_pdt_params: [STATIC, READ, cls$pdt_parameters] array [1 .. 2] of
            clt$parameter_descriptor := [

{ RING R }
      [[clc$required], 1, 1, 1, 1, clc$value_range_not_allowed,
            [NIL, clc$integer_value, osc$min_ring, osc$max_ring]],

{ STATUS }
      [[clc$optional], 1, 1, 1, 1, clc$value_range_not_allowed,
            [NIL, clc$variable_reference, clc$array_not_allowed, clc$status_value]]];

?? POP ??

    VAR
      value: clt$value;

    clp$scan_parameter_list (parameter_list, set_debug_ring_pdt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    clp$get_value ('RING', 1, 1, clc$low, value, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    pmp$set_job_debug_ring (value.int.value, status);

  PROCEND clp$set_debug_ring_command;
?? TITLE := 'clp$set_debug_list_command', EJECT ??

  PROCEDURE [XDCL] clp$set_debug_list_command
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PDT set_debug_list_pdt (
{   delete_libraries, delete_library, dl : LIST OF FILE OR KEY all
{   add_libraries, add_library, al : LIST OF FILE
{   STATUS)

?? PUSH (LISTEXT := ON) ??

    VAR
      set_debug_list_pdt: [STATIC, READ, cls$pdt] clt$parameter_descriptor_table :=
            [^set_debug_list_pdt_names, ^set_debug_list_pdt_params];

    VAR
      set_debug_list_pdt_names: [STATIC, READ, cls$pdt_names_and_defaults] array [1 .. 7] of
            clt$parameter_name_descriptor := [['DELETE_LIBRARIES', 1], ['DELETE_LIBRARY', 1], ['DL', 1],
            ['ADD_LIBRARIES', 2], ['ADD_LIBRARY', 2], ['AL', 2], ['STATUS', 3]];

    VAR
      set_debug_list_pdt_params: [STATIC, READ, cls$pdt_parameters] array [1 .. 3] of
            clt$parameter_descriptor := [

{ DELETE_LIBRARIES DELETE_LIBRARY DL }
      [[clc$optional], 1, clc$max_value_sets, 1, 1, clc$value_range_not_allowed,
            [^set_debug_list_pdt_kv1, clc$file_value]],

{ ADD_LIBRARIES ADD_LIBRARY AL }
      [[clc$optional], 1, clc$max_value_sets, 1, 1, clc$value_range_not_allowed, [NIL, clc$file_value]],

{ STATUS }
      [[clc$optional], 1, 1, 1, 1, clc$value_range_not_allowed,
            [NIL, clc$variable_reference, clc$array_not_allowed, clc$status_value]]];

    VAR
      set_debug_list_pdt_kv1: [STATIC, READ, cls$pdt_names_and_defaults] array [1 .. 1] of
            ost$name := ['ALL'];

?? POP ??

    VAR
      add_count: 0 .. clc$max_value_sets,
      add_libraries: ^pmt$object_library_list,
      delete_count: 0 .. clc$max_value_sets,
      delete_libraries: ^pmt$object_library_list,
      library_index: 1 .. clc$max_value_sets,
      value: clt$value;

    status.normal := TRUE;

    clp$scan_parameter_list (parameter_list, set_debug_list_pdt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    clp$get_set_count ('ADD_LIBRARY', add_count, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    clp$get_set_count ('DELETE_LIBRARY', delete_count, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    IF (add_count + delete_count) = 0 THEN
      osp$set_status_abnormal ('CL', cle$required_parameter_omitted, 'DELETE_LIBRARY or ADD_LIBRARY', status);
      RETURN;
    IFEND;

    IF delete_count > 0 THEN
      PUSH delete_libraries: [1 .. delete_count];
      FOR library_index := 1 TO delete_count DO
        clp$get_value ('DELETE_LIBRARY', library_index, 1, clc$low, value, status);
        IF NOT status.normal THEN
          RETURN;
        IFEND;
        IF value.kind = clc$name_value {AND value.name.value = 'ALL'} THEN
          IF delete_count <> 1 THEN
            osp$set_status_abnormal ('CL', cle$all_must_be_used_alone, 'DELETE_LIBRARY', status);
            RETURN;
          IFEND;
          delete_libraries^ [library_index] := value.name.value;
        ELSE
          delete_libraries^ [library_index] := value.file.local_file_name;
        IFEND;
      FOREND;
    ELSE
      delete_libraries := NIL;
    IFEND;

    IF add_count > 0 THEN
      PUSH add_libraries: [1 .. add_count];
      FOR library_index := 1 TO add_count DO
        clp$get_value ('ADD_LIBRARY', library_index, 1, clc$low, value, status);
        IF NOT status.normal THEN
          RETURN;
        IFEND;
        add_libraries^ [library_index] := value.file.local_file_name;
      FOREND;
    ELSE
      add_libraries := NIL;
    IFEND;

    pmp$change_debug_library_list (delete_libraries, add_libraries, status);

  PROCEND clp$set_debug_list_command;

MODEND clm$debug_commands;
