home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
rainbow
/
cpm
/
emacs
/
emacssrc.lzh
/
ldelnewl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-11
|
3KB
|
94 lines
#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);
}