Changeset View
Changeset View
Standalone View
Standalone View
contrib/mg/macro.c
- This file was added.
| /* $OpenBSD: macro.c,v 1.16 2015/03/19 21:22:15 bcallah Exp $ */ | |||||
| /* This file is in the public domain. */ | |||||
| /* | |||||
| * Keyboard macros. | |||||
| */ | |||||
| #include <sys/queue.h> | |||||
| #include <signal.h> | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| #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)) { | |||||
| dobeep(); | |||||
| 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); | |||||
| } | |||||