#include "stdio.h" #include "ed.h" /* * Delete a newline. Join the current line * with the next line. If the next line is the magic * header line always return TRUE; merging the last line * with the header line can be thought of as always being a * successful operation, even if nothing is done, and this makes * the kill buffer work "right". Easy cases can be done by * shuffling data around. Hard cases require that lines be moved * about in memory. Return FALSE on error and TRUE if all * looks ok. Called by "ldelete" only. */ ldelnewline() { register WINDOW *wp; /* appears 29 times. */ register LINE *myline; /* appears 25 times. */ /* register LINE *nextline; */ /* register LINE *lp3; */ #define nextline (*(LINE **)0x9c) #define lp3 (*(LINE **)0x9e) #define mysize (*(int *)0xa0) mysize = ( myline = curwp->w_dotp )->l_used; if ( ( nextline = myline->l_fp ) == curbp->b_linep ) { /* At the buffer end. */ if ( ! mysize ) /* Blank line. */ lfree( myline ); rettrue: return ( 1 ); } #ifdef NEVER To save space, we will ALWAYS allocate a new line which will contain both myline and nextline. . if ( nextline->l_used <= myline->l_size - mysize ) . { /* nextline fits in myline. */ . blockmv( &myline->l_text[mysize], . &nextline->l_text[0], nextline->l_used ); . wp = wheadp; . while (wp != NULL) . { if (wp->w_linep == nextline) . wp->w_linep = myline; . if (wp->w_dotp == nextline) . { wp->w_doto += . ( wp->w_dotp = myline )-> . l_used; . } . if (wp->w_markp == nextline) . { wp->w_marko += ( wp->w_markp = myline )-> . l_used; . } . wp = wp->w_wndp; . } . mysize += nextline->l_used; . (myline->l_fp = nextline->l_fp)->l_bp = myline; . free((char *) nextline); . return (TRUE); . } #endif if ( ( lp3 = lalloc( mysize + nextline->l_used )) == NULL ) return (FALSE); blockmv( &lp3->l_text[0], &myline->l_text[0], mysize ); blockmv( &lp3->l_text[mysize], &nextline->l_text[0], nextline->l_used ); myline->l_bp->l_fp = nextline->l_fp->l_bp = lp3; lp3->l_fp = nextline->l_fp; lp3->l_bp = myline->l_bp; wp = wheadp; while (wp != NULL) { if ( wp->w_linep == myline || wp->w_linep == nextline ) wp->w_linep = lp3; if (wp->w_dotp == myline) goto xyz2; if ( wp->w_dotp == nextline ) { wp->w_doto += mysize; xyz2: wp->w_dotp = lp3; } if (wp->w_markp == myline) goto xyz3; if (wp->w_markp == nextline) { wp->w_marko += mysize; xyz3: wp->w_markp = lp3; } wp = wp->w_wndp; } free((char *) myline); free((char *) nextline); return (TRUE); }  .