180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* ELLE - Copyright 1982, 1985, 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.
 | ||
|  */
 | ||
| /*	EEKMAC - Keyboard Macro routines
 | ||
|  *		Modelled after the "e_macro.c" for ICONOGRAPHICS
 | ||
|  *		by C. D. Tavares, 9/11/82
 | ||
|  */
 | ||
| 
 | ||
| #include "elle.h"
 | ||
| 
 | ||
| #if FX_SKMAC		/* Entire file is under this conditional! */
 | ||
| 
 | ||
| int kdef_mode;		/* Set when collecting (a "minor mode") */
 | ||
| static int km_flag = 0;	/* 1 = executing, -1 collecting, 0 neither */
 | ||
| static int km_exp;	/* Arg to "Execute Kbd Macro" - # times more to xct */
 | ||
| static struct buffer *km_buf;
 | ||
| 
 | ||
| /* EFUN: "Start Kbd Macro" */
 | ||
| 
 | ||
| f_skmac()
 | ||
| {	register struct buffer *b;
 | ||
| 	struct buffer *make_buf();
 | ||
| 
 | ||
| 	if(km_flag)
 | ||
| 	  {	ding("Kbd macro active, ignoring \"Start Kbd Macro\"");
 | ||
| 		return;
 | ||
| 	  }
 | ||
| 	if((b = km_buf) == 0)
 | ||
| 		b = km_buf = make_buf(" *KBDMAC*");
 | ||
| 	ex_reset(b);
 | ||
| 	km_flag = -1;		/* Say starting macro collection */
 | ||
| 	kdef_mode = 1;
 | ||
| 	redp(RD_MODE);
 | ||
| }
 | ||
| 
 | ||
| /* EFUN: "End Kbd Macro" */
 | ||
| 
 | ||
| f_ekmac()
 | ||
