283 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International
 | 
						||
 *	This software is quasi-public; it may be used freely with
 | 
						||
 *	like software, but may NOT be sold or made part of licensed
 | 
						||
 *	products without permission of the author.
 | 
						||
 */
 | 
						||
/*
 | 
						||
 * EEF3		Various Functions (Yanking, Indentation, miscellaneous)
 | 
						||
 */
 | 
						||
 | 
						||
#include "elle.h"
 | 
						||
 | 
						||
#if FX_APPNKILL
 | 
						||
/* EFUN: "Append Next Kill" */
 | 
						||
f_appnkill()
 | 
						||
{	this_cmd = KILLCMD;	/* Fake out next call to ed_kill */
 | 
						||
}
 | 
						||
#endif /*FX_APPNKILL*/
 | 
						||
 | 
						||
#if FX_UNKILL
 | 
						||
/* EFUN: "Un-kill" */
 | 
						||
f_unkill()
 | 
						||
{	register SBSTR *sd;
 | 
						||
 | 
						||
	if((sd = kill_ring[kill_ptr]) == 0)
 | 
						||
	  {	ring_bell();
 | 
						||
		return;
 | 
						||
	  }
 | 
						||
	mark_dot = cur_dot;		/* Set mark at old location */
 | 
						||
	mark_p = 1;			/* Mark's been set */
 | 
						||
	sb_sins((SBBUF *)cur_buf,sbs_cpy(sd));	/* Insert copy of stuff */
 | 
						||
	cur_dot = e_dot();		/* We're now after the new stuff */
 | 
						||
	buf_tmat(mark_dot);		/* Say modified from here to cur_dot*/
 | 
						||
	this_cmd = YANKCMD;
 | 
						||
}
 | 
						||
#endif /*FX_UNKILL*/
 | 
						||
 | 
						||
#if FX_UNKPOP
 | 
						||
/* EFUN: "Un-kill Pop" */
 | 
						||
f_unkpop()
 | 
						||
{	register SBSTR *sd;
 | 
						||
	register int i;
 | 
						||
 | 
						||
	if (last_cmd != YANKCMD)
 | 
						||
	  {	ring_bell ();
 | 
						||
		return;
 | 
						||
	  }
 | 
						||
	ed_delete(cur_dot,mark_dot);
 | 
						||
	if(cur_dot > mark_dot)
 | 
						||
		cur_dot = mark_dot;
 | 
						||
	i = KILL_LEN;
 | 
						||
	do {
 | 
						||
		if(--kill_ptr < 0)
 | 
						||
			kill_ptr = KILL_LEN-1;
 | 
						||
		if(sd = kill_ring[kill_ptr])
 | 
						||
			break;
 | 
						||
	  } while(--i);
 | 
						||
 | 
						||
	/* kill_ptr now pointing to right place; effect the yank. */
 | 
						||
	e_gocur();		/* Make sure point at right place too! */
 | 
						||
	return(f_unkill());
 | 
						||
}
 | 
						||
#endif /*FX_UNKPOP*/
 | 
						||
 | 
						||
/* Indentation routines - still not polished */
 | 
						||
 | 
						||
#if FX_INDATM
 | 
						||
/* EFUN: "Indent According to Mode" */
 | 
						||
/*	In Fundamental mode, just inserts a tab.
 | 
						||
*/
 | 
						||
f_indatm()
 | 
						||
{	f_insself(TAB);		/* This takes care of mode checking */
 | 
						||
}
 | 
						||
#endif /*FX_INDATM*/
 | 
						||
 | 
						||
#if FX_INDNL
 | 
						||
/* EFUN: "Indent New Line" */
 | 
						||
f_indnl()			/* execute CR followed by tab */
 | 
						||
{
 | 
						||
#if IMAGEN
 | 
						||
	/* Not dispatch-based, but rather hard-wired to do Gosmacs thing */
 | 
						||
	ed_crins();
 | 
						||
	f_indund();
 | 
						||
#else
 | 
						||
	cmd_xct(CR);
 | 
						||
	cmd_xct(TAB);
 | 
						||
#endif /*-IMAGEN*/
 | 
						||
}
 | 
						||
#endif /*FX_INDNL*/
 | 
						||
 | 
						||
 | 
						||
#if FX_BACKIND
 | 
						||
