1 | /* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International
|
---|
2 | * This software is quasi-public; it may be used freely with
|
---|
3 | * like software, but may NOT be sold or made part of licensed
|
---|
4 | * products without permission of the author.
|
---|
5 | */
|
---|
6 | /* EEKMAC - Keyboard Macro routines
|
---|
7 | * Modelled after the "e_macro.c" for ICONOGRAPHICS
|
---|
8 | * by C. D. Tavares, 9/11/82
|
---|
9 | */
|
---|
10 |
|
---|
11 | #include "elle.h"
|
---|
12 |
|
---|
13 | #if FX_SKMAC /* Entire file is under this conditional! */
|
---|
14 |
|
---|
15 | int kdef_mode; /* Set when collecting (a "minor mode") */
|
---|
16 | static int km_flag = 0; /* 1 = executing, -1 collecting, 0 neither */
|
---|
17 | static int km_exp; /* Arg to "Execute Kbd Macro" - # times more to xct */
|
---|
18 | static struct buffer *km_buf;
|
---|
19 |
|
---|
20 | /* EFUN: "Start Kbd Macro" */
|
---|
21 |
|
---|
22 | f_skmac()
|
---|
23 | { register struct buffer *b;
|
---|
24 | struct buffer *make_buf();
|
---|
25 |
|
---|
26 | if(km_flag)
|
---|
27 | { ding("Kbd macro active, ignoring \"Start Kbd Macro\"");
|
---|
28 | return;
|
---|
29 | }
|
---|
30 | if((b = km_buf) == 0)
|
---|
31 | b = km_buf = make_buf(" *KBDMAC*");
|
---|
32 | ex_reset(b);
|
---|
33 | km_flag = -1; /* Say starting macro collection */
|
---|
34 | kdef_mode = 1;
|
---|
35 | redp(RD_MODE);
|
---|
36 | }
|
---|
37 |
|
---|
38 | /* EFUN: "End Kbd Macro" */
|
---|
39 |
|
---|
40 | f_ekmac()
|
---|
41 | {
|
---|
42 | if(km_flag > 0 && (--km_exp >= 0))
|
---|
43 | { ex_go((SBBUF *)km_buf, (chroff)0);
|
---|
44 | }
|
---|
45 | else if(km_flag)
|
---|
46 | { km_flag = 0;
|
---|
47 | kdef_mode = 0; /* Flush minor mode */
|
---|
48 | redp(RD_MODE);
|
---|
49 | }
|
---|
50 | }
|
---|
51 |
|
---|
52 | /* EFUN: "Execute Kbd Macro" */
|
---|
53 |
|
---|
54 | f_xkmac()
|
---|
55 | {
|
---|
56 | if(km_flag)
|
---|
57 | ding("Already in kbd macro!");
|
---|
58 | else if(km_buf == 0)
|
---|
59 | ding("No kbd macro defined");
|
---|
60 | else if((km_exp = exp-1) >= 0)
|
---|
61 | {
|
---|
62 | ex_go((SBBUF *)km_buf, (chroff) 0);
|
---|
63 | km_flag = 1; /* Start macro execution */
|
---|
64 | }
|
---|
65 | }
|
---|
66 |
|
---|
67 | /* EFUN: "View Kbd Macro" */
|
---|
68 |
|
---|
69 | f_vkmac()
|
---|
70 | { register struct buffer *b, *savbuf;
|
---|
71 | chroff prmplen;
|
---|
72 |
|
---|
73 | if(!(b = km_buf))
|
---|
74 | { ding("No kbd macro defined");
|
---|
75 | return;
|
---|
76 | }
|
---|
77 | savbuf = cur_buf;
|
---|
78 | chg_buf(b);
|
---|
79 | e_gobob();
|
---|
80 | e_sputz("Current Kbd macro:\n\n");
|
---|
81 | prmplen = e_dot();
|
---|
82 | mk_showin(b); /* Show the macro buffer temporarily */
|
---|
83 | e_gobob();
|
---|
84 | chg_buf(savbuf);
|
---|
85 | sb_deln((SBBUF *)b, prmplen); /* Flush the prompt */
|
---|
86 | }
|
---|
87 | |
---|
88 |
|
---|
89 | /* KM_GETC - return next command char from kbd macro being executed.
|
---|
90 | ** This is < 0 if not executing kbd macro. Also responsible for
|
---|
91 | ** gathering input for kbd macro.
|
---|
92 | */
|
---|
93 | km_getc()
|
---|
94 | { register int c;
|
---|
95 |
|
---|
96 | while (km_flag > 0) /* Executing macro? */
|
---|
97 | { c = sb_getc(((SBBUF *)km_buf)); /* Yes, get char */
|
---|
98 | if(c != EOF)
|
---|
99 | return(c); /* and return as cmd */
|
---|
100 |
|
---|
101 | if(--km_exp >= 0) /* Macro done. Repeat? */
|
---|
102 | ex_go((SBBUF *)km_buf, (chroff)0); /* Yes */
|
---|
103 | else km_flag = 0; /* No, stop execution */
|
---|
104 | }
|
---|
105 | c = tgetc(); /* Get char from user (TTY) */
|
---|
106 | if(km_flag < 0) /* Save it if collecting macro */
|
---|
107 | { sb_putc(((SBBUF *)km_buf), c);
|
---|
108 | }
|
---|
109 | return(c);
|
---|
110 | }
|
---|
111 |
|
---|
112 | /* KM_INWAIT() - Return TRUE if any keyboard-macro input waiting.
|
---|
113 | */
|
---|
114 | km_inwait()
|
---|
115 | { register int c;
|
---|
116 | if(km_flag > 0)
|
---|
117 | if((c = sb_getc(((SBBUF *)km_buf))) != EOF || (km_exp > 0))
|
---|
118 | { sb_backc(((SBBUF *)km_buf));
|
---|
119 | return(1);
|
---|
120 | }
|
---|
121 | return(0);
|
---|
122 | }
|
---|
123 |
|
---|
124 | km_abort ()
|
---|
125 | {
|
---|
126 | if(km_flag > 0) /* Executing? */
|
---|
127 | km_flag = 0; /* Stop */
|
---|
128 | else if(km_flag < 0) /* Collecting? */
|
---|
129 | f_ekmac(); /* Close it out */
|
---|
130 | }
|
---|
131 |
|
---|
132 | #endif /*FX_SKMAC*/
|
---|
133 | |
---|
134 |
|
---|
135 | #if 0 /* Old unused stuff */
|
---|
136 | static char mode_buf [60];
|
---|
137 |
|
---|
138 | add_mode (mode)
|
---|
139 | char *mode;
|
---|
140 | {
|
---|
141 | register char *cur, *c, *m;
|
---|
142 |
|
---|
143 | if (cur_mode != mode_buf)
|
---|
144 | {
|
---|
145 | strcpy (mode_buf, cur_mode);
|
---|
146 | cur_mode = mode_buf;
|
---|
147 | }
|
---|
148 |
|
---|
149 | if (cur_mode [0]) strcat (cur_mode, ", ");
|
---|
150 | strcat (cur_mode, mode);
|
---|
151 | make_mode ();
|
---|
152 | }
|
---|
153 |
|
---|
154 | remove_mode (mode)
|
---|
155 | char *mode;
|
---|
156 | {
|
---|
157 | register char *cur, *c, *m;
|
---|
158 |
|
---|
159 | if (*cur_mode == 0) return;
|
---|
160 |
|
---|
161 | if (cur_mode != mode_buf)
|
---|
162 | {
|
---|
163 | strcpy (mode_buf, cur_mode);
|
---|
164 | cur_mode = mode_buf;
|
---|
165 | }
|
---|
166 |
|
---|
167 | for (cur = cur_mode ; *cur ; cur++)
|
---|
168 | if (*cur == *mode) /* 1st char matches */
|
---|
169 | {
|
---|
170 | for (c = cur, m = mode ; *m && (*m == *c) ; m++, c++) ;
|
---|
171 | if (!(*m)) /* ok, mode matched */
|
---|
172 | { /* kill leading ", " */
|
---|
173 | if (*(cur - 1) == ' ') --cur;
|
---|
174 | if (*(cur - 1) == ',') --cur;
|
---|
175 | for ( ; *cur = *c ; cur++, c++) ; /* recopy to end */
|
---|
176 | make_mode ();
|
---|
177 | return;
|
---|
178 | }
|
---|
179 | }
|
---|
180 | }
|
---|
181 | #endif /*COMMENT*/
|
---|