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 >
C/C++ Source or Header  |  1992-03-11  |  3KB  |  94 lines

  1. #include    "stdio.h"
  2. #include    "ed.h"
  3.  
  4. /*
  5.  * Delete a newline. Join the current line
  6.  * with the next line. If the next line is the magic
  7.  * header line always return TRUE; merging the last line
  8.  * with the header line can be thought of as always being a
  9.  * successful operation, even if nothing is done, and this makes
  10.  * the kill buffer work "right". Easy cases can be done by
  11.  * shuffling data around. Hard cases require that lines be moved
  12.  * about in memory. Return FALSE on error and TRUE if all
  13.  * looks ok. Called by "ldelete" only.
  14.  */
  15. ldelnewline()
  16. {
  17.     register WINDOW    *wp;    /* appears 29 times. */
  18.     register LINE    *myline;    /* appears 25 times. */
  19. /*    register LINE    *nextline; */
  20. /*    register LINE    *lp3; */
  21. #define nextline (*(LINE **)0x9c)
  22. #define lp3 (*(LINE **)0x9e)
  23. #define mysize (*(int *)0xa0)
  24.  
  25.     mysize = ( myline = curwp->w_dotp )->l_used;
  26.  
  27.     if ( ( nextline = myline->l_fp ) == curbp->b_linep )
  28.     {    /* At the buffer end.    */
  29.         if ( ! mysize )    /* Blank line. */
  30.             lfree( myline );
  31. rettrue:    return ( 1 );
  32.     }
  33. #ifdef NEVER
  34. To save space, we will ALWAYS allocate a new line
  35. which will contain both myline and nextline.
  36. .    if ( nextline->l_used <= myline->l_size - mysize )
  37. .    {    /* nextline fits in myline. */
  38. .        blockmv( &myline->l_text[mysize],
  39. .            &nextline->l_text[0], nextline->l_used );
  40. .        wp = wheadp;
  41. .        while (wp != NULL)
  42. .        {    if (wp->w_linep == nextline)
  43. .                wp->w_linep = myline;
  44. .            if (wp->w_dotp == nextline)
  45. .            {    wp->w_doto += 
  46. .                    ( wp->w_dotp  = myline )->
  47. .                        l_used;
  48. .            }
  49. .            if (wp->w_markp == nextline)
  50. .            {    wp->w_marko += ( wp->w_markp  = myline )->
  51. .                    l_used;
  52. .            }
  53. .            wp = wp->w_wndp;
  54. .        }        
  55. .        mysize += nextline->l_used;
  56. .        (myline->l_fp = nextline->l_fp)->l_bp = myline;
  57. .        free((char *) nextline);
  58. .        return (TRUE);
  59. .    }
  60. #endif
  61.     if ( ( lp3 = lalloc( mysize + nextline->l_used )) == NULL )
  62.         return (FALSE);
  63.     blockmv( &lp3->l_text[0], &myline->l_text[0], mysize );
  64.     blockmv( &lp3->l_text[mysize], 
  65.         &nextline->l_text[0], nextline->l_used );
  66.  
  67.     myline->l_bp->l_fp = nextline->l_fp->l_bp = lp3;
  68.     lp3->l_fp = nextline->l_fp;
  69.     lp3->l_bp = myline->l_bp;
  70.  
  71.     wp = wheadp;
  72.     while (wp != NULL)
  73.     {    if ( wp->w_linep == myline || wp->w_linep == nextline )
  74.             wp->w_linep = lp3;
  75.  
  76.         if (wp->w_dotp == myline) goto xyz2;
  77.         if ( wp->w_dotp == nextline )
  78.         {    wp->w_doto += mysize;
  79. xyz2:            wp->w_dotp  = lp3;
  80.         }
  81.  
  82.         if (wp->w_markp == myline) goto xyz3;
  83.         if (wp->w_markp == nextline)
  84.         {    wp->w_marko += mysize;
  85. xyz3:            wp->w_markp  = lp3;
  86.         }
  87.  
  88.         wp = wp->w_wndp;
  89.     }
  90.     free((char *) myline);
  91.     free((char *) nextline);
  92.     return (TRUE);
  93. }
  94.