?? RIGHT := 110 ??
*copyc osd$default_pragmats
MODULE ram$merge_correctors;
?? PUSH (LISTEXT := ON) ??
*copyc rav$correction_package_header
*copyc rav$elements
*copyc rat$correction_package
*copyc rap$move_correction
?? POP ??

*copyc rah$merge_correctors

  PROCEDURE [XDCL] rap$merge_correctors (add_package: ^SEQ ( * );
        j: rat$element_index;
        add_elements: ^rat$correction_package;
    VAR status: ost$status);

    VAR
      temp: integer,
      found: boolean,
      hi: rat$element_index,
      i: rat$element_index,
      low: rat$element_index,
      mid: rat$element_index;

    status.normal := TRUE;

    hi := rav$correction_package_header ^.number_of_elements;
    low := 1;
    found := FALSE;
    WHILE (low <= hi) AND NOT found DO
      temp := low + hi;
      mid := temp DIV 2;
      IF rav$elements^ [mid].name = add_elements^ [j].name THEN
        found := TRUE;
      ELSEIF rav$elements^ [mid].name > add_elements^ [j].name THEN
        hi := mid - 1;
      ELSE
        low := mid + 1;
      IFEND;
    WHILEND;
    IF found THEN
      rav$elements^ [mid] := add_elements^ [j];
      rap$move_correction (add_package, mid);
    ELSE
      i := rav$correction_package_header^.number_of_elements;
      WHILE (i >= 1) AND NOT found DO
        IF (add_elements^ [j].name < rav$elements^ [i].name) THEN
          rav$elements^ [i + 1] := rav$elements^ [i];
          i := i - 1;
        ELSE
          found := TRUE;
        IFEND;
      WHILEND;
      rav$correction_package_header^.number_of_elements := rav$correction_package_header^.number_of_elements +
            1;
      rav$elements^ [i + 1] := add_elements^ [j];
      rap$move_correction (add_package, i + 1);
    IFEND;
  PROCEND rap$merge_correctors;
MODEND ram$merge_correctors;
