*COMDECK PBDLTXT
_$J+? 
_*****************************
*                            *
*        PBDLTXT             *
*  DELETE TEXT IN BUFFERS    *
*                            *
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBDLTXT DELETES TEXT IN DATA BUFFERS BY ADVANCING THE      *
*           FCD.  ADVANCING TEXT ACROSS BUFFER BOUNDARIES IS           *
*           ALLOWED.  PBDLTXT WILL NOT ADVANCE BEYOND THE END OF       *
*           TEXT.  DELETION STOPS WHEN END OF TEXT IS REACHED.         *
*           THE GLOBAL BOOLEAN VARIABLE D0DONE RETURNS TRUE IF         *
*           DELETION BEYOND END OF TEXT IS ATTEMPTED; FALSE OTHER-     *
*           WISE.  IF DELETION ACROSS BUFFER BOUNDARIES OCCURS,        *
*           THE FCD OF THE CHAINED BUFFER IS RESTORED FROM THE         *
*           GLOBAL VARIABLE D0SFCD.                                    *
*                                                                      *
**INPUT- BUFFER ADDRESS, RELEASE IF BUFFER BOUNDARY CROSSED FLAG       *
*        AND THE NUMBER OF CHARACTERS TO DELETE.                       *
*                                                                      *
**OUTPUT- CHARACTERS DELETED, BUFFER ADDRESS UPDATED IF NECESSARY.     *
*         THE FCD IN THE RETURNED BUFFER POINTS PAST THE LAST          *
*         CHARACTER DELETED.                                           *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBREL1BF         RELEASE A BUFFER                    *
*                                                                      *
***********************************************************************?
PROCEDURE PBDLTXT(VAR BFR : B0BUFPTR;       _BUFFER ADDRESS            ?
                      RLS : BOOLEAN;        _RELEASE BFR FLAG          ?
                      INCR: INTEGER);       _NO. CHARS TO DELETE       ?
VAR PREV, 
    NEXT : B0BUFPTR;
BEGIN 
  D0DONE := FALSE;                          _CHECK END-OF-TEXT FLAG    ?
  10: 
  WITH BFR' DO
  IF BFFCD+INCR > BFLCD THEN                _CHECK FOR BFR BOUNDARY    ?
  BEGIN 
    NEXT := BCCHAIN[DBUFLENGTH];            _CHAIN TO NEXT BUFFER      ?
    IF NIL = NEXT THEN                      _CHECK FOR END-OF-TEXT     ?
    BEGIN 
      BFFCD := BFLCD;                       _SET FCD TO END-OF-TEXT    ?
      D0DONE := TRUE;                       _SET END-OF-TEXT FLAG      ?
    END 
    ELSE
    BEGIN 
      PREV := BFR;                          _SAVE BFR FOR RELEASE      ?
      BFR  := NEXT;                         _GET NEXT BFR IN CHAIN     ?
      INCR := INCR-(BFLCD-BFFCD);           _DECREMENT DELETE COUNT    ?
      BFFCD := D0SFCD;                      _RESTORE FCD               ?
      D0SFCD := BFR'.BFFCD;                 _SAVE FCD OF NEXT BFR      ?
      IF RLS                                _RELEASE PREVIOUS IF ASKED ?
      THEN PBREL1BF (PREV,BEDBSIZE);        _RELEASE THE BUFFER        ?
      GOTO 10;
    END;
  END 
  ELSE BFFCD := BFFCD+INCR;                 _ADVANCE FCD               ?
END; _PBDLTXT?
