// File: /workspace/github_c_makefile_star2_O0/hoobaa[P]ficl/dictionary.c
// Function: ficlDictionarySee
void ficlDictionarySee(ficlDictionary *dictionary, ficlWord *word, ficlCallback *callback)
{
    char *trace;
    ficlCell *cell = word->param;
    ficlCell *param0 = cell;
    char buffer[128];

    for (; cell->i != ficlInstructionSemiParen; cell++)
    {
        ficlWord *word = (ficlWord *)(cell->p);

        trace = buffer;
        if ((void *)cell == (void *)buffer)
            *trace++ = '>';
        else
            *trace++ = ' ';
        trace += sprintf(trace, "%3d   ", cell - param0);
        
        if (ficlDictionaryIsAWord(dictionary, word))
        {
            ficlWordKind kind = ficlWordClassify(word);
            ficlCell c, c2;

            switch (kind)
            {
            case FICL_WORDKIND_INSTRUCTION:
                sprintf(trace, "%s (instruction %ld)", ficlDictionaryInstructionNames[(long)word], (long)word);
                break;
            case FICL_WORDKIND_INSTRUCTION_WITH_ARGUMENT:
                c = *++cell;
                sprintf(trace, "%s (instruction %ld), with argument %ld (%#lx)", ficlDictionaryInstructionNames[(long)word], (long)word, c.i, c.u);
                break;
            case FICL_WORDKIND_INSTRUCTION_WORD:
                sprintf(trace, "%s :: executes %s (instruction word %ld)", word->name, ficlDictionaryInstructionNames[(long)word->code], (long)word->code);
                break;
            case FICL_WORDKIND_LITERAL:
                c = *++cell;
                if (ficlDictionaryIsAWord(dictionary, c.p) && (c.i >= ficlInstructionLast))
                {
                    ficlWord *word = (ficlWord *)c.p;
                    sprintf(trace, "%.*s ( %#lx literal )", 
                        word->length, word->name, c.u);
                }
                else
                    sprintf(trace, "literal %ld (%#lx)", c.i, c.u);
                break;
            case FICL_WORDKIND_2LITERAL:
                c = *++cell;
                c2 = *++cell;
                sprintf(trace, "2literal %d %d (%#lx %#lx)", c2.i, c.i, c2.u, c.u);
                break;
#if FICL_WANT_FLOAT
            case FICL_WORDKIND_FLITERAL:
                c = *++cell;
                sprintf(trace, "fliteral %f (%#lx)", c.f, c.u);
                break;
#endif /* FICL_WANT_FLOAT */
            case FICL_WORDKIND_STRING_LITERAL:
                {
                    ficlCountedString *counted = (ficlCountedString *)(void *)++cell;
                    cell = (ficlCell *)ficlAlignPointer(counted->text + counted->length + 1) - 1;
                    sprintf(trace, "s\" %.*s\"", counted->length, counted->text);
                }
                break;
            case FICL_WORDKIND_CSTRING_LITERAL:
                {
                    ficlCountedString *counted = (ficlCountedString *)(void *)++cell;
                    cell = (ficlCell *)ficlAlignPointer(counted->text + counted->length + 1) - 1;
                    sprintf(trace, "c\" %.*s\"", counted->length, counted->text);
                }
                break;
            case FICL_WORDKIND_BRANCH0:
                c = *++cell;
                sprintf(trace, "branch0 %d", cell + c.i - param0);
                break;                                                           
            case FICL_WORDKIND_BRANCH:
                c = *++cell;
                sprintf(trace, "branch %d",     cell + c.i - param0);
                break;

            case FICL_WORDKIND_QDO:
                c = *++cell;
                sprintf(trace, "?do (leave %d)",  (ficlCell *)c.p - param0);
                break;
            case FICL_WORDKIND_DO:
                c = *++cell;
                sprintf(trace, "do (leave %d)", (ficlCell *)c.p - param0);
                break;
            case FICL_WORDKIND_LOOP:
                c = *++cell;
                sprintf(trace, "loop (branch %d)", cell + c.i - param0);
                break;
            case FICL_WORDKIND_OF:
                c = *++cell;
                sprintf(trace, "of (branch %d)",      cell + c.i - param0);
                break;
            case FICL_WORDKIND_PLOOP:
                c = *++cell;
                sprintf(trace, "+loop (branch %d)", cell + c.i - param0);
                break;
            default:
                sprintf(trace, "%.*s", word->length, word->name);
                break;
            }
 
        }
        else /* probably not a word - punt and print value */
        {
            sprintf(trace, "%ld ( %#lx )", cell->i, cell->u);
        }

        ficlCallbackTextOut(callback, buffer);
        ficlCallbackTextOut(callback, "\n");
    }

    ficlCallbackTextOut(callback, ";\n");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rax
addq $0x28, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
cmpq $0x2b, (%rax)
je 0x123ad
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
leaq -0xb0(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x28(%rbp), %rax
leaq -0xb0(%rbp), %rcx
cmpq %rcx, %rax
jne 0x11da6
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x20(%rbp)
movb $0x3e, (%rax)
jmp 0x11db8
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x20(%rbp)
movb $0x20, (%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x49ac(%rip), %rsi      # 0x1677e
movb $0x0, %al
callq 0x32d0
movl %eax, %ecx
movq -0x20(%rbp), %rax
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x11b40
cmpl $0x0, %eax
je 0x1235c
movq -0xb8(%rbp), %rdi
callq 0x10720
movl %eax, -0xbc(%rbp)
movl -0xbc(%rbp), %eax
movq %rax, -0xf0(%rbp)
subq $0x16, %rax
ja 0x12332
movq -0xf0(%rbp), %rax
leaq 0x4883(%rip), %rcx      # 0x166bc
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x20(%rbp), %rdi
movq -0xb8(%rbp), %rcx
leaq 0xd0bc(%rip), %rax      # 0x1ef10
movq (%rax,%rcx,8), %rdx
movq -0xb8(%rbp), %rcx
leaq 0x491f(%rip), %rsi      # 0x16785
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0xb8(%rbp), %rcx
leaq 0xd072(%rip), %rax      # 0x1ef10
movq (%rax,%rcx,8), %rdx
movq -0xb8(%rbp), %rcx
movq -0xc8(%rbp), %r8
movq -0xc8(%rbp), %r9
leaq 0x48dc(%rip), %rsi      # 0x1679a
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x20(%rbp), %rdi
movq -0xb8(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0xb8(%rbp), %rax
movq 0x18(%rax), %rcx
leaq 0xd025(%rip), %rax      # 0x1ef10
movq (%rax,%rcx,8), %rcx
movq -0xb8(%rbp), %rax
movq 0x18(%rax), %r8
leaq 0x48c8(%rip), %rsi      # 0x167c9
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x8(%rbp), %rdi
movq -0xc8(%rbp), %rsi
callq 0x11b40
cmpl $0x0, %eax
je 0x11f88
cmpq $0xb4, -0xc8(%rbp)
jl 0x11f88
movq -0xc8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x20(%rbp), %rdi
movq -0xd8(%rbp), %rax
movzbl 0xb(%rax), %edx
movq -0xd8(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0xc8(%rbp), %r8
leaq 0x4873(%rip), %rsi      # 0x167f2
movb $0x0, %al
callq 0x32d0
jmp 0x11fa8
movq -0x20(%rbp), %rdi
movq -0xc8(%rbp), %rdx
movq -0xc8(%rbp), %rcx
leaq 0x4867(%rip), %rsi      # 0x16808
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xd0(%rbp)
movq -0x20(%rbp), %rdi
movq -0xd0(%rbp), %rdx
movq -0xc8(%rbp), %rcx
movq -0xd0(%rbp), %r8
movq -0xc8(%rbp), %r9
leaq 0x4813(%rip), %rsi      # 0x1681b
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movss -0xc8(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movq -0xc8(%rbp), %rdx
leaq 0x47ea(%rip), %rsi      # 0x16836
movb $0x1, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rdi
addq $0x1, %rdi
movq -0xe0(%rbp), %rax
movzbl (%rax), %eax
cltq
addq %rax, %rdi
addq $0x1, %rdi
callq 0xfad0
addq $-0x8, %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
movq -0xe0(%rbp), %rax
movzbl (%rax), %edx
movq -0xe0(%rbp), %rcx
addq $0x1, %rcx
leaq 0x4793(%rip), %rsi      # 0x16849
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rdi
addq $0x1, %rdi
movq -0xe8(%rbp), %rax
movzbl (%rax), %eax
cltq
addq %rax, %rdi
addq $0x1, %rdi
callq 0xfad0
addq $-0x8, %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
movq -0xe8(%rbp), %rax
movzbl (%rax), %edx
movq -0xe8(%rbp), %rcx
addq $0x1, %rcx
leaq 0x4732(%rip), %rsi      # 0x16852
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x46ed(%rip), %rsi      # 0x1685b
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x46aa(%rip), %rsi      # 0x16866
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0xc8(%rbp), %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x4671(%rip), %rsi      # 0x16870
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0xc8(%rbp), %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x462f(%rip), %rsi      # 0x16871
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x45ff(%rip), %rsi      # 0x1688f
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x45a1(%rip), %rsi      # 0x1687f
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x30(%rbp), %rax
subq %rax, %rdx
sarq $0x3, %rdx
leaq 0x4565(%rip), %rsi      # 0x1688e
movb $0x0, %al
callq 0x32d0
jmp 0x1235a
movq -0x20(%rbp), %rdi
movq -0xb8(%rbp), %rax
movzbl 0xb(%rax), %edx
movq -0xb8(%rbp), %rax
movq 0x10(%rax), %rcx
leaq 0x454d(%rip), %rsi      # 0x168a0
movb $0x0, %al
callq 0x32d0
jmp 0x1237c
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rax
movq (%rax), %rdx
movq -0x28(%rbp), %rax
movq (%rax), %rcx
leaq 0x4530(%rip), %rsi      # 0x168a5
movb $0x0, %al
callq 0x32d0
movq -0x18(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x10510
movq -0x18(%rbp), %rdi
leaq 0x300e(%rip), %rsi      # 0x153a5
callq 0x10510
movq -0x28(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
jmp 0x11d5b
movq -0x18(%rbp), %rdi
leaq 0x44fa(%rip), %rsi      # 0x168b2
callq 0x10510
addq $0xf0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)