Skip to content

Commit

Permalink
Merge pull request cc65#2498 from kugelfuhr/kugelfuhr/fix-include-in-…
Browse files Browse the repository at this point in the history
…macros

Fix .include within .macro/.repeat
  • Loading branch information
mrdudz authored Sep 1, 2024
2 parents 2680bc8 + cc0db26 commit 5e5dd1d
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 2 deletions.
26 changes: 26 additions & 0 deletions src/ca65/istack.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,29 @@ void CheckInputStack (void)
Error ("Open %s", IStack->Desc);
}
}



InputStack RetrieveInputStack (void)
/* Retrieve the current input stack. This will also clear it. Used when
** including a file. The current input stack is stored together with the old
** input file and restored when the file is closed.
*/
{
/* We do not touch the counter so input sources are counted across
** includes.
*/
InputStack S = IStack;
IStack = 0;
return S;
}



void RestoreInputStack (InputStack S)
/* Restore an old input stack that was retrieved by RetrieveInputStack(). */
{
CHECK (IStack == 0);
IStack = S;
}

20 changes: 20 additions & 0 deletions src/ca65/istack.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@



/*****************************************************************************/
/* Data */
/*****************************************************************************/



/* Opaque pointer to an input stack */
typedef void* InputStack;



/*****************************************************************************/
/* Code */
/*****************************************************************************/
Expand All @@ -63,6 +74,15 @@ void CheckInputStack (void);
** stuff on the input stack.
*/

InputStack RetrieveInputStack (void);
/* Retrieve the current input stack. This will also clear it. Used when
** including a file. The current input stack is stored together with the old
** input file and restored when the file is closed.
*/

void RestoreInputStack (InputStack S);
/* Restore an old input stack that was retrieved by RetrieveInputStack(). */



/* End of istack.h */
Expand Down
11 changes: 9 additions & 2 deletions src/ca65/scanner.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ struct CharSource {
token_t Tok; /* Last token */
int C; /* Last character */
int SkipN; /* For '\r\n' line endings, skip '\n\ if next */
InputStack IStack; /* Saved input stack */
const CharSourceFunctions* Func; /* Pointer to function table */
union {
InputFile File; /* File data */
Expand Down Expand Up @@ -321,6 +322,9 @@ static void UseCharSource (CharSource* S)
S->Tok = CurTok.Tok;
S->C = C;

/* Remember the current input stack */
S->IStack = RetrieveInputStack ();

/* Use the new input source */
S->Next = Source;
Source = S;
Expand All @@ -347,7 +351,10 @@ static void DoneCharSource (void)

/* Restore the old token */
CurTok.Tok = Source->Tok;
C = Source->C;
C = Source->C;

/* Restore the old input source */
RestoreInputStack (Source->IStack);

/* Remember the last stacked input source */
S = Source->Next;
Expand Down Expand Up @@ -1521,7 +1528,7 @@ void NextRawTok (void)
/* In case of the main file, do not close it, but return EOF. */
if (Source && Source->Next) {
DoneCharSource ();
goto Again;
goto Restart;
} else {
CurTok.Tok = TOK_EOF;
}
Expand Down
1 change: 1 addition & 0 deletions test/asm/listing/070-include-macro.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
foo:
13 changes: 13 additions & 0 deletions test/asm/listing/070-include-macro.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.macro IncludeFile FilePath
.proc bar
.include FilePath
.endproc
.endmacro

IncludeFile "070-include-macro.inc"

.ifdef bar::foo
.out "bar::foo is defined"
.else
.out "bar::foo is undefined"
.endif
1 change: 1 addition & 0 deletions test/asm/listing/070-include-repeat.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.out "include file"
4 changes: 4 additions & 0 deletions test/asm/listing/070-include-repeat.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.repeat 3
.include "070-include-repeat.inc"
.out "main file"
.endrepeat
1 change: 1 addition & 0 deletions test/asm/listing/ref/070-include-macro.err-ref
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bar::foo is defined
6 changes: 6 additions & 0 deletions test/asm/listing/ref/070-include-repeat.err-ref
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
include file
main file
include file
main file
include file
main file

0 comments on commit 5e5dd1d

Please sign in to comment.