/* EFUN: "Back to Indentation"
 | 
						||
**	Moves to end of current line's indentation.
 | 
						||
*/
 | 
						||
f_backind()
 | 
						||
{	e_gobol();	/* First move to beg of line */
 | 
						||
	e_gofwsp();	/* Then forward over whitespace */
 | 
						||
	ed_setcur();
 | 
						||
}
 | 
						||
#endif /*FX_BACKIND*/
 | 
						||
 | 
						||
 | 
						||
#if FX_INDCOMM
 | 
						||
 | 
						||
static char *comm_beg = "/* ";
 | 
						||
static char *comm_end = " */";
 | 
						||
 | 
						||
/* EFUN: "Indent for Comment" */
 | 
						||
f_indcomm()
 | 
						||
{
 | 
						||
	f_endline();
 | 
						||
	if(indtion(cur_dot) < ev_ccolumn)
 | 
						||
		ed_indto(ev_ccolumn);
 | 
						||
	else ed_sins("  ");
 | 
						||
	ed_sins (comm_beg);
 | 
						||
	ed_sins (comm_end);
 | 
						||
	e_igoff(-strlen (comm_end));       /* back over end string */
 | 
						||
	e_setcur();
 | 
						||
}
 | 
						||
#endif /*FX_INDCOMM*/
 | 
						||
 | 
						||
#if FX_INDREL
 | 
						||
/* EFUN: "Indent Relative" */
 | 
						||
/* This used to mistakenly be called Indent Under.
 | 
						||
**	Still not fully implemented.
 | 
						||
**	If at beginning of line, looks back at previous indented line,
 | 
						||
** and indents this line that much.  If there is no preceding indented
 | 
						||
** line or not at beginning of line, insert a tab.
 | 
						||
*/
 | 
						||
f_indrel()
 | 
						||
{	register int c;
 | 
						||
	register  n;
 | 
						||
#if IMAGEN
 | 
						||
	chroff savdot;
 | 
						||
#endif /*IMAGEN*/
 | 
						||
#if ICONOGRAPHICS
 | 
						||
        chroff savdot;
 | 
						||
        int curind, newind, morebuf;
 | 
						||
#endif /*ICONOGRAPHICS*/
 | 
						||
 | 
						||
	if((c = e_rgetc()) == EOF)
 | 
						||
#if IMAGEN
 | 
						||
		return(f_insself(TAB));	/* Do mode-based tabbing */
 | 
						||
#else
 | 
						||
		return(ed_insert(TAB));
 | 
						||
#endif /*-IMAGEN*/
 | 
						||
 | 
						||
	if(c == LF)
 | 
						||
	  {	e_gobol();
 | 
						||
		e_gofwsp();
 | 
						||
		n = d_curind();
 | 
						||
		e_gonl();		/* Return to orig pos */
 | 
						||
		if(n)
 | 
						||
		  {	ed_indto(n);
 | 
						||
#if IMAGEN
 | 
						||
			savdot = e_dot();
 | 
						||
			e_gofwsp();
 | 
						||
			ed_delete(savdot, e_dot());
 | 
						||
#endif /*IMAGEN*/
 | 
						||
			return;
 | 
						||
		  }
 | 
						||
	  }
 | 
						||
#if ICONOGRAPHICS
 | 
						||
        else
 | 
						||
          {     e_igoff (1);
 | 
						||
                curind = indtion (savdot = e_dot ());
 | 
						||
                                /* get current dot and indentation */
 | 
						||
                while (1)       /* find a prev line that extends rightward */
 | 
						||
                   {    morebuf = e_gopl ();
 | 
						||
                        e_goeol ();
 | 
						||
                        if ((newind = d_curind()) > curind) break;
 | 
						||
                        if (morebuf == 0)  /* hit beginning of buffer */
 | 
						||
                        {       e_go (savdot);
 | 
						||
                                f_delspc();
 | 
						||
                                return (1);
 | 
						||
                        }
 | 
						||
                   }
 | 
						||
 | 
						||
                e_gobol ();
 | 
						||
                e_igoff (inindex (e_dot (), curind));
 | 
						||
                if (d_curind() > curind)
 | 
						||
                        e_rgetc ();              /* pushed ahead by tab */
 | 
						||
 | 
						||
                while (c_wsp (e_getc ()) == 0) ;
 | 
						||
                e_backc ();
 | 
						||
                e_fwsp ();
 | 
						||
                newind = d_curind();
 | 
						||
                e_go (savdot);
 | 
						||
                f_delspc();
 | 
						||
                ed_indto (newind);
 | 
						||
           }
 | 
						||
#else
 | 
						||
        else e_getc();
 | 
						||
#if IMAGEN
 | 
						||
	f_insself(TAB);			/* Do mode-based tabbing */
 | 
						||
#else
 | 
						||
	ed_insert(TAB);
 | 
						||
#endif /*-IMAGEN*/
 | 
						||
#endif /*-ICONOGRAPHICS*/
 | 
						||
}
 | 
						||
