?? RIGHT := 110 ??
*copyc osd$default_pragmats
MODULE ram$isolate_file_differences;
?? PUSH (LISTEXT := ON) ??
*copyc rae$error_messages
*copyc oct$fill_sequence
*copyc rat$open_file_list
*copyc rat$correction_package
*copyc amp$open
*copyc amp$get_segment_pointer
*copyc amp$close
*copyc osp$set_status_abnormal
?? POP ??

*copyc rah$isolate_file_differences

  PROCEDURE [XDCL] rap$isolate_file_differences (old_file_name: amt$local_file_name;
        new_file_name: amt$local_file_name;
    VAR corrector: ^SEQ ( * );
    VAR size: rat$corrector_size;
    VAR status: ost$status);

    VAR
      access_sel: amt$file_access_selections,
      correction: ^SEQ ( * ),
      i: integer,
      found: boolean,
      match: boolean,
      new_fid: amt$file_identifier,
      new_proc: amt$segment_pointer,
      new_proc_fill: ^oct$fill_sequence,
      new_size: integer,
      old_fid: amt$file_identifier,
      old_proc: amt$segment_pointer,
      old_proc_fill: ^oct$fill_sequence,
      old_size: integer,
      rav$open_file_list: [STATIC, XREF] rat$open_file_list;

    status.normal := TRUE;

    PUSH access_sel: [1 .. 1];
    access_sel^ [1].key := amc$access_mode;
    access_sel^ [1].access_mode := $pft$usage_selections [pfc$read];

    amp$open (old_file_name, amc$segment, access_sel, old_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    found := FALSE;
    i := 1;
    WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
      IF rav$open_file_list [i].name = old_file_name THEN
        rav$open_file_list [i].identifier := old_fid;
        rav$open_file_list [i].opened := TRUE;
        found := TRUE;
      IFEND;
      i := i + 1;
    WHILEND;

    IF NOT found THEN
      i := 1;
      WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
        IF rav$open_file_list [i].name = osc$null_name THEN
          rav$open_file_list [i].name := old_file_name;
          rav$open_file_list [i].identifier := old_fid;
          rav$open_file_list [i].opened := TRUE;
          found := TRUE;
        IFEND;
        i := i + 1;
      WHILEND;
    IFEND;
    IF NOT found THEN
      osp$set_status_abnormal ('RA', rae$open_file_list_full, '', status);
      RETURN;
    IFEND;

    amp$get_segment_pointer (old_fid, amc$sequence_pointer, old_proc, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    amp$open (new_file_name, amc$segment, access_sel, new_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    found := FALSE;
    i := 1;
    WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
      IF rav$open_file_list [i].name = new_file_name THEN
        rav$open_file_list [i].identifier := new_fid;
        rav$open_file_list [i].opened := TRUE;
        found := TRUE;
      IFEND;
      i := i + 1;
    WHILEND;

    IF NOT found THEN
      i := 1;
      WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
        IF rav$open_file_list [i].name = osc$null_name THEN
          rav$open_file_list [i].name := new_file_name;
          rav$open_file_list [i].identifier := new_fid;
          rav$open_file_list [i].opened := TRUE;
          found := TRUE;
        IFEND;
        i := i + 1;
      WHILEND;
    IFEND;
    IF NOT found THEN
      osp$set_status_abnormal ('RA', rae$open_file_list_full, '', status);
      RETURN;
    IFEND;

    amp$get_segment_pointer (new_fid, amc$sequence_pointer, new_proc, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    old_size := #SIZE (old_proc.sequence_pointer^);
    new_size := #SIZE (new_proc.sequence_pointer^);

    match := FALSE;

    IF old_size = new_size THEN
      RESET old_proc.sequence_pointer;
      RESET new_proc.sequence_pointer;
      NEXT old_proc_fill: [1 .. old_size] IN old_proc.sequence_pointer;
      NEXT new_proc_fill: [1 .. new_size] IN new_proc.sequence_pointer;
      match := TRUE;

    /compare_procs/
      FOR i := 1 TO old_size DO
        IF (old_proc_fill^ [i] <> new_proc_fill^ [i]) THEN
          match := FALSE;
          EXIT /compare_procs/
        IFEND;
      FOREND /compare_procs/;
    IFEND;

    IF match THEN
      size := 0;
    ELSE
      RESET corrector;
      NEXT correction: [[REP new_size OF cell]] IN corrector;
      correction^ := new_proc.sequence_pointer^;
      size := new_size;
    IFEND;

    amp$close (old_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    found := FALSE;
    i := 1;
    WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
      IF rav$open_file_list [i].name = old_file_name THEN
        rav$open_file_list [i].opened := FALSE;
        found := TRUE;
      IFEND;
      i := i + 1;
    WHILEND;

    amp$close (new_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    found := FALSE;
    i := 1;
    WHILE (i <= UPPERBOUND (rav$open_file_list)) AND NOT found DO
      IF rav$open_file_list [i].name = new_file_name THEN
        rav$open_file_list [i].opened := FALSE;
        found := TRUE;
      IFEND;
      i := i + 1;
    WHILEND;
  PROCEND rap$isolate_file_differences;
MODEND ram$isolate_file_differences;
