(with_import "./wasm.kp"
(let (
    _ (println "args" *ARGV*)
    (_ _ out) (cond (!= (len *ARGV*) 3) (error "wrong number of params to comp_wasm (please provide out)")
                       true                *ARGV*)
    _ (println "out" out)
    wasm_code
        (module
          (import "wasi_unstable" "path_open"
                  (func $path_open  (param i32 i32 i32 i32 i32 i64 i64 i32 i32)
                                  (result i32)))
          (import "wasi_unstable" "fd_prestat_dir_name"
                  (func $fd_prestat_dir_name  (param i32 i32 i32)
                                  (result i32)))
          (import "wasi_unstable" "fd_read"
                  (func $fd_read  (param i32 i32 i32 i32)
                                  (result i32)))
          (import "wasi_unstable" "fd_write"
                  (func $fd_write (param i32 i32 i32 i32)
                                  (result i32)))
          (memory $mem 1)
          (global $gi i32 (i32.const 8))
          (global $gb (mut i64) (i64.const 9))
          (table $tab 2 funcref)
          ;(table $tab2 8 16 funcref)
          (data (i32.const 16) "HellH") ;; adder to put, then data
          (func $start
                (i32.store (i32.const 8) (i32.const 16))  ;; adder of data
                (i32.store (i32.const 12) (i32.const 5)) ;; len of data
                ;; open file
                (call $path_open
                      (i32.const 3) ;; file descriptor
                      (i32.const 0) ;; lookup flags
                      (i32.const 16) ;; path string  *
                      (i32.load (i32.const 12)) ;; path string  len
                      (i32.const 1) ;; o flags
                      (i64.const 66) ;; base rights
                      (i64.const 66) ;; inheriting rights
                      (i32.const 0) ;; fdflags
                      (i32.const 4) ;; opened fd out ptr
                 )
                drop
                (block $a
                    (block $b
                        (br $a)
                        (br_if $b (i32.const 3))
                        (loop $l
                            (br $a)
                            (br $l)
                        )
                        (_if $myif (i32.const 1)
                            (then
                                (i32.const 1)
                                drop
                                (br $b)
                            )
                            (else
                                (br $myif)
                            )
                        )
                        (_if $another (i32.const 1) (br $b))
                        (i32.const 1)
                        (_if $third (br $b))
                        (_if $fourth (br $fourth))
                    )
                )

                (call $fd_read
                      (i32.const 0) ;; file descriptor
                      (i32.const 8) ;; *iovs
                      (i32.const 1) ;; iovs_len
                      (i32.const 12) ;; nwritten, overwrite buf len with it
                )
                drop

                ;; print name
                (call $fd_write
                      (i32.load (i32.const 4)) ;; file descriptor
                      (i32.const 8) ;; *iovs
                      (i32.const 1) ;; iovs_len
                      (i32.const 4) ;; nwritten
                )
                drop
          )
          (elem (i32.const 0) $start $start)
          (export "memory" (memory $mem))
          (export "_start" (func $start))
          (start $start)
        )
    _ (write_file out (wasm_to_binary wasm_code))
    return_code 0
) return_code ))
