Implement variable length arguments, but really only for print
authorDavid Kerkeslager <kerkeslager@gmail.com>
Tue, 1 Oct 2019 06:38:49 +0000 (02:38 -0400)
committerDavid Kerkeslager <kerkeslager@gmail.com>
Tue, 1 Oct 2019 06:38:49 +0000 (02:38 -0400)
templates/program2.c

index 180a4c7..89d80de 100644 (file)
@@ -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);