| {
 | ||
| 	if(km_flag > 0 && (--km_exp >= 0))
 | ||
| 	  {	ex_go((SBBUF *)km_buf, (chroff)0);
 | ||
| 	  }
 | ||
| 	else if(km_flag)
 | ||
| 	  {	km_flag = 0;
 | ||
| 		kdef_mode = 0;	/* Flush minor mode */
 | ||
| 		redp(RD_MODE);
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* EFUN: "Execute Kbd Macro" */
 | ||
| 
 | ||
| f_xkmac()
 | ||
| {
 | ||
| 	if(km_flag)
 | ||
| 		ding("Already in kbd macro!");
 | ||
| 	else if(km_buf == 0)
 | ||
| 		ding("No kbd macro defined");
 | ||
| 	else if((km_exp = exp-1) >= 0)
 | ||
| 	  {
 | ||
| 		ex_go((SBBUF *)km_buf, (chroff) 0);
 | ||
| 		km_flag = 1;		/* Start macro execution */
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* EFUN: "View Kbd Macro" */
 | ||
| 
 | ||
| f_vkmac()
 | ||
| {	register struct buffer *b, *savbuf;
 | ||
| 	chroff prmplen;
 | ||
| 
 | ||
| 	if(!(b = km_buf))
 | ||
| 	  {	ding("No kbd macro defined");
 | ||
| 		return;
 | ||
| 	  }
 | ||
| 	savbuf = cur_buf;
 | ||
| 	chg_buf(b);
 | ||
| 	e_gobob();
 | ||
| 	e_sputz("Current Kbd macro:\n\n");
 | ||
| 	prmplen = e_dot();
 | ||
| 	mk_showin(b);		/* Show the macro buffer temporarily */
 | ||
| 	e_gobob();
 | ||
|         chg_buf(savbuf);
 | ||
| 	sb_deln((SBBUF *)b, prmplen);	/* Flush the prompt */
 | ||
| }
 | ||
| 
 | ||
| /* KM_GETC - return next command char from kbd macro being executed.
 | ||
| **	This is < 0 if not executing kbd macro.  Also responsible for
 | ||
| **	gathering input for kbd macro.
 | ||
| */
 | ||
| km_getc()
 | ||
| {	register int c;
 | ||
| 
 | ||
| 	while (km_flag > 0)		/* Executing macro? */
 | ||
| 	  {	c = sb_getc(((SBBUF *)km_buf));	/* Yes, get char */
 | ||
| 		if(c != EOF)
 | ||
| 			return(c);		/* and return as cmd */
 | ||
| 
 | ||
| 		if(--km_exp >= 0)		/* Macro done.  Repeat? */
 | ||
| 			ex_go((SBBUF *)km_buf, (chroff)0);	/* Yes */
 | ||
| 		else km_flag = 0;		/* No, stop execution */
 | ||
| 	  }
 | ||
| 	c = tgetc();			/* Get char from user (TTY) */
 | ||
| 	if(km_flag < 0)			/* Save it if collecting macro */
 | ||
| 	  {	sb_putc(((SBBUF *)km_buf), c);
 | ||
| 	  }
 | ||
| 	return(c);
 | ||
| }
 | ||
| 
 | ||
| /* KM_INWAIT() - Return TRUE if any keyboard-macro input waiting.
 | ||
|  */
 | ||
| km_inwait()
 | ||
| {	register int c;
 | ||
| 	if(km_flag > 0)
 | ||
| 		if((c = sb_getc(((SBBUF *)km_buf))) != EOF || (km_exp > 0))
 | ||
| 		  {	sb_backc(((SBBUF *)km_buf));
 | ||
| 			return(1);
 | ||
| 		  }
 | ||
| 	return(0);
 | ||
| }
 | ||
| 
 | ||
| km_abort ()
 | ||
| {
 | ||
| 	if(km_flag > 0)		/* Executing? */
 | ||
| 		km_flag = 0;	/* Stop */
 | ||
| 	else if(km_flag < 0)	/* Collecting? */
 | ||
| 		f_ekmac();	/* Close it out */
 | ||
| }
 | ||
| 
 | ||
| #endif /*FX_SKMAC*/
 | ||
| 
 | ||
| #if 0	/* Old unused stuff */
 | ||
| static char mode_buf [60];
 | ||
| 
 | ||
| add_mode (mode)
 | ||
|   char *mode;
 | ||
|   {
 | ||
|         register char *cur, *c, *m;
 | ||
| 
 | ||
|         if (cur_mode != mode_buf)
 | ||
|            {
 | ||
|             strcpy (mode_buf, cur_mode);
 | ||
|             cur_mode = mode_buf;
 | ||
|            }
 | ||
| 
 | ||
|         if (cur_mode [0]) strcat (cur_mode, ", ");
 | ||
|         strcat (cur_mode, mode);
 | ||
|         make_mode ();
 | ||
|   }
 | ||
| 
 | ||
| remove_mode (mode)
 | ||
|   char *mode;
 | ||
|   {
 | ||
|         register char *cur, *c, *m;
 | ||
| 
 | ||
|         if (*cur_mode == 0) return;
 | ||
| 
 | ||
|         if (cur_mode != mode_buf)
 | ||
|            {
 | ||
|             strcpy (mode_buf, cur_mode);
 | ||
|             cur_mode = mode_buf;
 | ||
|            }
 | ||
| 
 | ||
|         for (cur = cur_mode ; *cur ; cur++)
 | ||
|             if (*cur == *mode)          /* 1st char matches */
 | ||
|                {
 | ||
|                 for (c = cur, m = mode ; *m && (*m == *c) ; m++, c++) ;
 | ||
|                 if (!(*m))              /* ok, mode matched */
 | ||
|                    {                    /* kill leading ", " */
 | ||
|                     if (*(cur - 1) == ' ') --cur;
 | ||
|                     if (*(cur - 1) == ',') --cur;
 | ||
|                     for ( ; *cur = *c ; cur++, c++) ;   /* recopy to end */
 | ||
|                     make_mode ();
 | ||
|                     return;
 | ||
|                    }
 | ||
|                }
 | ||
|   }
 | ||
| #endif /*COMMENT*/
 | 
