minix/commands/elle/eekmac.c
2009-11-09 10:26:00 +00:00

179 lines
4.2 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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*/