]> pd.if.org Git - pd_readline/blobdiff - mg/macro.c
Added mg from an OpenBSD mirror site. Many thanks to the OpenBSD team and the mg...
[pd_readline] / mg / macro.c
diff --git a/mg/macro.c b/mg/macro.c
new file mode 100644 (file)
index 0000000..1910478
--- /dev/null
@@ -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);
+}