summaryrefslogtreecommitdiff
path: root/pit/src/native.c
diff options
context:
space:
mode:
Diffstat (limited to 'pit/src/native.c')
-rw-r--r--pit/src/native.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/pit/src/native.c b/pit/src/native.c
index a62f82e..89d9c9b 100644
--- a/pit/src/native.c
+++ b/pit/src/native.c
@@ -23,16 +23,24 @@ i64 pit_lex_file(pit_lexer *ret, char *path) {
return 0;
}
+static i64 pit_dump_to_file_callback(u8 *buf, i64 len, void *data) {
+ if (fwrite(buf, sizeof(u8), (size_t) len, (FILE *) data) != (size_t) len) return -1;
+ return 0;
+}
+void pit_dump_to_file(pit_runtime *rt, void *vf, pit_value v, bool readable) {
+ pit_dump_with_callback(rt, v, readable, pit_dump_to_file_callback, vf);
+}
+
bool pit_runtime_print_error(pit_runtime *rt) {
if (!pit_value_eq(rt->error, PIT_NIL)) {
- char buf[1024] = {0};
- for (i64 i = 0; i < rt->backtrace->next; ++i) {
- pit_annotated_ref *a = pit_vec_get(pit_annotated_ref)(rt->backtrace, i);
- if (a == NULL) continue;
- fprintf(stderr, "on line %ld, column %ld\n", a->annotation.line, a->annotation.column);
- }
- i64 end = pit_dump(rt, buf, sizeof(buf) - 1, rt->error, false); buf[end] = 0;
- fprintf(stderr, "error at line %ld, column %ld: %s\n", rt->error_line, rt->error_column, buf);
+ // for (i64 i = 0; i < rt->backtrace->next; ++i) {
+ // pit_annotated_ref *a = pit_vec_get(pit_annotated_ref)(rt->backtrace, i);
+ // if (a == NULL) continue;
+ // fprintf(stderr, "on line %ld, column %ld\n", a->annotation.line, a->annotation.column);
+ // }
+ fprintf(stderr, "error at line %ld, column %ld:", rt->error_line, rt->error_column);
+ pit_dump_to_file(rt, stderr, rt->error, false);
+ fprintf(stderr, "\n");
return true;
}
return false;
@@ -149,10 +157,9 @@ void pit_repl(pit_runtime *rt) {
rt->error = PIT_NIL;
printf("> ");
} else {
- char dumpbuf[1024] = {0};
- pit_dump(rt, dumpbuf, sizeof(dumpbuf) - 1, res, true);
+ pit_dump_to_file(rt, stdout, res, true);
pit_gc(rt);
- printf("%s\n> ", dumpbuf);
+ printf("\n> ");
}
len = 0;
}
@@ -173,19 +180,15 @@ static pit_value impl_diagnostics(pit_runtime *rt, pit_value args, void *data) {
static pit_value impl_print(pit_runtime *rt, pit_value args, void *data) {
(void) data;
pit_value x = pit_value_cons_car(rt, args);
- char buf[1024] = {0};
- pit_dump(rt, buf, sizeof(buf), x, true);
- buf[1023] = 0;
- puts(buf);
+ pit_dump_to_file(rt, stdout, x, true);
+ printf("\n");
return x;
}
static pit_value impl_princ(pit_runtime *rt, pit_value args, void *data) {
(void) data;
pit_value x = pit_value_cons_car(rt, args);
- char buf[1024] = {0};
- pit_dump(rt, buf, sizeof(buf), x, false);
- buf[1023] = 0;
- puts(buf);
+ pit_dump_to_file(rt, stdout, x, false);
+ printf("\n");
return x;
}
static pit_value impl_load(pit_runtime *rt, pit_value args, void *data) {