/*
* 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 );