#include "stdio.h" #include "ed.h" /* * This function deletes "n" bytes, * starting at dot. It understands how do deal * with end of lines, etc. It returns TRUE if all * of the characters were deleted, and FALSE if * they were not (because dot ran into the end of * the buffer. The "kflag" is TRUE if the text * should be put in the kill buffer. */ ldelete(n, kflag) { register WINDOW *wp; #define dotp (*(LINE **)0x90) register char *cp1; #define cp3 (*(char **)0x9a) #define cp2 (*(char**)0x92) #define doto (*(int *)0x94) #define chunk (*(int *)0x96) #define left (*(int *)0x98) #define localn (*(int *)0xa2) localn = n; while ( localn > 0 ) { if ( curbp->b_linep == ( dotp = curwp->w_dotp ) ) return ( 0 ); /* Hit end of buffer. */ doto = curwp->w_doto; if ( localn < ( chunk = left = dotp->l_used - doto ) ) chunk = localn; if ( chunk == 0 ) /* End of line, merge. */ { lchange(WFHARD); if ( ldelnewline() == FALSE || ( kflag != FALSE && kinsert('\n') == FALSE )) return (FALSE); --localn; continue; } lchange(WFEDIT); cp2 = ( cp3 = cp1 = &dotp->l_text[doto] ) + chunk; if (kflag != FALSE) /* Kill? */ { while ( cp1 != cp2 ) { if (kinsert( *cp1++ ) == FALSE) return (FALSE); } } blockmv( cp3, cp2, left - chunk ); dotp->l_used -= chunk; wp = wheadp; /* Fix windows */ while (wp != NULL) { if ( wp->w_dotp == dotp && wp->w_doto >= doto ) { wp->w_doto -= chunk; if (wp->w_doto < doto) wp->w_doto = doto; } if ( wp->w_markp == dotp && wp->w_marko >= doto ) { wp->w_marko -= chunk; if (wp->w_marko < doto) wp->w_marko = doto; } wp = wp->w_wndp; } localn -= chunk; } return (TRUE); }  .