home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
wp_dtp
/
xdme1820.lha
/
XDME
/
macros.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-08
|
7KB
|
274 lines
/******************************************************************************
MODUL
lowlevelmacros.c
DESCRIPTION
die schnittstelle zu den wichtigsten Macro-funktionen,
die von anderen Moduln verwendet werden duerfen.
NOTES
dies ist nur ein Dummy - Modul, das zwar alle
Funktionen exportiert, die beschrieben wurden,
ihre Realisierung ist jedoch stark eingeschraenkt,
sie sind auf einfache Strings zurueckgeschraubt,
so dass die sie verwendenden Moduln wie vorher
angesprochen werden koennen.
BUGS
TODO
bei Gelegenheit sollte dieses Modul komplett neu geschrieben werden
und mit alias.c und main.c neu abgestimmt werden
(so dass main.c callmacro verwendet neque vero do_command)
EXAMPLES
SEE ALSO
INDEX
HISTORY
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
/**************************************
Globale Variable
**************************************/
Prototype char * GetArg (int);
Prototype char * CommandName (void);
Prototype void start_recording (void);
Prototype void end_recording (void);
Prototype void replay_record (void);
Prototype void do_saverecord (void);
Prototype void add_record (char * string);
/**************************************
Interne Defines & Strukturen
**************************************/
/**************************************
Interne Variable
**************************************/
static char tempmacro_buffer[LINE_LENGTH];
/**************************************
Interne Prototypes
**************************************/
/***********************************************
***********************************************
Dies ist lediglich eine Uebergangsloesung,
solange wir alias.c und main.c noch nicht
umgeschrieben haben
***********************************************
***********************************************/
char * CommandName (void)
{
return (av[0]);
} /* CommandName */
char * GetArg (int num)
{
return(av[num]);
} /* GetArg */
/*
** MACRO RECORDER
** we can record one input - sequence and replay it
**
** there are 3 functions:
**
** recording
** int Start_recording (void)
** int add_record (char * string)
** int end_recording (void)
**
** playing
** int replay_record (void)
**
** saving
** int save_record (FILE * fo)
** (can be sourced)
**
*/
static struct MinList record = { NULL, NULL, NULL }; /* list to contain the macros */
static short record_replaying = 0; /* security to avoid endless loops */
struct LongNode {
struct MinNode node;
char com[0];
};
__autoinit
void init_recorder (void)
{
if (record.mlh_Head == NULL) {
NewList ((struct List *)&record);
return;
} /* if */
} /* init_recorder */
__autoexit
void clear_record (void)
{
struct LongNode * ln;
while (ln = (struct LongNode *)RemHead ((struct List *)&record)) {
FreeMem (ln, sizeof (struct MinNode) + 1 + strlen (ln->com));
} /* while */
} /* clear_record */
void start_recording (void)
{
if (!record_replaying) {
if (MacroRecord == 0) {
clear_record();
} /* if */
MacroRecord ++;
} else {
error ("%s:\nYou can NOT start recording,\nwhile You are replaying a record", av[0]);
} /* if */
} /* start_recording */
void end_recording (void)
{
if (MacroRecord) {
MacroRecord --;
{
char ab = globalflags.Abortcommand;
error ("recorder ended!");
globalflags.Abortcommand = ab;
}
# ifdef NOT_DEF
/* strenggenommen muessten wir zuallererstden recorderend aus dem letzten string herausfiltern */
/* was aber, wenn der nicht als command sondern als macro kam ??? */
if (MacroRecord == ~0) {
struct LongNode * ln;
if (ln = (struct LongNode *)RemTail ((struct List *)&record)) {
strcpy (tmp_buffer, ln->com);
} /* if */
} /* if */
# endif
/* } else if (!record_replaying) { */
/* error ("%s:\nYou can NOT end recording,\nif You are NOT recording", av[0]); */
} /* if */
} /* end_recording */
void add_record (char * string)
{
if (!record_replaying) {
struct LongNode * ln;
if (ln = AllocMem (sizeof (struct MinNode) + 1 + strlen (string), MEMF_ANY)) {
strcpy (ln->com, string);
AddTail ((struct List *)&record, (struct Node *)ln);
} else {
nomemory (); /* do NOT abort - we have to execute commands, too */
} /* if */
if (breakcheck()) { /* that way we might have a sure record-terminator - the CTL-C signal */
end_recording ();
} /* if */
} /* if */
} /* add_record */
void replay_record (void)
{
if (!record_replaying) {
if (GetHead (&record)) {
char * buffer;
/* We use a run-time allocated buffer */
if (!(buffer = AllocMem (LINE_LENGTH, MEMF_ANY))) {
nomemory (); /* error() NEEDS memory for itself */
globalflags.Abortcommand = 1;
return;
} else {
struct LongNode * ln;
for (ln = GetHead (&record); ln; ln = GetSucc (ln)) {
strncpy (buffer, ln->com, LINE_LENGTH-1);
do_command (buffer);
/* You can NOT terminate Your record by errors */
clearbreaks ();
/* You can break Your record by pressing Ctrl-C */
if (breakcheck ()) {
globalflags.Abortcommand = 1;
break;
} /* if */
} /* for */
FreeMem (buffer, LINE_LENGTH);
} /* if alloced */
} /* if */
} else {
error ("%s:\nYou can NOT start replaying a record,\nwhile You are already replaying it", av[0]);
} /* if not already replaying */
} /* replay_record */
void save_record (FILE * fo)
{
if (fo) {
struct LongNode * ln;
for (ln = GetHead (&record); ln; ln = GetSucc (ln)) {
sprintf (tmp_buffer, "%s\n", ln->com);
if (fputs (tmp_buffer, fo) < 0) {
error ("%s:\nError while writing the\ncurrent record!", av[0]);
break;
} /* if */
} /* for */
} /* if */
} /* save_record */
void do_saverecord (void)
{
FILE * fo;
if (!GetHead (&record)) {
error ("%s:\nCan not save a record,\n if there is NO record!", av[0]);
} else {
if (fo = fopen (av[1], "w")) {
save_record (fo);
fclose (fo);
} else {
error ("%s:\n Can not open File\n'%s' for output", av[0], av[1]);
} /* if */
} /* if */
} /* do_saverecord */
/******************************************************************************
***** ENDE macros.c
******************************************************************************/