1(module
2  (import "wasi_snapshot_preview1" "fd_write"
3    (func $fd_write (param i32 i32 i32 i32) (result i32)))
4
5  (import "wasi_snapshot_preview1" "environ_get"
6    (func $environ_get (param i32 i32) (result i32)))
7
8  (memory (export "memory") 1)
9
10  (func (export "_start")
11    (local $envptrs i32)
12    (local $envmem i32)
13    (local $env i32)
14
15    (local.set $envptrs (i32.mul (memory.grow (i32.const 1)) (i32.const 65536)))
16    (local.set $envmem (i32.mul (memory.grow (i32.const 1)) (i32.const 65536)))
17
18    (if (i32.ne
19          (call $environ_get (local.get $envptrs) (local.get $envmem))
20          (i32.const 0))
21        (then (unreachable)))
22
23    (loop
24      (local.set $env (i32.load (local.get $envptrs)))
25      (local.set $envptrs (i32.add (local.get $envptrs) (i32.const 4)))
26      (if (i32.eq (local.get $env) (i32.const 0)) (then (return)))
27
28      (call $write_all (local.get $env) (call $strlen (local.get $env)))
29      (call $write_all (i32.const 10) (i32.const 1))
30      br 0
31    )
32  )
33
34  (func $write_all (param $ptr i32) (param $len i32)
35    (local $rc i32)
36    (local $iov i32)
37    (local $written i32)
38
39    (local.set $written (i32.const 80))
40    (local.set $iov (i32.const 100))
41
42    (loop
43      (local.get $len)
44      if
45        (i32.store (local.get $iov) (local.get $ptr))
46        (i32.store offset=4 (local.get $iov) (local.get $len))
47        (local.set $rc
48          (call $fd_write
49            (i32.const 1)
50            (local.get $iov)
51            (i32.const 1)
52            (local.get $written)))
53        (if (i32.ne (local.get $rc) (i32.const 0)) (then (unreachable)))
54
55        (local.set $len (i32.sub (local.get $len) (i32.load (local.get $written))))
56        (local.set $ptr (i32.add (local.get $ptr) (i32.load (local.get $written))))
57      end
58    )
59  )
60
61  (func $strlen (param $ptr i32) (result i32)
62    (local $len i32)
63    (loop
64      (i32.load8_u (i32.add (local.get $ptr) (local.get $len)))
65      if
66        (local.set $len (i32.add (local.get $len) (i32.const 1)))
67        br 1
68      end
69    )
70    local.get $len
71  )
72
73  (data (i32.const 10) "\n")
74)
75
76
77