123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % VS-SUPPORT.SL - "Fast" routines to support the "virtual-screen" package.
- %
- % Author: Alan Snyder
- % Hewlett-Packard/CRC
- % Date: 6 August 1982
- %
- % This revised version takes advantage of TerminalClearEOL.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- (BothTimes (load fast-vector))
- (de RewriteChangedCharacters (oldline newline RowLocation LeftCol RightCol)
- % A rather specialized routine to look for characters that differ between
- % oldline and newline, and to write those out to the screen. The search is
- % limited to run from LeftCol to RightCol. RowLocation is simply passed on
- % to WritePhysicalCharacter.
- (prog (last-nonblank-column)
- % Check to see whether a Clear-EOL is appropriate. It is appropriate if
- % the rightmost changed character has been changed to a BLANK, and the
- % remainder of the line is blank. If this is the case, we determine the
- % column to clear from, clear out the old line, and (after outputting prior
- % changed characters), do the Clear-EOL.
- % Find out where the rightmost changed character actually is:
- (while (and (WLEQ LeftCol RightCol)
- (WEQ (igets newline RightCol) (igets oldline RightCol)))
- (setf RightCol (WDifference RightCol 1))
- )
- (if (WGreaterP LeftCol RightCol) (return NIL)) % No change at all!
- % If the rightmost changed character is being changed to a space, then find
- % out if the rest of the line is blank. If it is, then set the variable
- % LAST-NONBLANK-COLUMN to the appropriate value and clear out OLDLINE in
- % preparation for a later ClearEOL. Otherwise, LAST-NONBLANK-COLUMN
- % remains NIL.
- (if (WEQ (igets newline RightCol) (char space))
- (progn
- (setf last-nonblank-column (size newline))
- (while (and (WGEQ last-nonblank-column 0)
- (WEQ (igets newline last-nonblank-column) (char space))
- )
- (setf last-nonblank-column (WDifference last-nonblank-column 1))
- )
- (if (WLessP last-nonblank-column RightCol)
- (while (> RightCol last-nonblank-column)
- (iputs oldline RightCol (char space))
- (setf RightCol (WDifference RightCol 1))
- )
- )))
- % Output all changed characters (other than those that will be taken care
- % of by ClearEOL):
- (while (WLEQ LeftCol RightCol)
- (let ((ch (igets newline LeftCol)))
- (if (WNEQ ch (igets oldline LeftCol))
- (WritePhysicalCharacter ch RowLocation LeftCol)
- ))
- (setf LeftCol (wplus2 LeftCol 1))
- )
- % Do the ClearEOL, if that's what we decided to do.
- (if last-nonblank-column
- (progn
- (MoveToPhysicalLocation RowLocation (WPlus2 last-nonblank-column 1))
- (TerminalClearEOL)
- ))
- ))
|