#endif /*FX_INDREL*/
 | 
						||
 | 
						||
 | 
						||
/* Paren matching stuff.  Note that this stuff will be very painful unless
 | 
						||
** tinwait() works properly.
 | 
						||
*/
 | 
						||
#if 0
 | 
						||
/* EFUN: "Self-Insert and Match" (intended to be bound to brackets) */
 | 
						||
/* (KLH: Evidently this was never finished)
 | 
						||
*/
 | 
						||
insertmatch(c)
 | 
						||
register int c;
 | 
						||
{
 | 
						||
	
 | 
						||
}
 | 
						||
#endif
 | 
						||
 | 
						||
/* Should change this to Matching Paren */
 | 
						||
#if FX_MATCHBRACK
 | 
						||
/* EFUN: "Match Bracket" (not EMACS) - from IMAGEN config
 | 
						||
 * Show the matching bracket for the character right before dot
 | 
						||
 */
 | 
						||
f_matchbrack()
 | 
						||
{
 | 
						||
	chroff savdot;
 | 
						||
	register int i, mc, secs;
 | 
						||
 | 
						||
	if (exp_p)
 | 
						||
		secs = exp;
 | 
						||
	else
 | 
						||
		secs = 1;
 | 
						||
	savdot = cur_dot;		/* Save our location */
 | 
						||
	mc = e_rgetc();			/* Pick up character before dot */
 | 
						||
	if (mc != ')' && mc != ']' && mc != '}')
 | 
						||
	  {	e_getc();		/* Nothing, try at dot instead */
 | 
						||
		e_getc();
 | 
						||
		mc = e_rgetc();
 | 
						||
		if (mc != ')' && mc != ']' && mc != '}')
 | 
						||
		  {	ding("What bracket?");
 | 
						||
			e_go(savdot);
 | 
						||
			return;
 | 
						||
		  }
 | 
						||
	  }
 | 
						||
	if (! matchonelevel(mc))
 | 
						||
		ring_bell();
 | 
						||
	else
 | 
						||
	  {	ed_setcur();
 | 
						||
	        if (d_line(cur_dot) < 0)
 | 
						||
			secs = 10;	/* Wait longer if off-screen */
 | 
						||
		redisplay();		/* Wish it were simple upd_wind() */
 | 
						||
	        for (i = 1; i <= secs; ++i)
 | 
						||
		  {	if (tinwait())
 | 
						||
				break;
 | 
						||
			sleep(1);
 | 
						||
	          }
 | 
						||
	  }
 | 
						||
	e_gosetcur(savdot);		/* Back to origin */
 | 
						||
	redp(RD_MOVE);			/* Cursor has moved */
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/* Try to match 'mc', return true iff found it */
 | 
						||
matchonelevel(mc)
 | 
						||
register int mc;
 | 
						||
{
 | 
						||
	register int c;
 | 
						||
 | 
						||
	while ((c = e_rgetc()) != EOF)
 | 
						||
	  {	if (c == /*[*/ ']' || c == /*(*/ ')' || c == /*{*/ '}')
 | 
						||
		  {	if (! matchonelevel(c))
 | 
						||
				break;
 | 
						||
		  }
 | 
						||
		else if (c == '(' /*)*/)
 | 
						||
			return(mc == /*(*/ ')');
 | 
						||
		else if (c == '[' /*]*/)
 | 
						||
			return(mc == /*[*/ ']');
 | 
						||
		else if (c == '{' /*}*/)
 | 
						||
			return(mc == /*{*/ '}');
 | 
						||
	  }
 | 
						||
	return(0);
 | 
						||
}
 | 
						||
#endif /*FX_MATCHBRACK*/
 |