#include "stdio.h" #include "ed.h" /* * Insert a newline into the buffer * at the current location of dot in the current * window. The funny ass-backwards way it does things * is not a botch; it just makes the last line in * the file not a special case. Return TRUE if everything * works out and FALSE on error (memory allocation * failure). The update of dot and mark is a bit * easier then in the above case, because the split * forces more updating. */ lnewline() { register WINDOW *wp; register LINE *lp1; #define lp2 (*(LINE **)0x90) #define doto (*(int *)0x92) /* register LINE *lp2; */ /* register int doto; */ lchange( WFHARD ); wp = curwp; lp1 = wp->w_dotp; /* Get the address and */ doto = wp->w_doto; /* offset of "." */ if ( ( lp2 = lalloc( doto )) == NULL ) /* New first half line */ return (FALSE); blockmv( &lp2->l_text[0], &lp1->l_text[0], doto ); blockmv( &lp1->l_text[ 0 ], &lp1->l_text[ doto ], lp1->l_used - doto ); lp1->l_used -= doto; lp2->l_bp = lp1->l_bp; lp1->l_bp = lp2->l_bp->l_fp = lp2; lp2->l_fp = lp1; wp = wheadp; /* Windows */ while (wp != NULL) { if (wp->w_linep == lp1) wp->w_linep = lp2; if (wp->w_dotp == lp1) { if (wp->w_doto < doto) wp->w_dotp = lp2; else wp->w_doto -= doto; } if (wp->w_markp == lp1) { if (wp->w_marko < doto) wp->w_markp = lp2; else wp->w_marko -= doto; } wp = wp->w_wndp; } return (TRUE); }  .