Ver código fonte

Overrideable stdin, stdout, stderr at the `context` level

gingerBill 6 anos atrás
pai
commit
68d4bde82f
3 arquivos alterados com 15 adições e 7 exclusões
  1. 6 6
      core/fmt/fmt.odin
  2. 1 1
      core/log/file_console_logger.odin
  3. 8 0
      core/runtime/core.odin

+ 6 - 6
core/fmt/fmt.odin

@@ -59,12 +59,12 @@ fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int {
 
 
 // print* procedures return the number of bytes written
-print       :: proc(args: ..any)              -> int { return fprint(os.stdout, ..args); }
-print_err   :: proc(args: ..any)              -> int { return fprint(os.stderr, ..args); }
-println     :: proc(args: ..any)              -> int { return fprintln(os.stdout, ..args); }
-println_err :: proc(args: ..any)              -> int { return fprintln(os.stderr, ..args); }
-printf      :: proc(fmt: string, args: ..any) -> int { return fprintf(os.stdout, fmt, ..args); }
-printf_err  :: proc(fmt: string, args: ..any) -> int { return fprintf(os.stderr, fmt, ..args); }
+print       :: proc(args: ..any)              -> int { return fprint(context.stdout, ..args); }
+print_err   :: proc(args: ..any)              -> int { return fprint(context.stderr, ..args); }
+println     :: proc(args: ..any)              -> int { return fprintln(context.stdout, ..args); }
+println_err :: proc(args: ..any)              -> int { return fprintln(context.stderr, ..args); }
+printf      :: proc(fmt: string, args: ..any) -> int { return fprintf(context.stdout, fmt, ..args); }
+printf_err  :: proc(fmt: string, args: ..any) -> int { return fprintf(context.stderr, fmt, ..args); }
 
 
 // aprint* procedures return a string that was allocated with the current context

+ 1 - 1
core/log/file_console_logger.odin

@@ -69,7 +69,7 @@ file_console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string
 
     h : os.Handle;
     if(data.file_handle != os.INVALID_HANDLE) do h = data.file_handle;
-    else                                      do h = level <= Level.Error ? os.stdout : os.stderr;
+    else                                      do h = level <= Level.Error ? context.stdout : context.stderr;
     backing: [1024]byte; //NOTE(Hoej): 1024 might be too much for a header backing, unless somebody has really long paths.
     buf := strings.builder_from_slice(backing[:]);
 

+ 8 - 0
core/runtime/core.odin

@@ -213,6 +213,10 @@ Context :: struct {
 	assertion_failure_proc: Assertion_Failure_Proc,
 	logger: log.Logger,
 
+	stdin:  os.Handle,
+	stdout: os.Handle,
+	stderr: os.Handle,
+
 	thread_id:  int,
 
 	user_data:  any,
@@ -350,6 +354,10 @@ __init_context :: proc "contextless" (c: ^Context) {
 
 	c.logger.procedure = log.nil_logger_proc;
 	c.logger.data = nil;
+
+	c.stdin  = os.stdin;
+	c.stdout = os.stdout;
+	c.stderr = os.stderr;
 }
 
 @builtin