1 /* $OpenBSD: macro.c,v 1.5 2001/05/24 03:05:24 mickey Exp $ */ 2 3 /* 4 * Keyboard macros. 5 */ 6 7 #ifndef NO_MACRO 8 #include "def.h" 9 #include "key.h" 10 #define EXTERN 11 #define INIT(i) = (i) 12 #include "macro.h" 13 14 /* ARGSUSED */ 15 int 16 definemacro(f, n) 17 int f, n; 18 { 19 LINE *lp1, *lp2; 20 21 macrocount = 0; 22 23 if (macrodef) { 24 ewprintf("already defining macro"); 25 return macrodef = FALSE; 26 } 27 28 /* free lines allocated for string arguments */ 29 if (maclhead != NULL) { 30 for (lp1 = maclhead->l_fp; lp1 != maclhead; lp1 = lp2) { 31 lp2 = lp1->l_fp; 32 free((char *)lp1); 33 } 34 free((char *)lp1); 35 } 36 37 if ((maclhead = lp1 = lalloc(0)) == NULL) 38 return FALSE; 39 40 ewprintf("Defining Keyboard Macro..."); 41 maclcur = lp1->l_fp = lp1->l_bp = lp1; 42 return macrodef = TRUE; 43 } 44 45 /* ARGSUSED */ 46 int 47 finishmacro(f, n) 48 int f, n; 49 { 50 macrodef = FALSE; 51 ewprintf("End Keyboard Macro Definition"); 52 return TRUE; 53 } 54 55 /* ARGSUSED */ 56 int 57 executemacro(f, n) 58 int f, n; 59 { 60 int i, j, flag, num; 61 PF funct; 62 63 if (macrodef || 64 (macrocount >= MAXMACRO && macro[MAXMACRO].m_funct != finishmacro)) 65 return FALSE; 66 67 if (macrocount == 0) 68 return TRUE; 69 70 inmacro = TRUE; 71 72 for (i = n; i > 0; i--) { 73 maclcur = maclhead->l_fp; 74 flag = 0; 75 num = 1; 76 for (j = 0; j < macrocount - 1; j++) { 77 funct = macro[j].m_funct; 78 if (funct == universal_argument) { 79 flag = FFARG; 80 num = macro[++j].m_count; 81 continue; 82 } 83 if ((*funct)(flag, num) != TRUE) { 84 inmacro = FALSE; 85 return FALSE; 86 } 87 lastflag = thisflag; 88 thisflag = 0; 89 flag = 0; 90 num = 1; 91 } 92 } 93 inmacro = FALSE; 94 return TRUE; 95 } 96 #endif /* NO_MACRO */ 97