| 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*/ | 
|---|