#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);
}

