// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: read_expression
static s7_pointer read_expression(s7_scheme *sc)
                {
                    while (true)
                    {
                        int32_t c;
                        switch (sc->tok)
                        {
                            case TOKEN_EOF:
                                return(eof_object);

                            case TOKEN_BYTE_VECTOR:
                                push_stack_no_let_no_code(sc, OP_READ_BYTE_VECTOR, sc->w);
                                sc->tok = TOKEN_LEFT_PAREN;
                                break;

                            case TOKEN_INT_VECTOR:
                                push_stack_no_let_no_code(sc, OP_READ_INT_VECTOR, sc->w);
                                sc->tok = TOKEN_LEFT_PAREN;
                                break;

                            case TOKEN_FLOAT_VECTOR:
                                push_stack_no_let_no_code(sc, OP_READ_FLOAT_VECTOR, sc->w);
                                sc->tok = TOKEN_LEFT_PAREN;
                                break;

                            case TOKEN_VECTOR:         /* already read #( -- TOKEN_VECTOR is triggered by #( */
                                push_stack_no_let_no_code(sc, OP_READ_VECTOR, sc->w);   /* sc->w is the dimensions */
                                /* fall through */

                            case TOKEN_LEFT_PAREN:
                                sc->tok = token(sc);

                                if (sc->tok == TOKEN_RIGHT_PAREN)
                                    return(sc->nil);

                                if (sc->tok == TOKEN_DOT)
                                {
                                    back_up_stack(sc);
                                    do {c = inchar(sc->input_port);} while ((c != ')') && (c != EOF));
                                    return(read_error(sc, "stray dot after '('?"));         /* (car '( . )) */
                                }

                                if (sc->tok == TOKEN_EOF)
                                    return(missing_close_paren_error(sc));

                                push_stack_no_let_no_code(sc, OP_READ_LIST, sc->nil);
                                /* here we need to clear args, but code is ignored */

                                check_stack_size(sc);
                                break;

                            case TOKEN_QUOTE:
                                push_stack_no_let_no_code(sc, OP_READ_QUOTE, sc->nil);
                                sc->tok = token(sc);
                                break;

                            case TOKEN_BACK_QUOTE:
                                sc->tok = token(sc);
                                push_stack_no_let_no_code(sc, OP_READ_QUASIQUOTE, sc->nil);
                                break;

                            case TOKEN_COMMA:
                                push_stack_no_let_no_code(sc, OP_READ_UNQUOTE, sc->nil);
                                sc->tok = token(sc);
                                switch (sc->tok)
                                {
                                    case TOKEN_EOF:
                                        pop_stack(sc);
                                        return(read_error(sc, "stray comma at the end of the input?"));

                                    case TOKEN_RIGHT_PAREN:
                                        return(read_expression_read_error(sc));

                                    default:
                                        break;
                                }
                                break;

                            case TOKEN_AT_MARK:
                                push_stack_no_let_no_code(sc, OP_READ_APPLY_VALUES, sc->nil);
                                sc->tok = token(sc);
                                break;

                            case TOKEN_ATOM:
                                return(port_read_name(sc->input_port)(sc, sc->input_port));
                                /* If reading list (from lparen), this will finally get us to op_read_list */

                            case TOKEN_DOUBLE_QUOTE:
                                read_double_quote(sc);
                                return(sc->value);

                            case TOKEN_SHARP_CONST:
                                return(port_read_sharp(sc->input_port)(sc, sc->input_port));

                            case TOKEN_DOT:                                             /* (catch #t (lambda () (+ 1 . . )) (lambda args 'hiho)) */
                                back_up_stack(sc);
                                do {c = inchar(sc->input_port);} while ((c != ')') && (c != EOF));
                                return(read_error(sc, "stray dot in list?"));             /* (+ 1 . . ) */

                            case TOKEN_RIGHT_PAREN:                                     /* (catch #t (lambda () '(1 2 . )) (lambda args 'hiho)) */
                                back_up_stack(sc);
                                return(read_error(sc, "unexpected close paren"));         /* (+ 1 2)) or (+ 1 . ) */
                        }
                    }
                    /* we never get here */
                    return(sc->nil);
                }

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x28(%rsp)
movq 0x28(%rsp), %rax
movl 0x30(%rax), %eax
movq %rax, 0x18(%rsp)
subq $0xe, %rax
ja 0x1598b7
movq 0x18(%rsp), %rax
leaq 0x873f0(%rip), %rcx     # 0x1e075c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0xbcf14(%rip), %rax     # 0x216290
movq %rax, 0x30(%rsp)
jmp 0x1598bc
jmp 0x159388
movq 0x28(%rsp), %rax
movq 0x4d8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d9, %ecx            # imm = 0x1D9
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rax
movl $0x1, 0x30(%rax)
jmp 0x1598b7
jmp 0x1593d7
movq 0x28(%rsp), %rax
movq 0x4d8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1da, %ecx            # imm = 0x1DA
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rax
movl $0x1, 0x30(%rax)
jmp 0x1598b7
jmp 0x159426
movq 0x28(%rsp), %rax
movq 0x4d8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1db, %ecx            # imm = 0x1DB
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rax
movl $0x1, 0x30(%rax)
jmp 0x1598b7
jmp 0x159475
movq 0x28(%rsp), %rax
movq 0x4d8(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d8, %ecx            # imm = 0x1D8
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
jmp 0x1594b3
movq 0x28(%rsp), %rdi
callq 0xc9560
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
movq 0x28(%rsp), %rax
cmpl $0x2, 0x30(%rax)
jne 0x1594e8
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rax
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rax
cmpl $0x3, 0x30(%rax)
jne 0x15954e
movq 0x28(%rsp), %rdi
callq 0x1981f0
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rdi
callq 0xca3d0
movl %eax, 0x24(%rsp)
xorl %eax, %eax
cmpl $0x29, 0x24(%rsp)
movb %al, 0x17(%rsp)
je 0x15952b
cmpl $-0x1, 0x24(%rsp)
setne %al
movb %al, 0x17(%rsp)
movb 0x17(%rsp), %al
testb $0x1, %al
jne 0x1594fd
movq 0x28(%rsp), %rdi
leaq 0x962af(%rip), %rsi     # 0x1ef7ee
callq 0xdfe00
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rax
cmpl $0x0, 0x30(%rax)
jne 0x15956d
movq 0x28(%rsp), %rdi
callq 0x158a70
movq %rax, 0x30(%rsp)
jmp 0x1598bc
jmp 0x15956f
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d1, %ecx            # imm = 0x1D1
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
jmp 0x1595ad
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq 0x28(%rsp), %rcx
cmpq 0x58(%rcx), %rax
jb 0x1595cb
movq 0x28(%rsp), %rdi
callq 0x10fdc0
jmp 0x1595cd
jmp 0x1598b7
jmp 0x1595d4
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d4, %ecx            # imm = 0x1D4
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rdi
callq 0xc9560
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
jmp 0x1598b7
movq 0x28(%rsp), %rdi
callq 0xc9560
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d5, %ecx            # imm = 0x1D5
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
jmp 0x1598b7
jmp 0x159680
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d6, %ecx            # imm = 0x1D6
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rdi
callq 0xc9560
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
movq 0x28(%rsp), %rax
movl 0x30(%rax), %eax
movl %eax, 0x10(%rsp)
testl %eax, %eax
je 0x1596ed
jmp 0x1596e2
movl 0x10(%rsp), %eax
subl $0x2, %eax
je 0x159747
jmp 0x15975b
jmp 0x1596ef
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $-0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rax
movq 0x28(%rsp), %rcx
movq 0x50(%rcx), %rcx
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rdi
leaq 0x97e4e(%rip), %rsi     # 0x1f1586
callq 0xdfe00
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rdi
callq 0x198390
movq %rax, 0x30(%rsp)
jmp 0x1598bc
jmp 0x15975d
jmp 0x1598b7
jmp 0x159764
movq 0x28(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rax
movl $0x1d7, %ecx            # imm = 0x1D7
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x50(%rax), %rcx
addq $0x20, %rcx
movq %rcx, 0x50(%rax)
movq 0x28(%rsp), %rdi
callq 0xc9560
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
jmp 0x1598b7
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rax
movq 0x8(%rax), %rax
movq 0x48(%rax), %rax
movq 0x28(%rax), %rax
movq 0x28(%rsp), %rdi
movq 0x28(%rsp), %rcx
movq 0x170(%rcx), %rsi
callq *%rax
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rdi
callq 0x1598d0
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rax
movq 0x8(%rax), %rax
movq 0x48(%rax), %rax
movq 0x30(%rax), %rax
movq 0x28(%rsp), %rdi
movq 0x28(%rsp), %rcx
movq 0x170(%rcx), %rsi
callq *%rax
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rdi
callq 0x1981f0
movq 0x28(%rsp), %rax
movq 0x170(%rax), %rdi
callq 0xca3d0
movl %eax, 0x24(%rsp)
xorl %eax, %eax
cmpl $0x29, 0x24(%rsp)
movb %al, 0xf(%rsp)
je 0x159875
cmpl $-0x1, 0x24(%rsp)
setne %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x159847
movq 0x28(%rsp), %rdi
leaq 0x97d22(%rip), %rsi     # 0x1f15ab
callq 0xdfe00
movq %rax, 0x30(%rsp)
jmp 0x1598bc
movq 0x28(%rsp), %rdi
callq 0x1981f0
movq 0x28(%rsp), %rdi
leaq 0x95f75(%rip), %rsi     # 0x1ef820
callq 0xdfe00
movq %rax, 0x30(%rsp)
jmp 0x1598bc
jmp 0x159349
movq 0x30(%rsp), %rax
addq $0x38, %rsp
retq
nopw %cs:(%rax,%rax)