home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
telecomm
/
uemlsrc
/
macros.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-08-24
|
9KB
|
303 lines
/* macros.c routines to bind keyboard macros to individual keys */
#include <stdio.h>
#include "ed.h"
#define FLEN 14
static FILE *mp; /* file pointer for LOAD and SAVE */
static char macfile[NFILEN+1] = "uemail.mcr";
static short macstr[NKBDM];
typedef struct MACTAB {
struct MACTAB *m_fmac; /* next MACTAB */
short *keymac; /* pointer to the macro */
char key; /* the key */
} MACTAB;
MACTAB *mheadp = NULL; /* pointer to header structure */
/* GETMACRO eXtended command to store a macro in the table above.
* Copies the current keyboard macro to the appropriate array.
* Bound to ^X-`.
*/
getmacro(f, n)
int f,n;
{
register int c,i;
short *maccpy();
register MACTAB *mt;
MACTAB *mcralloc();
/* is there currently a macro being defined ? */
if (kbdmip != NULL || kbdmop != NULL) {
mlwrite("Not now");
return (FALSE);
}
mlwrite("Key to bind to current macro: ");
c = ttgetc();
ttputc(c);
if((mt=mcralloc(TRUE,c))==NULL)
return(FALSE);
i = maclen(kbdm);
mt->key = c; /* install the key */
if ((mt->keymac=(short *)malloc((i+1)*sizeof(short)))==NULL)
{
mlwrite("Cannot allocate space for macro");
return(FALSE);
}
maccpy(mt->keymac,kbdm); /* copy the macro */
return(TRUE);
}
/* PUTMACRO AGRAVE command finds macro associated with key returned
* by ttgetc and executes the macro.
*/
putmacro(f, n)
register int f, n;
{
register int c;
short *maccpy();
register MACTAB *mt;
MACTAB *mcralloc();
c = ttgetc(); /* get next char */
switch(c)
{
case 0x07: /* abort */
return(ctrlg(FALSE,0));
case 0x0c: /* load a macro file */
return(loadmac(TRUE));
case 0x0d: /* "make" a macro file */
return(savemac());
case 0x12: /* incremental search back */
return(backisearch(f, n));
case 0x13: /* incremental search forward */
return(forwisearch(f, n));
case 0x14: /* get time */
return(showtime(f,n));
case '`':
return(linsert(1,c));
}
if (kbdmip!=NULL || kbdmop!=NULL)
{
mlwrite("Not now");
return (FALSE);
}
/* actually, there should be no way mheadp could != NULL and
* its forward pointer == NULL, but it's best to check
*/
if (mheadp==NULL || mheadp->m_fmac == NULL)
{
mlwrite("No defineable macros assigned");
return(FALSE);
}
if((mt=mcralloc(FALSE,c))!= (MACTAB *)NULL)
{
/* save current macro to restore later */
maccpy(macstr,kbdm);
maccpy(kbdm,mt->keymac);
c=ctlxe(f, n); /* execute mac in keybrd.c */
maccpy(kbdm,macstr);
return(c);
}
(*term.t_beep)();
return(FALSE);
}
/* LOADMAC load a macro file and install the macros into memory.
* Bound to `^L.
*/
loadmac(f)
int f;
{
short *maccpy();
register int c,i;
register short s;
register MACTAB *mt;
MACTAB *mcralloc();
if (f==TRUE) /* FALSE == Called from main */
{
if(readpattern("Load macros: ",macfile)==ABORT)
return(ABORT);
}
else
strcpy(macfile,"uemail.mcr");
if (macfile[0] == '~')
parsefn(macfile);
if ((mp=fopen(macfile,"r"))==NULL)
{
mlwrite("Cannot open %s",macfile);
return(FALSE);
}
if ((s=getw(mp))!=(CTLX|'('))
{
mlwrite("Macro file format error: %s",macfile);
fclose(mp);
return(FALSE);
}
while((c=fgetc(mp))!=EOF)
{
i=0;
mlwrite("[Installing macro for key %c]",c);
if((mt=mcralloc(TRUE,c))==NULL)
{
fclose(mp);
return(FALSE);
}
while ((s=getw(mp))!=(CTLX|')'))
{
if (feof(mp))
{
mlwrite("Read error on: %s",macfile);
break;
}
macstr[i++]=s;
}
macstr[i] = CTLX|')';
mt->key = c; /* install the key */
if ((mt->keymac=(short *)malloc((i+1)*sizeof(short)))==NULL)
{
fclose(mp);
mlwrite("Cannot allocate space for macro");
return(FALSE);
}
maccpy(mt->keymac,macstr); /* copy the macro */
}
fclose(mp);
return(TRUE);
}
/* SAVEMAC function to save current keyboard macros to a file.
* Bound to `^M (makemac).
*/
savemac()
{
short *maccpy();
register int i;
register short s;
register MACTAB *mt;
if(readpattern("Save macros: ",macfile)==ABORT)
return(ABORT);
if (macfile[0] == '~')
parsefn(macfile);
if ((mp=fopen(macfile,"w"))==NULL)
{
mlwrite("Cannot open %s",macfile);
return(FALSE);
}
/* actually, there should be no way mheadp could != NULL and
* its forward pointer == NULL, but it's best to check
*/
if (mheadp==NULL || mheadp->m_fmac == NULL)
{
mlwrite("No defineable macros assigned");
return(FALSE);
}
/* don't change the file format or the load function
* will fail
*/
mt=mheadp->m_fmac;
putw(CTLX|'(',mp);
while(mt != NULL)
{
i=0;
mlwrite("[Saving key: %c]",mt->key);
maccpy(macstr,mt->keymac);
fputc(mt->key,mp);
while(macstr[i]!=(CTLX|')'))
putw(macstr[i++],mp);
putw(CTLX|')',mp);
mt=mt->m_fmac; /* next pointer */
}
fclose(mp);
return(TRUE);
}
/* find an existing keyboard macro or get space for a new one. Return
* a pointer to the MACTAB structure so others can do with it what they
* will.
*/
MACTAB *
mcralloc(f,c)
register int f,c;
{
register MACTAB *mt;
if (mheadp == NULL)
{
if ((mheadp=(MACTAB *)malloc(sizeof(MACTAB))) == NULL)
{
mlwrite("Cannot allocate %d bytes",sizeof(MACTAB));
return(FALSE);
}
mheadp->m_fmac = (MACTAB *)NULL;
}
/* check to see if this one has already been allocated */
mt=mheadp;
while(mt->m_fmac != (MACTAB *)NULL)
{
if (mt->m_fmac->key == c)
{
if (f == TRUE) /* reallocate old */
free(mt->m_fmac->keymac);
return(mt->m_fmac);
}
mt=mt->m_fmac; /* next pointer */
}
/* this was a get request. return if no macro found */
if (f==FALSE)
return(FALSE);
/* otherwise must be a new request */
if ((mt->m_fmac=(MACTAB *)malloc(sizeof(MACTAB)))==NULL)
{
mlwrite("Cannot allocate %d bytes",sizeof(MACTAB));
return(FALSE);
}
mt->m_fmac->m_fmac = (MACTAB *)NULL; /* new pointer */
return(mt->m_fmac);
}
/* PUTLIN function to service putmacro() also used by enumerate and showtime */
putlin(lin)
register char *lin;
{
while(*lin)
linsert(1,*lin++);
}
/* get actual length of macro to allocate spacr */
maclen(mac)
register short *mac;
{
register int i;
i = 1;
while(*mac++ != (CTLX|')'))
++i;
return(i);
}
/* similar to strcpy but copies one keyboard macro to another returning
* the address of the destination string.
*/
short *
maccpy(dest, sour)
register short *dest;
register short *sour;
{
register short *dptr;
register short s;
dptr = dest;
while ((s = *sour++) != (CTLX|')'))
*dest++ = s;
*dest = CTLX|')';
return(dptr);
}