// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: g_with_input_from_string
static s7_pointer g_with_input_from_string(s7_scheme *sc, s7_pointer args)
    {
#define H_with_input_from_string "(with-input-from-string str thunk) opens str as the temporary current-input-port and calls thunk"
#define Q_with_input_from_string sc->pl_sf
        s7_pointer str;

        str = car(args);
        if (!is_string(str))
            return(method_or_bust(sc, str, sc->with_input_from_string_symbol, args, T_STRING, 1));

        if (cadr(args) == slot_value(global_slot(sc->read_symbol)))
        {
            s7_pointer old_input_port;
            if (string_length(str) == 0)
                return(eof_object);

            old_input_port = sc->input_port;
            sc->input_port = open_and_protect_input_string(sc, str);
            port_original_input_string(sc->input_port) = str;
            push_stack(sc, OP_UNWIND_INPUT, old_input_port, sc->input_port);

            push_input_port(sc, sc->input_port);
            push_stack_op_let(sc, OP_READ_DONE);
            push_stack_op_let(sc, OP_READ_INTERNAL);
            return(sc->input_port);
        }

        if (!is_thunk(sc, cadr(args)))
            return(method_or_bust_with_type(sc, cadr(args), sc->with_input_from_string_symbol, args, a_thunk_string, 2));

        /* since the arguments are evaluated before we get here, we can get some confusing situations:
         *   (with-input-from-string "#x2.1" (read))
         *     (read) -> whatever it can get from the current input port!
         *     ";with-input-from-string argument 2, #<eof>, is untyped but should be a thunk"
         *   (with-input-from-string "" (read-line)) -> hangs awaiting stdin input
         */
        return(with_input(sc, open_and_protect_input_string(sc, str), args));
    }

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x28(%rsp)
movq %rsi, 0x20(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x13, %eax
je 0x6e47f
movq 0x28(%rsp), %rdi
movq 0x18(%rsp), %rsi
movq 0x28(%rsp), %rax
movq 0x1688(%rax), %rdx
movq 0x20(%rsp), %rcx
movl $0x13, %r8d
movl $0x1, %r9d
callq 0x13c50
movq %rax, 0x30(%rsp)
jmp 0x6e6ae
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq 0x28(%rsp), %rcx
movq 0x1460(%rcx), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jne 0x6e60e
movq 0x18(%rsp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x6e4c3
movq 0x1a7dd7(%rip), %rax    # 0x216290
movq %rax, 0x30(%rsp)
jmp 0x6e6ae
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x28(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x1babf0
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x170(%rax)
movq 0x18(%rsp), %rcx
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x40(%rax)
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x10(%rsp), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1ee, %ecx            # imm = 0x1EE
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rsi
callq 0x16310
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1dc, %ecx            # imm = 0x1DC
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
jmp 0x6e5bf
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x190, %ecx            # imm = 0x190
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rax
movq %rax, 0x30(%rsp)
jmp 0x6e6ae
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movzbl (%rax), %eax
cmpl $0x26, %eax
jl 0x6e642
movq 0x28(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x3cbf0
testb $0x1, %al
jne 0x6e67e
movq 0x28(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rsi
movq 0x28(%rsp), %rax
movq 0x1688(%rax), %rdx
movq 0x20(%rsp), %rcx
movq 0x1b381c(%rip), %r8     # 0x221e88
movl $0x2, %r9d
callq 0x14130
movq %rax, 0x30(%rsp)
jmp 0x6e6ae
movq 0x28(%rsp), %rax
movq %rax, 0x8(%rsp)
movq 0x28(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x1babf0
movq 0x8(%rsp), %rdi
movq %rax, %rsi
movq 0x20(%rsp), %rdx
callq 0x1baeb0
movq %rax, 0x30(%rsp)
movq 0x30(%rsp), %rax
addq $0x38, %rsp
retq
nopl (%rax,%rax)