summary refs log tree commit diff
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2025-03-26 20:46:12 +0300
committerNakidai <nakidai@disroot.org>2025-03-26 20:46:12 +0300
commit7b94dd5d7f4b8604ed3af6499edde8286d9073c9 (patch)
treee92d274315e72d9047033d535cfa71a3de2f93a3
parent6fa64679e24b2bef4aee49657df1b2f411b18392 (diff)
download3cl-7b94dd5d7f4b8604ed3af6499edde8286d9073c9.tar.gz
3cl-7b94dd5d7f4b8604ed3af6499edde8286d9073c9.zip
Make dump more flexible for streams
-rw-r--r--cccl.c2
-rw-r--r--cccl.h3
-rw-r--r--executor.c16
3 files changed, 11 insertions, 10 deletions
diff --git a/cccl.c b/cccl.c
index cd952d1..c574a87 100644
--- a/cccl.c
+++ b/cccl.c
@@ -17,5 +17,5 @@ void cccl(struct cccl_File file)
     struct cccl_Variables scope = {0};
     cccl_execute(parsed, &scope, 0);
     if (dump)
-        cccl_dump();
+        cccl_dump(stdout);
 }
diff --git a/cccl.h b/cccl.h
index 8bf3d0c..a49ac8a 100644
--- a/cccl.h
+++ b/cccl.h
@@ -2,6 +2,7 @@
 #define __CCCL_H__
 
 #include <stddef.h>
+#include <stdio.h>
 
 
 #define TOKENS_LIMIT 16384
@@ -98,7 +99,7 @@ void cccl(struct cccl_File file);
 size_t cccl_tokenize(const char *code, size_t size, struct cccl_Token tokens[], size_t tokens_length);
 struct cccl_Node *cccl_parse(struct cccl_Token tokens[], size_t tokens_length, enum cccl_NodeType type, char value);
 enum cccl_ExecutorStatus cccl_execute(struct cccl_Node *code, struct cccl_Variables *scope, size_t depth);
-void cccl_dump(void);
+void cccl_dump(FILE *f);
 
 const char *strtoken(enum cccl_TokenType type);
 const char *strnode(enum cccl_NodeType type);
diff --git a/executor.c b/executor.c
index 37cffc6..993870a 100644
--- a/executor.c
+++ b/executor.c
@@ -47,19 +47,19 @@ static short *get_variable(char name, struct cccl_Variables *scope)
     return NULL;
 }
 
-void cccl_dump(void)
+void cccl_dump(FILE *f)
 {
-    fputs("Globals:\n", stderr);
+    fputs("Globals:\n", f);
     for (size_t i = 0; i < 52; ++i)
         if (globals.used[i])
-            fprintf(stderr, "  %c=%d\n", getnamebyi(i), globals.buffer[i]);
-    fputs("Functions:\n", stderr);
+            fprintf(f, "  %c=%d\n", getnamebyi(i), globals.buffer[i]);
+    fputs("Functions:\n", f);
     for (size_t i = 0; i < 52; ++i)
         if (functions[i].body)
-            fprintf(stderr, "  %c, %lu nodes\n", getnamebyi(i), functions[i].length);
-    fputs("Stack:\n", stderr);
+            fprintf(f, "  %c, %lu nodes\n", getnamebyi(i), functions[i].length);
+    fputs("Stack:\n", f);
     for (size_t i = 0; i < stack.length; ++i)
-        fprintf(stderr, "  %d\n", stack.buffer[i]);
+        fprintf(f, "  %d\n", stack.buffer[i]);
 }
 
 enum cccl_ExecutorStatus cccl_execute(struct cccl_Node *code, struct cccl_Variables *scope, size_t depth)
@@ -82,7 +82,7 @@ enum cccl_ExecutorStatus cccl_execute(struct cccl_Node *code, struct cccl_Variab
             for (size_t i = 0; i < 52; ++i)
                 if (scope->used[i])
                     fprintf(stderr, "  %c=%d\n", getnamebyi(i), scope->buffer[i]);
-            cccl_dump();
+            cccl_dump(stderr);
         }
     }
     switch (code->type)