aboutsummaryrefslogtreecommitdiff
path: root/examples/cli2.zc
blob: 7bff8a1ee9e9ee1b199c721d5a64990eed2cd9ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace;
include rt, std;

// the command line, the environment, and capturing what a program writes.
// run it as:  ./bin/zy examples/cli2.zc one two   (the first is this file's path
// when zy is given one, otherwise <eval>, exactly as argv[0] is in c)
include std;

void main() {
	rt.put_s("argv: ");
	for (int i = 0; i < std.argc; i++) { rt.put_s(std.argv[i]); if (i + 1 < std.argc) rt.put_s(" "); }
	rt.put_c(10);

	// envp holds NAME=value strings, so a program can walk all of them
	let n = 0;
	for (int i = 0; i < std.envc; i++) if (std.Text.starts(std.envp[i], "HOME=")) n = n + 1;
	rt.put_s("HOME is set: "); rt.put_n(n > 0); rt.put_c(10);

	// the same name the old way, one lookup instead of a walk
	let v[80];
	rt.put_n(std.Host.env("HOME", v, 80) > 0); rt.put_c(10);

	// capture what the program writes, instead of printing it. every put_c,
	// put_s and put_n from here on lands in the buffer.
	let buf = std.capture.start();
	rt.put_s("this goes into the buffer, not the terminal");
	rt.put_c(10);
	std.capture.end(buf);		// stops the capture and terminates the string
	rt.put_s("captured "); rt.put_n(rt.len_w(buf)); rt.put_s(" characters: ");
	rt.put_s(buf);
	return;
}