?? NEWTITLE := 'NAM/VE: Application Layer Data Services' ??
MODULE nlm$al_application_data_service;
?? RIGHT := 110 ??
?? NEWTITLE := '  Global Declarations Referenced by this module' ??
*copyc nlt$al_data_description
?? OLDTITLE ??
?? NEWTITLE := '  [XDCL] nlp$al_fragment_data', EJECT ??

  PROCEDURE [XDCL] nlp$al_fragment_data
    (    fragment_size: nat$data_length;
     VAR data_description {INPUT, OUTPUT} : nlt$al_data_description;
     VAR remaining_data_length: nat$data_length;
     VAR message: nat$data_fragments);

*copy nlh$al_fragment_data

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

    scanned_data_length := 0;
    i := data_description.current_lowerbound;
    j := 1;
    data_fragment_p := ^data_description.fragment [i];
    message_p := ^message [j];

    WHILE (scanned_data_length < fragment_size) DO
      IF ((data_fragment_p^.length > 0) AND (data_fragment_p^.address <> NIL)) THEN
        IF ((scanned_data_length + data_fragment_p^.length) <= fragment_size) THEN
          message_p^ := data_fragment_p^;
          scanned_data_length := scanned_data_length + data_fragment_p^.length;
          data_fragment_p^.length := 0;
          i := i + 1;
          data_fragment_p := ^data_description.fragment [i];
        ELSE { IF ((scanned_data_length + data_description.fragment [i].length) > fragment_size) THEN
          message_p^.address := data_fragment_p^.address;
          message_p^.length := fragment_size - scanned_data_length;
          scanned_data_length := scanned_data_length + message_p^.length;
          data_fragment_p^.address := #ADDRESS (#RING (data_fragment_p^.address),
                #SEGMENT (data_fragment_p^.address), (#OFFSET (data_fragment_p^.address) + message_p^.
                length));
          data_fragment_p^.length := data_fragment_p^.length - message_p^.length;
        IFEND;
        j := j + 1;
        message_p := ^message [j];
      ELSE
        i := i + 1;
        data_fragment_p := ^data_description.fragment [i];
      IFEND;
    WHILEND;

    data_description.current_lowerbound := i;
    data_description.data_length := data_description.data_length - fragment_size;
    remaining_data_length := data_description.data_length;

    FOR i := j TO UPPERBOUND (message) DO
      message [i].address := NIL;
      message [i].length := 0;
    FOREND;

  PROCEND nlp$al_fragment_data;
?? OLDTITLE ??
MODEND nlm$al_application_data_service;
