//
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+// RMAC - Reboot's Macro Assembler for all Atari computers
// MACRO.C - Macro Definition and Invocation
-// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
//
#include "macro.h"
#include "token.h"
-LONG curuniq; // Current macro's unique number
-//TOKEN ** argp; // Free spot in argptrs[]
-int macnum; // Unique number for macro definition
-TOKEN * argPtrs[128]; // 128 arguments ought to be enough for anyone
+LONG curuniq; // Current macro's unique number
+int macnum; // Unique number for macro definition
+TOKEN * argPtrs[128]; // 128 arguments ought to be enough for anyone
static int argp;
-static LONG macuniq; // Unique-per-macro number
-static SYM * curmac; // Macro currently being defined
-//static char ** curmln; // Previous macro line (or NULL)
-static VALUE argno; // Formal argument count
+static LONG macuniq; // Unique-per-macro number
+static SYM * curmac; // Macro currently being defined
+static VALUE argno; // Formal argument count
-static LONG * firstrpt; // First .rept line
-static LONG * nextrpt; // Last .rept line
-static int rptlevel; // .rept nesting level
+static LONG * firstrpt; // First .rept line
+static LONG * nextrpt; // Last .rept line
+static int rptlevel; // .rept nesting level
//
{
macuniq = 0;
macnum = 1;
-// argp = NULL;
argp = 0;
}
//
int ExitMacro(void)
{
-#warning !!! Bad macro exiting !!!
+WARNING(!!! Bad macro exiting !!!)
+
/*
This is a problem. Currently, the argument logic just keeps the current
arguments and doesn't save anything if a new macro is called in the middle
argp -= imacro->im_nargs;
DEBUG printf("%d (nargs = %d)\n", argp, imacro->im_nargs);
- fpop();
- return 0;
+ return fpop();
}
//
int defmac1(char * ln, int notEndFlag)
{
- PTR p;
- LONG len;
+// PTR p;
+// LONG len;
if (list_flag)
{
*curmln = p.cp;
curmln = (char **)p.cp;
- return 1; // Keep looking
+ return 1; // Keep looking
#else
if (curmac->lineList == NULL)
{
switch (kwno)
{
- case 0: // .endr
+ case 0: // .endr
if (--rptlevel == 0)
return(0);
goto addln;
- case 1: // .rept
+ case 1: // .rept
rptlevel++;
default:
//MORE stupidity here...
-#warning "!!! Casting (char *) as LONG !!!"
+WARNING(!!! Casting (char *) as LONG !!!)
addln:
// Allocate length of line + 1('\0') + LONG
len = strlen(ln) + 1 + sizeof(LONG);
*p = 0;
strcpy((char *)(p + 1), ln);
-
+
if (nextrpt == NULL)
{
firstrpt = p; // First line of rept statement
// Hand off lines of text to the function `lnfunc' until a line containing one
// of the directives in `dirlist' is encountered. Return the number of the
// keyword encountered (0..n)
-//
+//
// `dirlist' contains null-seperated terminated keywords. A final null
// terminates the list. Directives are compared to the keywords without regard
// to case.
-//
+//
// If `lnfunc' is NULL, then lines are simply skipped.
// If `lnfunc' returns an error, processing is stopped.
-//
+//
// `lnfunc' is called with an argument of -1 for every line but the last one,
// when it is called with an argument of the keyword number that caused the
// match.
int k;
if (lnfunc != NULL)
- lnsave++; // Tell tokenizer to keep lines
+ lnsave++; // Tell tokenizer to keep lines
for(;;)
{
if (TokenizeLine() == TKEOF)
{
- errors("encountered end-of-file looking for '%s'", dirlist);
+ error("encountered end-of-file looking for '%s'", dirlist);
fatal("cannot continue");
}
if (p != NULL)
{
- if (*p == '.') // ignore leading '.'s
+ if (*p == '.') // ignore leading '.'s
p++;
k = kwmatch(p, dirlist);
// argp = 0;
DEBUG printf("InvokeMacro: argp: %d -> ", argp);
- INOBJ * inobj = a_inobj(SRC_IMACRO); // Alloc and init IMACRO
+ INOBJ * inobj = a_inobj(SRC_IMACRO); // Alloc and init IMACRO
IMACRO * imacro = inobj->inobj.imacro;
imacro->im_siz = siz;
WORD nargs = 0;
TOKEN * dest;
int stringNum = 0;
int argumentNum = 0;
- int i;
for(dry_run=1; ; dry_run--)
{
nargs++;
else
{
-#if 0
+#if 0
*argptr++ = p;
#else
argPtrs[argp++] = p;
// argp += nargs;
#endif
}
- else
+ else
break;
}