Added repeat support. Added short vs long expansion

This commit is contained in:
paul moore
2023-12-03 11:59:05 -08:00
parent 116f678180
commit 617eb0e065
4 changed files with 55 additions and 11 deletions

View File

@@ -75,8 +75,8 @@ static int HT_Compare (const void* Key1, const void* Key2);
** than zero if Key1 is greater then Key2. ** than zero if Key1 is greater then Key2.
*/ */
static StrBuf MakeLineFromTokens (TokNode* first);
static char* GetTokenString (Token* T); static char* GetTokenString (Token* T);
/* decompile a token back to a string */
/*****************************************************************************/ /*****************************************************************************/
/* Data */ /* Data */
@@ -135,6 +135,7 @@ struct MacExp {
TokNode* ParamExp; /* Node for expanding parameters */ TokNode* ParamExp; /* Node for expanding parameters */
LineInfo* LI; /* Line info for the expansion */ LineInfo* LI; /* Line info for the expansion */
LineInfo* ParamLI; /* Line info for parameter expansion */ LineInfo* ParamLI; /* Line info for parameter expansion */
unsigned ExpandStart; /* First pass through expansion ?*/
}; };
/* Maximum number of nested macro expansions */ /* Maximum number of nested macro expansions */
@@ -314,6 +315,7 @@ static MacExp* NewMacExp (Macro* M)
E->ParamExp = 0; E->ParamExp = 0;
E->LI = 0; E->LI = 0;
E->ParamLI = 0; E->ParamLI = 0;
E->ExpandStart = 1; /* set up detection of first call */
/* Mark the macro as expanding */ /* Mark the macro as expanding */
++M->Expansions; ++M->Expansions;
@@ -703,9 +705,24 @@ ExpandParam:
TokSet (Mac->Exp); TokSet (Mac->Exp);
if (ExpandMacros) { if (ExpandMacros) {
if (new_expand_line) { if (new_expand_line) {
StrBuf mac_line = MakeLineFromTokens (Mac->Exp); /* Suppress unneeded lines if short expansion
** the ExpandStart is used to ensure that
** the invokation line itself isnt suppress
** This is becuase we are always working a line behind
** Lines we want to keep are upvoted so that this downvote
** will not suppress them
*/
if (LineLast->FragList == 0 && ExpandMacros == 1 && !Mac->ExpandStart) {
LineCur->Output--;
}
Mac->ExpandStart = 0;
StrBuf mac_line = MakeLineFromTokens (Mac->Exp);
NewListingLine (&mac_line, 0, 0); NewListingLine (&mac_line, 0, 0);
InitListingLine (); InitListingLine ();
if (CurTok.Tok == TOK_SEGMENT) {
/* upvote the lines to keep*/
LineCur->Output = 2;
}
SB_Done (&mac_line); SB_Done (&mac_line);
new_expand_line = 0; new_expand_line = 0;
} }
@@ -809,6 +826,7 @@ MacEnd:
PopInput (); PopInput ();
/* No token available */ /* No token available */
new_expand_line = 1;
return 0; return 0;
} }
@@ -1080,8 +1098,7 @@ void EnableDefineStyleMacros (void)
PRECONDITION (DisableDefines > 0); PRECONDITION (DisableDefines > 0);
--DisableDefines; --DisableDefines;
} }
StrBuf MakeLineFromTokens (TokNode* first)
static StrBuf MakeLineFromTokens (TokNode* first)
{ {
/* This code reconstitutes a Macro line from the 'compiled' tokens*/ /* This code reconstitutes a Macro line from the 'compiled' tokens*/
unsigned I; unsigned I;

View File

@@ -36,7 +36,7 @@
#ifndef MACRO_H #ifndef MACRO_H
#define MACRO_H #define MACRO_H
#include "toklist.h"
/*****************************************************************************/ /*****************************************************************************/
/* Forwards */ /* Forwards */
@@ -105,7 +105,7 @@ void EnableDefineStyleMacros (void);
** DisableDefineStyleMacros. ** DisableDefineStyleMacros.
*/ */
StrBuf MakeLineFromTokens (TokNode* first);
/* End of macro.h */ /* End of macro.h */

View File

@@ -674,9 +674,13 @@ static void OptWarningsAsErrors (const char* Opt attribute ((unused)),
static void OptExpandMacros (const char* Opt attribute ((unused)), static void OptExpandMacros (const char* Opt attribute ((unused)),
const char* Arg attribute ((unused))) const char* Arg attribute ((unused)))
/* Exapnd macros in listing */ /* Expand macros in listing
** one -m means short listing
** two means full listing
*/
{ {
ExpandMacros = 1;
ExpandMacros++;
} }
static void DoPCAssign (void) static void DoPCAssign (void)
@@ -895,6 +899,7 @@ static void Assemble (void)
while (CurTok.Tok != TOK_EOF) { while (CurTok.Tok != TOK_EOF) {
OneLine (); OneLine ();
} }
} }
@@ -1080,7 +1085,7 @@ int main (int argc, char* argv [])
WarnLevel = atoi (GetArg (&I, 2)); WarnLevel = atoi (GetArg (&I, 2));
break; break;
case 'x': case 'x':
ExpandMacros = 1; ExpandMacros++;
break; break;

View File

@@ -46,7 +46,9 @@
#include "nexttok.h" #include "nexttok.h"
#include "scanner.h" #include "scanner.h"
#include "toklist.h" #include "toklist.h"
#include "macro.h"
#include "listing.h"
#include "global.h"
/*****************************************************************************/ /*****************************************************************************/
@@ -248,6 +250,26 @@ static int ReplayTokList (void* List)
} }
L->LI = StartLine (&CurTok.Pos, LI_TYPE_ASM, PushCounter); L->LI = StartLine (&CurTok.Pos, LI_TYPE_ASM, PushCounter);
/* see description in macro.c */
static int new_expand_line = 1;
if (ExpandMacros) {
if (new_expand_line) {
if (LineLast->FragList == 0 && ExpandMacros==1) {
LineCur->Output--;
}
StrBuf mac_line = MakeLineFromTokens (L->Last);
if (L->Last->T.Tok == TOK_SEGMENT) {
LineCur->Output = 2;
}
NewListingLine (&mac_line, 0, 0);
InitListingLine ();
SB_Done (&mac_line);
new_expand_line = 0;
}
if (L->Last->T.Tok == TOK_SEP) {
new_expand_line = 1;
}
}
/* If a check function is defined, call it, so it may look at the token /* If a check function is defined, call it, so it may look at the token
** just set and changed it as apropriate. ** just set and changed it as apropriate.
*/ */