// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: check_sharp_readers
static s7_pointer check_sharp_readers(s7_scheme *sc, const char *name)
    {
        s7_pointer reader, value, args;
        bool need_loader_port;
        value = sc->F;
        args = sc->F;

        /* *#reader* is assumed to be an alist of (char . proc)
         *    where each proc takes one argument, the string from just beyond the "#" to the next delimiter.
         *    The procedure can call read-char to read ahead in the current-input-port.
         *    If it returns anything other than #f, that is the value of the sharp expression.
         *    Since #f means "nothing found", it is tricky to handle #F:
         *       (cons #\F (lambda (str) (and (string=? str "F") (list 'not #t))))
         * This search happens after #|, #t, and #f (and #nD for multivectors?). #! has a fallback.
         */

        need_loader_port = is_loader_port(sc->input_port);
        if (need_loader_port)
            clear_loader_port(sc->input_port);

        /* normally read* can't read from sc->input_port if it is in use by the loader, but here we are deliberately making that possible. */
        for (reader = slot_value(sc->sharp_readers); is_not_null(reader); reader = cdr(reader))
            if (name[0] == s7_character(caar(reader)))
            {
                if (args == sc->F)
                    args = set_plist_1(sc, s7_make_string_wrapper(sc, name)); /* was list_1(sc, make_string(sc, name)) 16-Nov-18 */
                /* args is GC protected by s7_apply_function?? (placed on the stack) */
                value = s7_apply_function(sc, cdar(reader), args); /* this is much less error-safe than s7_call */
                if (value != sc->F)
                    break;
            }
        if (need_loader_port)
            set_loader_port(sc->input_port);
        return(value);
    }

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x30(%rsp)
movq %rsi, 0x28(%rsp)
movq 0x30(%rsp), %rax
movq 0x120(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x30(%rsp), %rax
movq 0x120(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x30(%rsp), %rax
movq 0x170(%rax), %rax
movq (%rax), %rax
andq $0x40000, %rax          # imm = 0x40000
cmpq $0x0, %rax
setne %al
andb $0x1, %al
movb %al, 0xf(%rsp)
testb $0x1, 0xf(%rsp)
je 0xcdf32
movq 0x30(%rsp), %rax
movq 0x170(%rax), %rax
movq (%rax), %rcx
andq $-0x40001, %rcx         # imm = 0xFFFBFFFF
movq %rcx, (%rax)
movq 0x30(%rsp), %rax
movq 0x1e0(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x20(%rsp), %rax
movq 0x30(%rsp), %rcx
cmpq 0x110(%rcx), %rax
je 0xce012
movq 0x28(%rsp), %rax
movsbl (%rax), %eax
movl %eax, 0x8(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x14450
movb %al, %cl
movl 0x8(%rsp), %eax
movzbl %cl, %ecx
cmpl %ecx, %eax
jne 0xcdffd
movq 0x10(%rsp), %rax
movq 0x30(%rsp), %rcx
cmpq 0x120(%rcx), %rax
jne 0xcdfc5
movq 0x30(%rsp), %rax
movq %rax, (%rsp)
movq 0x30(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x145e0
movq (%rsp), %rdi
movq %rax, %rsi
callq 0x35ea0
movq %rax, 0x10(%rsp)
movq 0x30(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rsi
movq 0x10(%rsp), %rdx
callq 0xda50
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movq 0x30(%rsp), %rcx
cmpq 0x120(%rcx), %rax
je 0xcdffb
jmp 0xce012
jmp 0xcdffd
jmp 0xcdfff
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0xcdf47
testb $0x1, 0xf(%rsp)
je 0xce032
movq 0x30(%rsp), %rax
movq 0x170(%rax), %rax
movq (%rax), %rcx
orq $0x40000, %rcx          # imm = 0x40000
movq %rcx, (%rax)
movq 0x18(%rsp), %rax
addq $0x38, %rsp
retq
nopl (%rax)