
  PROCEDURE [INLINE] nlp$sk_fragment_data
    (    fragment_size: nat$data_length;
         current_lowerbound: nat$data_fragment_count;
     VAR data: nat$data_fragments;
     VAR new_lowerbound: nat$data_fragment_count;
     VAR fragment: nat$data_fragments);

?? PUSH (LISTEXT := ON) ??
?? RIGHT := 110 ??

    VAR
      data_p: ^nat$data_fragment,
      i: integer,
      j: integer,
      scanned_data_length: nat$data_length;

    scanned_data_length := 0;
    i := current_lowerbound;
    j := 1;
    WHILE (scanned_data_length < fragment_size) DO
      data_p := ^data [i];
      IF ((data_p^.length > 0) AND (data_p^.address <> NIL)) THEN
        IF ((scanned_data_length + data_p^.length) <= fragment_size) THEN
          fragment [j] := data_p^;
          scanned_data_length := scanned_data_length + data_p^.length;
          data_p^.length := 0;
          j := j + 1;
          i := i + 1;
        ELSE { IF ((scanned_data_length + data_p^ .length) > fragment_size)
          {THEN
          fragment [j].address := data_p^.address;
          fragment [j].length := fragment_size - scanned_data_length;
          scanned_data_length := scanned_data_length + fragment [j].length;
          data_p^.address := #ADDRESS (#RING (data_p^.address), #SEGMENT (data_p^.address),
                (#OFFSET (data_p^.address) + fragment [j].length));
          data_p^.length := data_p^.length - fragment [j].length;
          j := j + 1;
        IFEND;
      ELSE
        i := i + 1;
      IFEND;
    WHILEND;
    new_lowerbound := i;
    FOR i := j TO UPPERBOUND (fragment) DO
      fragment [i].address := NIL;
      fragment [i].length := 0;
    FOREND;
  PROCEND nlp$sk_fragment_data;

*copy nlh$sk_fragment_data

*copyc nat$data_fragments
*copyc nat$data_length
?? POP ??
