diff --git a/macros.c b/macros.c index e51fe28..d9cbe91 100644 --- a/macros.c +++ b/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; + } } } diff --git a/tests/test-macro-comma.lst.ok b/tests/test-macro-comma.lst.ok index 4ef9eba..3789fbe 100644 --- a/tests/test-macro-comma.lst.ok +++ b/tests/test-macro-comma.lst.ok @@ -49,7 +49,35 @@ 1 ; 35 000000 braket string 1 ; - 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 diff --git a/tests/test-macro-comma.mac b/tests/test-macro-comma.mac index d2783b4..87bd1fc 100644 --- a/tests/test-macro-comma.mac +++ b/tests/test-macro-comma.mac @@ -33,3 +33,21 @@ start: tstarg ; 0 args braket ^/broken braket braket 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