authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-12 20:36:07-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-13 04:01:40+00:00
log0237e7a701892a0bf3c57e6868f54421782ff91d
tree0dacfcaf38543d384656b86ce846a3065a0ca1e3
parent8bae70454dabe77dfe7e5344e59ca2180d63af51

std.io.getStdOut and related fns no longer can error

Thanks to the Windows Process Environment Block, it is possible to obtain handles to the standard input, output, and error streams without possibility of failure.

17 files changed, 76 insertions(+), 115 deletions(-)

doc/langref.html.in+2-5
......@@ -202,11 +202,8 @@
202202const std = @import("std");
203203
204204pub fn main() !void {
205 // If this program is run without stdout attached, exit with an error.
206 const stdout_file = try std.io.getStdOut();
207 // If this program encounters pipe failure when printing to stdout, exit
208 // with an error.
209 try stdout_file.write("Hello, world!\n");
205 const stdout = &std.io.getStdOut().outStream().stream;
206 try stdout.print("Hello, {}!\n", "world");
210207}
211208 {#code_end#}
212209 <p>
lib/std/crypto/benchmark.zig+1-3
......@@ -131,9 +131,7 @@ fn printPad(stdout: var, s: []const u8) !void {
131131}
132132
133133pub fn main() !void {
134 var stdout_file = try std.io.getStdOut();
135 var stdout_out_stream = stdout_file.outStream();
136 const stdout = &stdout_out_stream.stream;
134 const stdout = &std.io.getStdOut().outStream().stream;
137135
138136 var buffer: [1024]u8 = undefined;
139137 var fixed = std.heap.FixedBufferAllocator.init(buffer[0..]);
lib/std/debug.zig+7-7
......@@ -49,15 +49,15 @@ var stderr_mutex = std.Mutex.init();
4949pub fn warn(comptime fmt: []const u8, args: ...) void {
5050 const held = stderr_mutex.acquire();
5151 defer held.release();
52 const stderr = getStderrStream() catch return;
52 const stderr = getStderrStream();
5353 stderr.print(fmt, args) catch return;
5454}
5555
56pub fn getStderrStream() !*io.OutStream(File.WriteError) {
56pub fn getStderrStream() *io.OutStream(File.WriteError) {
5757 if (stderr_stream) |st| {
5858 return st;
5959 } else {
60 stderr_file = try io.getStdErr();
60 stderr_file = io.getStdErr();
6161 stderr_file_out_stream = stderr_file.outStream();
6262 const st = &stderr_file_out_stream.stream;
6363 stderr_stream = st;
......@@ -90,7 +90,7 @@ fn wantTtyColor() bool {
9090/// Tries to print the current stack trace to stderr, unbuffered, and ignores any error returned.
9191/// TODO multithreaded awareness
9292pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
93 const stderr = getStderrStream() catch return;
93 const stderr = getStderrStream();
9494 if (builtin.strip_debug_info) {
9595 stderr.print("Unable to dump stack trace: debug info stripped\n") catch return;
9696 return;
......@@ -109,7 +109,7 @@ pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
109109/// unbuffered, and ignores any error returned.
110110/// TODO multithreaded awareness
111111pub fn dumpStackTraceFromBase(bp: usize, ip: usize) void {
112 const stderr = getStderrStream() catch return;
112 const stderr = getStderrStream();
113113 if (builtin.strip_debug_info) {
114114 stderr.print("Unable to dump stack trace: debug info stripped\n") catch return;
115115 return;
......@@ -182,7 +182,7 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *builtin.StackTrace
182182/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
183183/// TODO multithreaded awareness
184184pub fn dumpStackTrace(stack_trace: builtin.StackTrace) void {
185 const stderr = getStderrStream() catch return;
185 const stderr = getStderrStream();
186186 if (builtin.strip_debug_info) {
187187 stderr.print("Unable to dump stack trace: debug info stripped\n") catch return;
188188 return;
......@@ -237,7 +237,7 @@ pub fn panicExtra(trace: ?*const builtin.StackTrace, first_trace_addr: ?usize, c
237237 // which first called panic can finish printing a stack trace.
238238 os.abort();
239239 }
240 const stderr = getStderrStream() catch os.abort();
240 const stderr = getStderrStream();
241241 stderr.print(format ++ "\n", args) catch os.abort();
242242 if (trace) |t| {
243243 dumpStackTrace(t.*);
lib/std/io.zig+9-16
......@@ -34,28 +34,23 @@ else
3434 Mode.blocking;
3535pub const is_async = mode != .blocking;
3636
37pub const GetStdIoError = os.windows.GetStdHandleError;
38
39pub fn getStdOut() GetStdIoError!File {
37pub fn getStdOut() File {
4038 if (builtin.os == .windows) {
41 const handle = try os.windows.GetStdHandle(os.windows.STD_OUTPUT_HANDLE);
42 return File.openHandle(handle);
39 return File.openHandle(os.windows.peb().ProcessParameters.hStdOutput);
4340 }
4441 return File.openHandle(os.STDOUT_FILENO);
4542}
4643
47pub fn getStdErr() GetStdIoError!File {
44pub fn getStdErr() File {
4845 if (builtin.os == .windows) {
49 const handle = try os.windows.GetStdHandle(os.windows.STD_ERROR_HANDLE);
50 return File.openHandle(handle);
46 return File.openHandle(os.windows.peb().ProcessParameters.hStdError);
5147 }
5248 return File.openHandle(os.STDERR_FILENO);
5349}
5450
55pub fn getStdIn() GetStdIoError!File {
51pub fn getStdIn() File {
5652 if (builtin.os == .windows) {
57 const handle = try os.windows.GetStdHandle(os.windows.STD_INPUT_HANDLE);
58 return File.openHandle(handle);
53 return File.openHandle(os.windows.peb().ProcessParameters.hStdInput);
5954 }
6055 return File.openHandle(os.STDIN_FILENO);
6156}
......@@ -598,7 +593,7 @@ pub fn BufferedOutStreamCustom(comptime buffer_size: usize, comptime OutStreamEr
598593 self.index = 0;
599594 }
600595
601 fn writeFn(out_stream: *Stream, bytes: []const u8) !void {
596 fn writeFn(out_stream: *Stream, bytes: []const u8) Error!void {
602597 const self = @fieldParentPtr(Self, "stream", out_stream);
603598
604599 if (bytes.len >= self.buffer.len) {
......@@ -814,8 +809,7 @@ pub const BufferedAtomicFile = struct {
814809};
815810
816811pub fn readLine(buf: *std.Buffer) ![]u8 {
817 var stdin = try getStdIn();
818 var stdin_stream = stdin.inStream();
812 var stdin_stream = getStdIn().inStream();
819813 return readLineFrom(&stdin_stream.stream, buf);
820814}
821815
......@@ -856,8 +850,7 @@ test "io.readLineFrom" {
856850}
857851
858852pub fn readLineSlice(slice: []u8) ![]u8 {
859 var stdin = try getStdIn();
860 var stdin_stream = stdin.inStream();
853 var stdin_stream = getStdIn().inStream();
861854 return readLineSliceFrom(&stdin_stream.stream, slice);
862855}
863856
lib/std/json.zig+2-2
......@@ -1015,7 +1015,7 @@ pub const Value = union(enum) {
10151015 var held = std.debug.getStderrMutex().acquire();
10161016 defer held.release();
10171017
1018 const stderr = std.debug.getStderrStream() catch return;
1018 const stderr = std.debug.getStderrStream();
10191019 self.dumpStream(stderr, 1024) catch return;
10201020 }
10211021
......@@ -1026,7 +1026,7 @@ pub const Value = union(enum) {
10261026 var held = std.debug.getStderrMutex().acquire();
10271027 defer held.release();
10281028
1029 const stderr = std.debug.getStderrStream() catch return;
1029 const stderr = std.debug.getStderrStream();
10301030 self.dumpStreamIndent(indent, stderr, 1024) catch return;
10311031 }
10321032 }
lib/std/progress.zig+2-5
......@@ -98,11 +98,8 @@ pub const Progress = struct {
9898 /// TODO solve https://github.com/ziglang/zig/issues/2765 and then change this
9999 /// API to return Progress rather than accept it as a parameter.
100100 pub fn start(self: *Progress, name: []const u8, estimated_total_items: ?usize) !*Node {
101 if (std.io.getStdErr()) |stderr| {
102 self.terminal = if (stderr.supportsAnsiEscapeCodes()) stderr else null;
103 } else |_| {
104 self.terminal = null;
105 }
101 const stderr = std.io.getStdErr();
102 self.terminal = if (stderr.supportsAnsiEscapeCodes()) stderr else null;
106103 self.root = Node{
107104 .context = self,
108105 .parent = null,
lib/std/special/build_runner.zig+12-23
......@@ -43,19 +43,8 @@ pub fn main() !void {
4343
4444 var targets = ArrayList([]const u8).init(allocator);
4545
46 var stderr_file = io.getStdErr();
47 var stderr_file_stream: File.OutStream = undefined;
48 var stderr_stream = if (stderr_file) |f| x: {
49 stderr_file_stream = f.outStream();
50 break :x &stderr_file_stream.stream;
51 } else |err| err;
52
53 var stdout_file = io.getStdOut();
54 var stdout_file_stream: File.OutStream = undefined;
55 var stdout_stream = if (stdout_file) |f| x: {
56 stdout_file_stream = f.outStream();
57 break :x &stdout_file_stream.stream;
58 } else |err| err;
46 const stderr_stream = &io.getStdErr().outStream().stream;
47 const stdout_stream = &io.getStdOut().outStream().stream;
5948
6049 while (arg_it.next(allocator)) |err_or_arg| {
6150 const arg = try unwrapArg(err_or_arg);
......@@ -63,37 +52,37 @@ pub fn main() !void {
6352 const option_contents = arg[2..];
6453 if (option_contents.len == 0) {
6554 warn("Expected option name after '-D'\n\n");
66 return usageAndErr(builder, false, try stderr_stream);
55 return usageAndErr(builder, false, stderr_stream);
6756 }
6857 if (mem.indexOfScalar(u8, option_contents, '=')) |name_end| {
6958 const option_name = option_contents[0..name_end];
7059 const option_value = option_contents[name_end + 1 ..];
7160 if (try builder.addUserInputOption(option_name, option_value))
72 return usageAndErr(builder, false, try stderr_stream);
61 return usageAndErr(builder, false, stderr_stream);
7362 } else {
7463 if (try builder.addUserInputFlag(option_contents))
75 return usageAndErr(builder, false, try stderr_stream);
64 return usageAndErr(builder, false, stderr_stream);
7665 }
7766 } else if (mem.startsWith(u8, arg, "-")) {
7867 if (mem.eql(u8, arg, "--verbose")) {
7968 builder.verbose = true;
8069 } else if (mem.eql(u8, arg, "--help")) {
81 return usage(builder, false, try stdout_stream);
70 return usage(builder, false, stdout_stream);
8271 } else if (mem.eql(u8, arg, "--prefix")) {
8372 builder.install_prefix = try unwrapArg(arg_it.next(allocator) orelse {
8473 warn("Expected argument after --prefix\n\n");
85 return usageAndErr(builder, false, try stderr_stream);
74 return usageAndErr(builder, false, stderr_stream);
8675 });
8776 } else if (mem.eql(u8, arg, "--search-prefix")) {
8877 const search_prefix = try unwrapArg(arg_it.next(allocator) orelse {
8978 warn("Expected argument after --search-prefix\n\n");
90 return usageAndErr(builder, false, try stderr_stream);
79 return usageAndErr(builder, false, stderr_stream);
9180 });
9281 builder.addSearchPrefix(search_prefix);
9382 } else if (mem.eql(u8, arg, "--override-lib-dir")) {
9483 builder.override_lib_dir = try unwrapArg(arg_it.next(allocator) orelse {
9584 warn("Expected argument after --override-lib-dir\n\n");
96 return usageAndErr(builder, false, try stderr_stream);
85 return usageAndErr(builder, false, stderr_stream);
9786 });
9887 } else if (mem.eql(u8, arg, "--verbose-tokenize")) {
9988 builder.verbose_tokenize = true;
......@@ -111,7 +100,7 @@ pub fn main() !void {
111100 builder.verbose_cc = true;
112101 } else {
113102 warn("Unrecognized argument: {}\n\n", arg);
114 return usageAndErr(builder, false, try stderr_stream);
103 return usageAndErr(builder, false, stderr_stream);
115104 }
116105 } else {
117106 try targets.append(arg);
......@@ -122,12 +111,12 @@ pub fn main() !void {
122111 try runBuild(builder);
123112
124113 if (builder.validateUserInputDidItFail())
125 return usageAndErr(builder, true, try stderr_stream);
114 return usageAndErr(builder, true, stderr_stream);
126115
127116 builder.make(targets.toSliceConst()) catch |err| {
128117 switch (err) {
129118 error.InvalidStepName => {
130 return usageAndErr(builder, true, try stderr_stream);
119 return usageAndErr(builder, true, stderr_stream);
131120 },
132121 error.UncleanExit => process.exit(1),
133122 else => return err,
lib/std/unicode/throughput_test.zig+1-3
......@@ -2,9 +2,7 @@ const builtin = @import("builtin");
22const std = @import("std");
33
44pub fn main() !void {
5 var stdout_file = try std.io.getStdOut();
6 var stdout_out_stream = stdout_file.outStream();
7 const stdout = &stdout_out_stream.stream;
5 const stdout = &std.io.getStdOut().outStream().stream;
86
97 const args = try std.process.argsAlloc(std.heap.direct_allocator);
108
lib/std/zig/parser_test.zig+5-6
......@@ -1451,11 +1451,11 @@ test "zig fmt: preserve spacing" {
14511451 \\const std = @import("std");
14521452 \\
14531453 \\pub fn main() !void {
1454 \\ var stdout_file = try std.io.getStdOut;
1455 \\ var stdout_file = try std.io.getStdOut;
1454 \\ var stdout_file = std.io.getStdOut;
1455 \\ var stdout_file = std.io.getStdOut;
14561456 \\
1457 \\ var stdout_file = try std.io.getStdOut;
1458 \\ var stdout_file = try std.io.getStdOut;
1457 \\ var stdout_file = std.io.getStdOut;
1458 \\ var stdout_file = std.io.getStdOut;
14591459 \\}
14601460 \\
14611461 );
......@@ -2565,8 +2565,7 @@ const maxInt = std.math.maxInt;
25652565var fixed_buffer_mem: [100 * 1024]u8 = undefined;
25662566
25672567fn testParse(source: []const u8, allocator: *mem.Allocator, anything_changed: *bool) ![]u8 {
2568 var stderr_file = try io.getStdErr();
2569 var stderr = &stderr_file.outStream().stream;
2568 const stderr = &io.getStdErr().outStream().stream;
25702569
25712570 const tree = try std.zig.parse(allocator, source);
25722571 defer tree.deinit();
src-self-hosted/main.zig+4-7
......@@ -56,13 +56,10 @@ pub fn main() !void {
5656 // libc allocator is guaranteed to have this property.
5757 const allocator = std.heap.c_allocator;
5858
59 var stdout_file = try std.io.getStdOut();
60 var stdout_out_stream = stdout_file.outStream();
61 stdout = &stdout_out_stream.stream;
59 stdout = &std.io.getStdOut().outStream().stream;
6260
63 stderr_file = try std.io.getStdErr();
64 var stderr_out_stream = stderr_file.outStream();
65 stderr = &stderr_out_stream.stream;
61 stderr_file = std.io.getStdErr();
62 stderr = &stderr_file.outStream().stream;
6663
6764 const args = try process.argsAlloc(allocator);
6865 // TODO I'm getting unreachable code here, which shouldn't happen
......@@ -619,7 +616,7 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void {
619616 process.exit(1);
620617 }
621618
622 var stdin_file = try io.getStdIn();
619 var stdin_file = io.getStdIn();
623620 var stdin = stdin_file.inStream();
624621
625622 const source_code = try stdin.stream.readAllAlloc(allocator, max_src_size);
src-self-hosted/stage1.zig+4-8
......@@ -166,13 +166,9 @@ fn fmtMain(argc: c_int, argv: [*]const [*]const u8) !void {
166166 try args_list.append(std.mem.toSliceConst(u8, argv[arg_i]));
167167 }
168168
169 var stdout_file = try std.io.getStdOut();
170 var stdout_out_stream = stdout_file.outStream();
171 stdout = &stdout_out_stream.stream;
172
173 stderr_file = try std.io.getStdErr();
174 var stderr_out_stream = stderr_file.outStream();
175 stderr = &stderr_out_stream.stream;
169 stdout = &std.io.getStdOut().outStream().stream;
170 stderr_file = std.io.getStdErr();
171 stderr = &stderr_file.outStream().stream;
176172
177173 const args = args_list.toSliceConst();
178174 var flags = try Args.parse(allocator, self_hosted_main.args_fmt_spec, args[2..]);
......@@ -203,7 +199,7 @@ fn fmtMain(argc: c_int, argv: [*]const [*]const u8) !void {
203199 process.exit(1);
204200 }
205201
206 var stdin_file = try io.getStdIn();
202 const stdin_file = io.getStdIn();
207203 var stdin = stdin_file.inStream();
208204
209205 const source_code = try stdin.stream.readAllAlloc(allocator, self_hosted_main.max_src_size);
src-self-hosted/test.zig+2-2
......@@ -181,7 +181,7 @@ pub const TestContext = struct {
181181 },
182182 Compilation.Event.Error => |err| return err,
183183 Compilation.Event.Fail => |msgs| {
184 var stderr = try std.io.getStdErr();
184 const stderr = std.io.getStdErr();
185185 try stderr.write("build incorrectly failed:\n");
186186 for (msgs) |msg| {
187187 defer msg.destroy();
......@@ -231,7 +231,7 @@ pub const TestContext = struct {
231231 text,
232232 );
233233 std.debug.warn("\n====found:========\n");
234 var stderr = try std.io.getStdErr();
234 const stderr = std.io.getStdErr();
235235 for (msgs) |msg| {
236236 defer msg.destroy();
237237 try msg.printToFile(stderr, errmsg.Color.Auto);
test/compare_output.zig+15-15
......@@ -19,7 +19,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
1919 \\
2020 \\pub fn main() void {
2121 \\ privateFunction();
22 \\ const stdout = &(getStdOut() catch unreachable).outStream().stream;
22 \\ const stdout = &getStdOut().outStream().stream;
2323 \\ stdout.print("OK 2\n") catch unreachable;
2424 \\}
2525 \\
......@@ -34,7 +34,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
3434 \\// purposefully conflicting function with main.zig
3535 \\// but it's private so it should be OK
3636 \\fn privateFunction() void {
37 \\ const stdout = &(getStdOut() catch unreachable).outStream().stream;
37 \\ const stdout = &getStdOut().outStream().stream;
3838 \\ stdout.print("OK 1\n") catch unreachable;
3939 \\}
4040 \\
......@@ -60,7 +60,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
6060 tc.addSourceFile("foo.zig",
6161 \\usingnamespace @import("std").io;
6262 \\pub fn foo_function() void {
63 \\ const stdout = &(getStdOut() catch unreachable).outStream().stream;
63 \\ const stdout = &getStdOut().outStream().stream;
6464 \\ stdout.print("OK\n") catch unreachable;
6565 \\}
6666 );
......@@ -71,7 +71,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
7171 \\
7272 \\pub fn bar_function() void {
7373 \\ if (foo_function()) {
74 \\ const stdout = &(getStdOut() catch unreachable).outStream().stream;
74 \\ const stdout = &getStdOut().outStream().stream;
7575 \\ stdout.print("OK\n") catch unreachable;
7676 \\ }
7777 \\}
......@@ -103,7 +103,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
103103 \\pub const a_text = "OK\n";
104104 \\
105105 \\pub fn ok() void {
106 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
106 \\ const stdout = &io.getStdOut().outStream().stream;
107107 \\ stdout.print(b_text) catch unreachable;
108108 \\}
109109 );
......@@ -121,7 +121,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
121121 \\const io = @import("std").io;
122122 \\
123123 \\pub fn main() void {
124 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
124 \\ const stdout = &io.getStdOut().outStream().stream;
125125 \\ stdout.print("Hello, world!\n{d:4} {x:3} {c}\n", @as(u32, 12), @as(u16, 0x12), @as(u8, 'a')) catch unreachable;
126126 \\}
127127 , "Hello, world!\n 12 12 a\n");
......@@ -264,7 +264,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
264264 \\ var x_local : i32 = print_ok(x);
265265 \\}
266266 \\fn print_ok(val: @typeOf(x)) @typeOf(foo) {
267 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
267 \\ const stdout = &io.getStdOut().outStream().stream;
268268 \\ stdout.print("OK\n") catch unreachable;
269269 \\ return 0;
270270 \\}
......@@ -346,7 +346,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
346346 \\pub fn main() void {
347347 \\ const bar = Bar {.field2 = 13,};
348348 \\ const foo = Foo {.field1 = bar,};
349 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
349 \\ const stdout = &io.getStdOut().outStream().stream;
350350 \\ if (!foo.method()) {
351351 \\ stdout.print("BAD\n") catch unreachable;
352352 \\ }
......@@ -360,7 +360,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
360360 cases.add("defer with only fallthrough",
361361 \\const io = @import("std").io;
362362 \\pub fn main() void {
363 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
363 \\ const stdout = &io.getStdOut().outStream().stream;
364364 \\ stdout.print("before\n") catch unreachable;
365365 \\ defer stdout.print("defer1\n") catch unreachable;
366366 \\ defer stdout.print("defer2\n") catch unreachable;
......@@ -373,7 +373,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
373373 \\const io = @import("std").io;
374374 \\const os = @import("std").os;
375375 \\pub fn main() void {
376 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
376 \\ const stdout = &io.getStdOut().outStream().stream;
377377 \\ stdout.print("before\n") catch unreachable;
378378 \\ defer stdout.print("defer1\n") catch unreachable;
379379 \\ defer stdout.print("defer2\n") catch unreachable;
......@@ -390,7 +390,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
390390 \\ do_test() catch return;
391391 \\}
392392 \\fn do_test() !void {
393 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
393 \\ const stdout = &io.getStdOut().outStream().stream;
394394 \\ stdout.print("before\n") catch unreachable;
395395 \\ defer stdout.print("defer1\n") catch unreachable;
396396 \\ errdefer stdout.print("deferErr\n") catch unreachable;
......@@ -409,7 +409,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
409409 \\ do_test() catch return;
410410 \\}
411411 \\fn do_test() !void {
412 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
412 \\ const stdout = &io.getStdOut().outStream().stream;
413413 \\ stdout.print("before\n") catch unreachable;
414414 \\ defer stdout.print("defer1\n") catch unreachable;
415415 \\ errdefer stdout.print("deferErr\n") catch unreachable;
......@@ -426,7 +426,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
426426 \\const io = @import("std").io;
427427 \\
428428 \\pub fn main() void {
429 \\ const stdout = &(io.getStdOut() catch unreachable).outStream().stream;
429 \\ const stdout = &io.getStdOut().outStream().stream;
430430 \\ stdout.print(foo_txt) catch unreachable;
431431 \\}
432432 , "1234\nabcd\n");
......@@ -445,7 +445,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
445445 \\
446446 \\pub fn main() !void {
447447 \\ var args_it = std.process.args();
448 \\ var stdout_file = try io.getStdOut();
448 \\ var stdout_file = io.getStdOut();
449449 \\ var stdout_adapter = stdout_file.outStream();
450450 \\ const stdout = &stdout_adapter.stream;
451451 \\ var index: usize = 0;
......@@ -486,7 +486,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
486486 \\
487487 \\pub fn main() !void {
488488 \\ var args_it = std.process.args();
489 \\ var stdout_file = try io.getStdOut();
489 \\ var stdout_file = io.getStdOut();
490490 \\ var stdout_adapter = stdout_file.outStream();
491491 \\ const stdout = &stdout_adapter.stream;
492492 \\ var index: usize = 0;
test/standalone/brace_expansion/main.zig+2-2
......@@ -179,8 +179,8 @@ fn expandNode(node: Node, output: *ArrayList(Buffer)) ExpandNodeError!void {
179179}
180180
181181pub fn main() !void {
182 var stdin_file = try io.getStdIn();
183 var stdout_file = try io.getStdOut();
182 const stdin_file = io.getStdIn();
183 const stdout_file = io.getStdOut();
184184
185185 var arena = std.heap.ArenaAllocator.init(std.heap.direct_allocator);
186186 defer arena.deinit();
test/standalone/cat/main.zig+6-8
......@@ -10,30 +10,28 @@ pub fn main() !void {
1010 var args_it = process.args();
1111 const exe = try unwrapArg(args_it.next(allocator).?);
1212 var catted_anything = false;
13 var stdout_file = try io.getStdOut();
13 const stdout_file = io.getStdOut();
1414
1515 while (args_it.next(allocator)) |arg_or_err| {
1616 const arg = try unwrapArg(arg_or_err);
1717 if (mem.eql(u8, arg, "-")) {
1818 catted_anything = true;
19 var stdin_file = try io.getStdIn();
20 try cat_file(&stdout_file, &stdin_file);
19 try cat_file(stdout_file, io.getStdIn());
2120 } else if (arg[0] == '-') {
2221 return usage(exe);
2322 } else {
24 var file = File.openRead(arg) catch |err| {
23 const file = File.openRead(arg) catch |err| {
2524 warn("Unable to open file: {}\n", @errorName(err));
2625 return err;
2726 };
2827 defer file.close();
2928
3029 catted_anything = true;
31 try cat_file(&stdout_file, &file);
30 try cat_file(stdout_file, file);
3231 }
3332 }
3433 if (!catted_anything) {
35 var stdin_file = try io.getStdIn();
36 try cat_file(&stdout_file, &stdin_file);
34 try cat_file(stdout_file, io.getStdIn());
3735 }
3836}
3937
......@@ -42,7 +40,7 @@ fn usage(exe: []const u8) !void {
4240 return error.Invalid;
4341}
4442
45fn cat_file(stdout: *File, file: *File) !void {
43fn cat_file(stdout: File, file: File) !void {
4644 var buf: [1024 * 4]u8 = undefined;
4745
4846 while (true) {
test/standalone/guess_number/main.zig+1-2
......@@ -4,8 +4,7 @@ const io = std.io;
44const fmt = std.fmt;
55
66pub fn main() !void {
7 var stdout_file = try io.getStdOut();
8 const stdout = &stdout_file.outStream().stream;
7 const stdout = &io.getStdOut().outStream().stream;
98
109 try stdout.print("Welcome to the Guess Number Game in Zig.\n");
1110
test/standalone/hello_world/hello.zig+1-1
......@@ -2,7 +2,7 @@ const std = @import("std");
22
33pub fn main() !void {
44 // If this program is run without stdout attached, exit with an error.
5 const stdout_file = try std.io.getStdOut();
5 const stdout_file = std.io.getStdOut();
66 // If this program encounters pipe failure when printing to stdout, exit
77 // with an error.
88 try stdout_file.write("Hello, world!\n");