xref: /openbsd-src/usr.bin/mg/macro.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
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