X-Git-Url: https://pd.if.org/git/?p=pd_readline;a=blobdiff_plain;f=mg%2Fmacro.c;fp=mg%2Fmacro.c;h=191047830179dbcc64b15c4994c5354adcf6cc4d;hp=0000000000000000000000000000000000000000;hb=a9843085ec916c175bd245a8398f30e6cc03f984;hpb=26fe4e09c6c3c250334fdeed60ce3061febecde2 diff --git a/mg/macro.c b/mg/macro.c new file mode 100644 index 0000000..1910478 --- /dev/null +++ b/mg/macro.c @@ -0,0 +1,106 @@ +/* $OpenBSD: macro.c,v 1.14 2012/04/12 04:47:59 lum Exp $ */ + +/* This file is in the public domain. */ + +/* + * Keyboard macros. + */ + +#include "def.h" +#include "key.h" +#include "macro.h" + +int inmacro = FALSE; /* Macro playback in progess */ +int macrodef = FALSE; /* Macro recording in progress */ +int macrocount = 0; + +struct line *maclhead = NULL; +struct line *maclcur; + +union macrodef macro[MAXMACRO]; + +/* ARGSUSED */ +int +definemacro(int f, int n) +{ + struct line *lp1, *lp2; + + macrocount = 0; + + if (macrodef) { + ewprintf("already defining macro"); + return (macrodef = FALSE); + } + + /* free lines allocated for string arguments */ + if (maclhead != NULL) { + for (lp1 = maclhead->l_fp; lp1 != maclhead; lp1 = lp2) { + lp2 = lp1->l_fp; + free(lp1); + } + free(lp1); + } + + if ((maclhead = lp1 = lalloc(0)) == NULL) + return (FALSE); + + ewprintf("Defining Keyboard Macro..."); + maclcur = lp1->l_fp = lp1->l_bp = lp1; + return (macrodef = TRUE); +} + +/* ARGSUSED */ +int +finishmacro(int f, int n) +{ + if (macrodef == TRUE) { + macrodef = FALSE; + ewprintf("End Keyboard Macro Definition"); + return (TRUE); + } + return (FALSE); +} + +/* ARGSUSED */ +int +executemacro(int f, int n) +{ + int i, j, flag, num; + PF funct; + + if (macrodef || + (macrocount >= MAXMACRO && macro[MAXMACRO - 1].m_funct + != finishmacro)) { + ewprintf("Macro too long. Aborting."); + return (FALSE); + } + + if (macrocount == 0) + return (TRUE); + + inmacro = TRUE; + + for (i = n; i > 0; i--) { + maclcur = maclhead->l_fp; + flag = 0; + num = 1; + for (j = 0; j < macrocount - 1; j++) { + funct = macro[j].m_funct; + if (funct == universal_argument) { + flag = FFARG; + num = macro[++j].m_count; + continue; + } + if ((*funct)(flag, num) != TRUE) { + inmacro = FALSE; + return (FALSE); + } + lastflag = thisflag; + thisflag = 0; + flag = 0; + num = 1; + } + } + inmacro = FALSE; + return (TRUE); +}