// File: /workspace/github_c_makefile_star2_O0/RodionGork[P]tinyscheme/scheme.c
// Function: scheme_init_custom_alloc
int scheme_init_custom_alloc(scheme * sc, func_alloc malloc,
    func_dealloc free) {
  int i, n = sizeof(dispatch_table) / sizeof(dispatch_table[0]);
  pointer x;

  num_zero.is_fixnum = 1;
  num_zero.value.ivalue = 0;
  num_one.is_fixnum = 1;
  num_one.value.ivalue = 1;

#if USE_INTERFACE
  sc->vptr = &vtbl;
#endif
  sc->gensym_cnt = 0;
  sc->malloc = malloc;
  sc->free = free;
  sc->last_cell_seg = -1;
  sc->backchar = -1;
  sc->sink = &sc->_sink;
  sc->NIL = &sc->_NIL;
  sc->T = &sc->_HASHT;
  sc->F = &sc->_HASHF;
  sc->EOF_OBJ = &sc->_EOF_OBJ;
  sc->free_cell = &sc->_NIL;
  sc->fcells = 0;
  sc->no_memory = 0;
  sc->alloc_seg = sc->malloc(sizeof(*(sc->alloc_seg)) * cell_nsegment);
  sc->cell_seg = sc->malloc(sizeof(*(sc->cell_seg)) * cell_nsegment);
  sc->strbuff = sc->malloc(STRBUFF_INITIAL_SIZE);
  sc->strbuff_size = STRBUFF_INITIAL_SIZE;
  sc->inport = sc->NIL;
  sc->outport = sc->NIL;
  sc->save_inport = sc->NIL;
  sc->loadport = sc->NIL;
  sc->nesting = 0;
  sc->interactive_repl = 0;

  if (alloc_cellseg(sc, FIRST_CELLSEGS) != FIRST_CELLSEGS) {
    sc->no_memory = 1;
    return 0;
  }
  sc->gc_verbose = 0;
  dump_stack_initialize(sc);
  sc->code = sc->NIL;
  sc->tracing = 0;

  /* init sc->NIL */
  typeflag(sc->NIL) = (T_ATOM | MARK);
  car(sc->NIL) = cdr(sc->NIL) = sc->NIL;
  /* init T */
  typeflag(sc->T) = (T_ATOM | MARK);
  car(sc->T) = cdr(sc->T) = sc->T;
  /* init F */
  typeflag(sc->F) = (T_ATOM | MARK);
  car(sc->F) = cdr(sc->F) = sc->F;
  /* init sink */
  typeflag(sc->sink) = (T_PAIR | MARK);
  car(sc->sink) = sc->NIL;
  /* init c_nest */
  sc->c_nest = sc->NIL;

  sc->oblist = oblist_initial_value(sc);
  /* init global_env */
  new_frame_in_env(sc, sc->NIL);
  sc->global_env = sc->envir;
  /* init else */
  x = mk_symbol(sc, "else");
  new_slot_in_env(sc, x, sc->T);

  assign_syntax(sc, "lambda");
  assign_syntax(sc, "quote");
  assign_syntax(sc, "define");
  assign_syntax(sc, "if");
  assign_syntax(sc, "begin");
  assign_syntax(sc, "set!");
  assign_syntax(sc, "let");
  assign_syntax(sc, "let*");
  assign_syntax(sc, "letrec");
  assign_syntax(sc, "cond");
  assign_syntax(sc, "delay");
  assign_syntax(sc, "and");
  assign_syntax(sc, "or");
  assign_syntax(sc, "cons-stream");
  assign_syntax(sc, "macro");
  assign_syntax(sc, "case");

  for (i = 0; i < n; i++) {
    if (dispatch_table[i].name != 0) {
      assign_proc(sc, (enum scheme_opcodes) i, dispatch_table[i].name);
    }
  }

  /* initialization of global pointers to special symbols */
  sc->LAMBDA = mk_symbol(sc, "lambda");
  sc->QUOTE = mk_symbol(sc, "quote");
  sc->QQUOTE = mk_symbol(sc, "quasiquote");
  sc->UNQUOTE = mk_symbol(sc, "unquote");
  sc->UNQUOTESP = mk_symbol(sc, "unquote-splicing");
  sc->FEED_TO = mk_symbol(sc, "=>");
  sc->COLON_HOOK = mk_symbol(sc, "*colon-hook*");
  sc->ERROR_HOOK = mk_symbol(sc, "*error-hook*");
  sc->SHARP_HOOK = mk_symbol(sc, "*sharp-hook*");
  sc->COMPILE_HOOK = mk_symbol(sc, "*compile-hook*");

  return !sc->no_memory;
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x28(%rsp)
movq %rsi, 0x20(%rsp)
movq %rdx, 0x18(%rsp)
movl $0xbd, 0x10(%rsp)
movb $0x1, 0x17016(%rip)     # 0x1ca58
movq $0x0, 0x17013(%rip) # 0x1ca60
movb $0x1, 0x17014(%rip)     # 0x1ca68
movq $0x1, 0x17011(%rip) # 0x1ca70
movq 0x28(%rsp), %rax
movq $0x0, 0xed8(%rax)
movq 0x20(%rsp), %rcx
movq 0x28(%rsp), %rax
movq %rcx, (%rax)
movq 0x18(%rsp), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movl $0xffffffff, 0x28(%rax) # imm = 0xFFFFFFFF
movq 0x28(%rsp), %rax
movl $0xffffffff, 0x2c(%rax) # imm = 0xFFFFFFFF
movq 0x28(%rsp), %rcx
addq $0x58, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x70(%rax)
movq 0x28(%rsp), %rcx
addq $0x78, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x90(%rax)
movq 0x28(%rsp), %rcx
addq $0x98, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xb0(%rax)
movq 0x28(%rsp), %rcx
addq $0xb8, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xd0(%rax)
movq 0x28(%rsp), %rcx
addq $0xd8, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xf0(%rax)
movq 0x28(%rsp), %rcx
addq $0x78, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x160(%rax)
movq 0x28(%rsp), %rax
movq $0x0, 0x168(%rax)
movq 0x28(%rsp), %rax
movb $0x0, 0xa99(%rax)
movq 0x28(%rsp), %rax
movq (%rax), %rax
movslq 0x1563f(%rip), %rdi     # 0x1b190
shlq $0x3, %rdi
callq *%rax
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq (%rax), %rax
movslq 0x1561e(%rip), %rdi     # 0x1b190
shlq $0x3, %rdi
callq *%rax
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x20(%rax)
movq 0x28(%rsp), %rax
movl $0x80, %edi
callq *(%rax)
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xea0(%rax)
movq 0x28(%rsp), %rax
movl $0x80, 0xea8(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x170(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x178(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x180(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x188(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0xa94(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0x50(%rax)
movq 0x28(%rsp), %rdi
movl $0x3, %esi
callq 0x60d0
cmpl $0x3, %eax
je 0x5c56
movq 0x28(%rsp), %rax
movb $0x1, 0xa99(%rax)
movl $0x0, 0x34(%rsp)
jmp 0x60c6
movq 0x28(%rsp), %rax
movb $0x0, 0xa98(%rax)
movq 0x28(%rsp), %rdi
callq 0x6430
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x40(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0x14(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rax
movl $0xc000, (%rax)         # imm = 0xC000
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0xb0(%rax), %rax
movl $0xc000, (%rax)         # imm = 0xC000
movq 0x28(%rsp), %rax
movq 0xb0(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0xb0(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0xb0(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0xd0(%rax), %rax
movl $0xc000, (%rax)         # imm = 0xC000
movq 0x28(%rsp), %rax
movq 0xd0(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0xd0(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0xd0(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x70(%rax), %rax
movl $0x8005, (%rax)         # imm = 0x8005
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq 0x70(%rax), %rax
movq %rcx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x108(%rax)
movq 0x28(%rsp), %rdi
callq 0x6440
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xf8(%rax)
movq 0x28(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x90(%rax), %rsi
callq 0x6460
movq 0x28(%rsp), %rax
movq 0x38(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x100(%rax)
movq 0x28(%rsp), %rdi
leaq 0x118f4(%rip), %rsi     # 0x176cb
callq 0x4e50
movq %rax, 0x8(%rsp)
movq 0x28(%rsp), %rdi
movq 0x8(%rsp), %rsi
movq 0x28(%rsp), %rax
movq 0xb0(%rax), %rdx
callq 0x64e0
movq 0x28(%rsp), %rdi
leaq 0x118c8(%rip), %rsi     # 0x176d0
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x118ff(%rip), %rsi     # 0x17718
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x118ad(%rip), %rsi     # 0x176d7
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x118a3(%rip), %rsi     # 0x176de
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11895(%rip), %rsi     # 0x176e1
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11ce1(%rip), %rsi     # 0x17b3e
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11879(%rip), %rsi     # 0x176e7
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x1186c(%rip), %rsi     # 0x176eb
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11860(%rip), %rsi     # 0x176f0
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x121a7(%rip), %rsi     # 0x18048
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11845(%rip), %rsi     # 0x176f7
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x1183a(%rip), %rsi     # 0x176fd
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11afe(%rip), %rsi     # 0x179d2
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x1181c(%rip), %rsi     # 0x17701
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11817(%rip), %rsi     # 0x1770d
callq 0x6520
movq 0x28(%rsp), %rdi
leaq 0x11b46(%rip), %rsi     # 0x17a4d
callq 0x6520
movl $0x0, 0x14(%rsp)
movl 0x14(%rsp), %eax
cmpl 0x10(%rsp), %eax
jge 0x5f6c
movslq 0x14(%rsp), %rcx
leaq 0x15276(%rip), %rax     # 0x1b1a0
shlq $0x5, %rcx
addq %rcx, %rax
cmpq $0x0, 0x8(%rax)
je 0x5f5d
movq 0x28(%rsp), %rdi
movl 0x14(%rsp), %esi
movslq 0x14(%rsp), %rcx
leaq 0x15253(%rip), %rax     # 0x1b1a0
shlq $0x5, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rdx
callq 0x6560
jmp 0x5f5f
movl 0x14(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x14(%rsp)
jmp 0x5f14
movq 0x28(%rsp), %rdi
leaq 0x11758(%rip), %rsi     # 0x176d0
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x110(%rax)
movq 0x28(%rsp), %rdi
leaq 0x11780(%rip), %rsi     # 0x17718
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x118(%rax)
movq 0x28(%rsp), %rdi
leaq 0x1175b(%rip), %rsi     # 0x17713
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x120(%rax)
movq 0x28(%rsp), %rdi
leaq 0x11746(%rip), %rsi     # 0x1771e
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x128(%rax)
movq 0x28(%rsp), %rdi
leaq 0x1172e(%rip), %rsi     # 0x17726
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x130(%rax)
movq 0x28(%rsp), %rdi
leaq 0x1171f(%rip), %rsi     # 0x17737
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x138(%rax)
movq 0x28(%rsp), %rdi
leaq 0x11702(%rip), %rsi     # 0x1773a
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x140(%rax)
movq 0x28(%rsp), %rdi
leaq 0x116ef(%rip), %rsi     # 0x17747
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x148(%rax)
movq 0x28(%rsp), %rdi
leaq 0x116dc(%rip), %rsi     # 0x17754
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x150(%rax)
movq 0x28(%rsp), %rdi
leaq 0x116c9(%rip), %rsi     # 0x17761
callq 0x4e50
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x158(%rax)
movq 0x28(%rsp), %rax
cmpb $0x0, 0xa99(%rax)
setne %al
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, 0x34(%rsp)
movl 0x34(%rsp), %eax
addq $0x38, %rsp
retq
nop