From 3dc627f8d6b5846081ef8ed15d5546e51d2ecb8d Mon Sep 17 00:00:00 2001 From: David Kerkeslager Date: Tue, 1 Oct 2019 02:38:49 -0400 Subject: [PATCH 1/1] Implement variable length arguments, but really only for print --- templates/program2.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/templates/program2.c b/templates/program2.c index 180a4c7..89d80de 100644 --- a/templates/program2.c +++ b/templates/program2.c @@ -108,26 +108,36 @@ void call(struct Thread* thread, Argument argument) { break; case PRINT: { - // TODO Handle multiple arguments - assert(!Stack_isEmpty(&(thread->stack))); - Object arg = Stack_pop(&(thread->stack)); + assert(argumentCount > 0); + + Object arguments[argumentCount]; + size_t count; + + for(count = 0; count < argumentCount; count++) { + assert(!Stack_isEmpty(&(thread->stack))); + arguments[argumentCount - count - 1] = Stack_pop(&(thread->stack)); + } + + for(count = 0; count < argumentCount; count ++) { + Object arg = arguments[count]; - switch(arg.type) { - case BOOLEAN: - if(arg.value.boolean) printf("true"); - else printf("false"); - break; + switch(arg.type) { + case BOOLEAN: + if(arg.value.boolean) printf("true"); + else printf("false"); + break; - case INTEGER: - printf("%i", arg.value.integer); - break; + case INTEGER: + printf("%i", arg.value.integer); + break; - case STRING: - printf("%s", arg.value.string); - break; + case STRING: + printf("%s", arg.value.string); + break; - default: - assert(0); + default: + assert(0); + } } Stack_push(&(thread->stack), BUILTIN_NIL); -- 2.20.1