projects
/
fur
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
4efcfd0
)
Implement variable length arguments, but really only for print
author
David Kerkeslager
<kerkeslager@gmail.com>
Tue, 1 Oct 2019 06:38:49 +0000
(
02:38
-0400)
committer
David Kerkeslager
<kerkeslager@gmail.com>
Tue, 1 Oct 2019 06:38:49 +0000
(
02:38
-0400)
templates/program2.c
patch
|
blob
|
history
diff --git
a/templates/program2.c
b/templates/program2.c
index
180a4c7
..
89d80de
100644
(file)
--- a/
templates/program2.c
+++ b/
templates/program2.c
@@
-108,26
+108,36
@@
void call(struct Thread* thread, Argument argument) {
break;
case PRINT:
{
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);
}
Stack_push(&(thread->stack), BUILTIN_NIL);