/*****************************************************************************

	ExeL()

	This function executes an L command.

*****************************************************************************/

#include "ZPort.h"		/* define portability identifiers */
#include "DefTeco.h"		/* define general identifiers */

extern	DEFAULT	GetNmA();	/* get numeric argument */
extern	LONG	Ln2Chr();	/* convert line offset to character offset */
extern	VOID	UMinus();	/* handle unary minus */

EXTERN	BYTE	CmdMod;		/* command modifiers flags for @, :, etc. */
EXTERN	WORD	EStBot;		/* expression stack bottom */
EXTERN	WORD	EStTop;		/* expression stack top */
EXTERN	char	*GapBeg;	/* beginning of edit buffer gap */
EXTERN	char	*GapEnd;	/* end of edit buffer gap */
EXTERN	LONG	NArgmt;		/* numeric argument */


DEFAULT ExeL()			/* execute L command */
{
	LOCAL	LONG	HowFar;

#if DEBUGGING
DbgInd+=2;if(DbgLvl>=1){DbgMsg();DbgDBf("ExeL: called.\015\012");DbgROf();}
#endif
	if (EStTop == EStBot)			/* if no numeric argument */
		NArgmt = 1L;			/* default is 1L */
	else
		{
		UMinus();			/* if it's -L, make it -1L */
		if (GetNmA() == FAILURE)	/* get numeric argument */
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeL: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
			return(FAILURE);
#if DEBUGGING
}
#endif
		}

	HowFar = Ln2Chr(NArgmt);
	if (HowFar > 0L)
		{
		ZCpyBl(HowFar, GapEnd+1L, GapBeg);
		GapBeg += HowFar;
		GapEnd += HowFar;
		}
	else if (HowFar < 0L)
		{
		GapBeg += HowFar;
		GapEnd += HowFar;
		ZCpyBl(-HowFar, GapBeg, GapEnd+1L);
		}

	CmdMod = '\0';
	return(SUCCESS);
}
