/*
* Keyboard macros
* Copyright
* (C) 1992 Joseph H. Allen
*
* This file is part of JOE (Joe's Own Editor)
*/
/* A macro or macro step */
struct macro {
ptrdiff_t what; /* 1 for kmap, 0 for macro */
int k; /* Keycode */
int flg; /* Flags: bit 0: this step wants the negative arg,
bit 1: ignore return value of this step, but use it as return value of macro */
CMD *cmd; /* Command address */
ptrdiff_t n; /* Number of steps */
ptrdiff_t size; /* Malloc size of steps */
MACRO **steps; /* Block */
};
/* Macro being recorded */
struct recmac {
struct recmac *next; /* Stack of macros: in case user records a macro from within a macro */
int n; /* Keyboard macro number */
MACRO *m; /* Macro being recorded */
};
extern struct recmac *recmac; /* Set when macro is recording: for status line */
/* Macro construction functions */
/* Create a macro
* k is key to feed to command
* flg has flag bits
* n is number of steps (but it does not allocate space for them)
* cmd is command for this step
*/
MACRO *mkmacro(int k, int flg, ptrdiff_t n, CMD *cmd);
/* Append step m to macro */
void addmacro(MACRO *macro, MACRO *m);
/* Recursively duplicate a macro */
MACRO *dupmacro(MACRO *mac);
/* Recursively delete a macro */
void rmmacro(MACRO *macro);
/* Set key part of macro step */
MACRO *macstk(MACRO *m, int k);
/* Set flag part of macro step */
MACRO *macsta(MACRO *m, int a);
/* Stuff Ctrl-C into previous step: used in nungetc() */
void chmac(void);
/* Parse a macro:
m is NULL: start a new macro
m is not NULL: append to existing macro
buf: is text to parse
sta: is filled with offset in buf where parsing stopped or
-1 for error (unknown command)
-2 more input needed (macro ended with , )
secure: if set, only allow commands which begin with "shell_"
*/
MACRO *mparse(MACRO *m, char *buf, ptrdiff_t *sta, int secure);
/* Convert macro to text. Provide a buffer to write to in 's'. */
char *mtext(char *s, MACRO *m);
/* Execute a macro */
extern MACRO *curmacro; /* Current macro being executed */
extern int current_arg; /* Current macro repeat argument */
extern int current_arg_set; /* Set if repeat arg was given */
/* Execute a macro: for user typing.
Records step if we are recording.
K overrides the key for the macro if it is not -1.
*/
int exemac(MACRO *m, int k);
/* Execute a macro as a subroutine
u set to treat as single undo step
k overrides the key for the macro if it is not -1.
*/
int exmacro(MACRO *m, int u, int k);
/* Keyboard macros user interface */
int uplay(W *w, int c); /* Play a keyboard macro */
int ustop(W *w, int c); /* Stop recording */
int urecord(W *w, int c); /* Start recording */
int uquery(W *w, int c); /* Suspend recording/playing for user input */
int umacros(W *w, int c); /* Convert keyboard macros to text and insert them */
int utimer(W *w, int c); /* Execute a macro periodically */
/* Repeat prefix user command */
int uarg(W *w, int k); /* Prompt for repeat argument */
int uuarg(W *w, int c); /* Emacs way of setting repeat argument */
int uif(W *w, int k); /* Prompt for expression, execute following steps if true */
int uelsif(W *w, int k); /* Prompt for expression, execute following steps if true */
int uelse(W *w, int k); /* Execute following steps if last expression was false */
int uendif(W *w, int k); /* End of conditional */
void load_macros(FILE *f); /* Load keyboard macros from .joe_state file */
void save_macros(FILE *f); /* Save keyboard macros in .joe_state file */
/* Append escaped version of character c to string ptr
Used by mtext.
*/
char *unescape(char *ptr,int c);