?? RIGHT := 110 ??
MODULE ram$remove_correction;
*copyc osd$default_pragmats
?? PUSH (LISTEXT := ON) ??
*copyc rac$status_id
*copyc rae$error_messages
*copyc rav$elements
*copyc rav$correction_package_header
*copyc rat$correction_package
*copyc clp$scan_parameter_list
*copyc clp$get_set_count
*copyc clp$get_value
*copyc osp$set_status_abnormal
*copyc rap$issue_message
*copyc rap$get_corrector_element
*copyc rap$get_elements_by_product
*copyc rap$get_elements_by_class
?? POP ??

{  pdt rem_pdt (
{    element, elements, e: list of name
{    product, products, p: list of name
{    status)

?? PUSH (LISTEXT := ON) ??

  VAR
    rem_pdt: [STATIC, READ, cls$pdt] clt$parameter_descriptor_table := [^rem_pdt_names, ^rem_pdt_params];

  VAR
    rem_pdt_names: [STATIC, READ, cls$pdt_names_and_defaults] array [1 .. 7] of clt$parameter_name_descriptor
      := [['ELEMENT', 1], ['ELEMENTS', 1], ['E', 1], ['PRODUCT', 2], ['PRODUCTS', 2], ['P', 2], ['STATUS',
      3]];

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

{ ELEMENT ELEMENTS E }
    [[clc$optional], 1, clc$max_value_sets, 1, 1, clc$value_range_not_allowed, [NIL, clc$name_value, 1,
      osc$max_name_size]],

{ PRODUCT PRODUCTS P }
    [[clc$optional], 1, clc$max_value_sets, 1, 1, clc$value_range_not_allowed, [NIL, clc$name_value, 1,
      osc$max_name_size]],

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

?? POP ??
*copyc rah$remove_correction

  PROCEDURE [XDCL] rap$remove_correction (parameter_list: clt$parameter_list;
    VAR status: ost$status);

    VAR
      element_list: ^array [1 .. * ] of ost$name,
      i: rat$element_index,
      j: rat$element_index,
      k: rat$element_index,
      l: rat$element_index,
      message_status: ost$status,
      number: 0 .. clc$max_value_sets,
      output_lfn: [STATIC] amt$local_file_name := '$OUTPUT',
      value: clt$value;

    status.normal := TRUE;

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

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

  /remove_elements/
    FOR i := 1 TO number DO
      clp$get_value ('ELEMENT', i, 1, clc$low, value, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      IF value.name.value = 'OS' THEN
        rap$get_elements_by_class (rac$os, element_list, status);
        IF NOT status.normal THEN
          RETURN;
        IFEND;
        IF element_list <> NIL THEN

        /remove_os/
          FOR j := 1 TO UPPERBOUND (element_list^) DO
            rap$get_corrector_element (element_list^ [j], k, status);
            IF NOT status.normal THEN
              IF status.condition = rae$element_not_found THEN
                osp$set_status_abnormal (rac$status_id, rae$no_correction, element_list^ [j], message_status);
                rap$issue_message (output_lfn, message_status, status);
                IF NOT status.normal THEN
                  RETURN;
                IFEND;
                CYCLE /remove_os/;
              ELSE
                RETURN;
              IFEND;
            IFEND;

            FOR l := k + 1 TO rav$correction_package_header^.number_of_elements DO
              rav$elements^ [l - 1] := rav$elements^ [l];
            FOREND;

            IF k <> 0 THEN
              rav$correction_package_header^.number_of_elements := rav$correction_package_header^.
                    number_of_elements - 1;
            IFEND;
          FOREND /remove_os/;
          FREE element_list;
        IFEND;
      ELSE
        rap$get_corrector_element (value.name.value, k, status);
        IF NOT status.normal THEN
          IF status.condition = rae$element_not_found THEN
            osp$set_status_abnormal (rac$status_id, rae$no_correction, value.name.value, message_status);
            rap$issue_message (output_lfn, message_status, status);
            IF NOT status.normal THEN
              RETURN;
            IFEND;
            CYCLE /remove_elements/;
          ELSE
            RETURN;
          IFEND;
        IFEND;

        FOR j := k + 1 TO rav$correction_package_header^.number_of_elements DO
          rav$elements^ [j - 1] := rav$elements^ [j];
        FOREND;

        IF k <> 0 THEN
          rav$correction_package_header^.number_of_elements := rav$correction_package_header^.
                number_of_elements - 1;
        IFEND;
      IFEND;
    FOREND /remove_elements/;

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

    FOR i := 1 TO number DO
      clp$get_value ('PRODUCT', i, 1, clc$low, value, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      rap$get_elements_by_product (value.name.value, element_list, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      IF element_list <> NIL THEN

      /remove_product/
        FOR j := 1 TO UPPERBOUND (element_list^) DO
          rap$get_corrector_element (element_list^ [j], k, status);
          IF NOT status.normal THEN
            IF status.condition = rae$element_not_found THEN
              osp$set_status_abnormal (rac$status_id, rae$no_correction, element_list^ [j], message_status);
              rap$issue_message (output_lfn, message_status, status);
              IF NOT status.normal THEN
                RETURN;
              IFEND;
              CYCLE /remove_product/;
            ELSE
              RETURN;
            IFEND;
          IFEND;

          FOR l := k + 1 TO rav$correction_package_header^.number_of_elements DO
            rav$elements^ [l - 1] := rav$elements^ [l];
          FOREND;

          IF k <> 0 THEN
            rav$correction_package_header^.number_of_elements := rav$correction_package_header^.
                  number_of_elements - 1;
          IFEND;
        FOREND /remove_product/;
        FREE element_list;
      IFEND;
    FOREND;
  PROCEND rap$remove_correction;
MODEND ram$remove_correction;
