mirror of
https://github.com/open-simh/simtools.git
synced 2026-02-28 17:20:29 +00:00
Fix macro calls with omitted argument that has a default value,
followed by additional (not omitted) arguments.
This commit is contained in:
24
macros.c
24
macros.c
@@ -503,9 +503,15 @@ STREAM *expandmacro(
|
||||
if (macarg == NULL)
|
||||
break; /* Don't pick up any more arguments. */
|
||||
|
||||
nextcp = skipwhite (cp);
|
||||
arg = new_arg();
|
||||
arg->label = memcheck(strdup(macarg->label)); /* Copy the name */
|
||||
arg->value = getstring_macarg(refstr, cp, &nextcp);
|
||||
if (*nextcp != ',') {
|
||||
arg->value = getstring_macarg(refstr, cp, &nextcp);
|
||||
}
|
||||
else {
|
||||
arg->value = NULL;
|
||||
}
|
||||
nargs++; /* Count nonkeyword arguments only. */
|
||||
}
|
||||
|
||||
@@ -527,9 +533,13 @@ STREAM *expandmacro(
|
||||
|
||||
for (macarg = mac->args; macarg != NULL; macarg = macarg->next) {
|
||||
arg = find_arg(args, macarg->label);
|
||||
if (arg == NULL) {
|
||||
arg = new_arg();
|
||||
arg->label = memcheck(strdup(macarg->label));
|
||||
if (arg == NULL || arg->value == NULL) {
|
||||
int wasnull = 0;
|
||||
if (arg == NULL) {
|
||||
wasnull = 1;
|
||||
arg = new_arg();
|
||||
arg->label = memcheck(strdup(macarg->label));
|
||||
}
|
||||
if (macarg->locsym) {
|
||||
char temp[32];
|
||||
|
||||
@@ -541,8 +551,10 @@ STREAM *expandmacro(
|
||||
} else
|
||||
arg->value = memcheck(strdup(""));
|
||||
|
||||
arg->next = args;
|
||||
args = arg;
|
||||
if (wasnull) {
|
||||
arg->next = args;
|
||||
args = arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,35 @@
|
||||
1 ; <bro<ken>
|
||||
35 000000 braket <bro<ken> string
|
||||
1 ; <bro<ken>
|
||||
35
|
||||
36
|
||||
37 ;
|
||||
38 ; Test that commas work with default arguments
|
||||
39 ;
|
||||
40 .macro tstarg a1,a2=default,a3,a4
|
||||
41 .narg label ; second arg is "a2"
|
||||
42 .endm
|
||||
43
|
||||
44 000000 start: tstarg ; 0 args
|
||||
1 000000 .narg label ; second arg is "default"
|
||||
45 000000 tstarg 123 ; 1 arg
|
||||
1 000001 .narg label ; second arg is "default"
|
||||
46 000000 tstarg 1, ; 2 args
|
||||
1 000002 .narg label ; second arg is ""
|
||||
47 000000 tstarg ,2 ; 2 args
|
||||
1 000002 .narg label ; second arg is "2"
|
||||
48 000000 tstarg , ; 2 args
|
||||
1 000002 .narg label ; second arg is ""
|
||||
49 000000 tstarg ,, ; 3 args
|
||||
1 000003 .narg label ; second arg is "default"
|
||||
50 000000 tstarg 1,, ; 3 args
|
||||
1 000003 .narg label ; second arg is "default"
|
||||
51 000000 tstarg ,,3 ; 3 args
|
||||
1 000003 .narg label ; second arg is "default"
|
||||
52 000000 tstarg 1,,3 ; 3 args
|
||||
1 000003 .narg label ; second arg is "default"
|
||||
53 000000 tstarg 1,2,3 ; 3 args
|
||||
1 000003 .narg label ; second arg is "2"
|
||||
53
|
||||
|
||||
|
||||
Symbol table
|
||||
|
||||
@@ -33,3 +33,21 @@ start: tstarg ; 0 args
|
||||
braket ^/broken
|
||||
braket <bro<ken>
|
||||
braket <bro<ken> string
|
||||
|
||||
;
|
||||
; Test that commas work with default arguments
|
||||
;
|
||||
.macro tstarg a1,a2=default,a3,a4
|
||||
.narg label ; second arg is "a2"
|
||||
.endm
|
||||
|
||||
start: tstarg ; 0 args
|
||||
tstarg 123 ; 1 arg
|
||||
tstarg 1, ; 2 args
|
||||
tstarg ,2 ; 2 args
|
||||
tstarg , ; 2 args
|
||||
tstarg ,, ; 3 args
|
||||
tstarg 1,, ; 3 args
|
||||
tstarg ,,3 ; 3 args
|
||||
tstarg 1,,3 ; 3 args
|
||||
tstarg 1,2,3 ; 3 args
|
||||
|
||||
Reference in New Issue
Block a user