180 lines
4.2 KiB
C
180 lines
4.2 KiB
C
|
/* 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*/
|