// File: /workspace/github_c_makefile_star2_O1/Ihsoh[P]ilang/compiler/preprocessor/gen.c
// Function: pp_gen_new_context
PPGeneratorContext * pp_gen_new_context(
	ParserContext *psrctx,
	const char *include_paths,
	Map *map_kv,
	Map *map_kv_with_params,
	FILE *out,
	ResizableString *result
) {
	assert(psrctx);
	assert(psrctx->ast);
	assert(include_paths);
	assert(out != NULL || result != NULL);

	PPGeneratorContext *ctx = (PPGeneratorContext *)malloc(sizeof(PPGeneratorContext));

	ctx->psrctx = psrctx;
	ctx->out = out;
	ctx->result = result;

	if (map_kv != NULL) {
		ctx->map_kv = map_kv;
	} else {
		ctx->map_kv = (Map *)malloc(sizeof(Map));
		assert(ctx->map_kv);
		map_init(
			ctx->map_kv,
			map_rstr_comparer, map_rstr_comparer,
			(MapReleaser) rstr_delete, (MapReleaser) rstr_delete
		);
	}

	if (map_kv_with_params != NULL) {
		ctx->map_kv_with_params = map_kv_with_params;
	} else {
		ctx->map_kv_with_params = (Map *)malloc(sizeof(Map));
		assert(ctx->map_kv_with_params);
		map_init(
			ctx->map_kv_with_params,
			map_rstr_comparer, NULL,
			(MapReleaser) rstr_delete, (MapReleaser) _delete_gen_func_macro
		);
	}

	ctx->cstr_include_paths = include_paths;

	llst_init(
		&(ctx->include_paths),
		NULL,
		(LinkedListReleaser) rstr_delete
	);

	ResizableString rstr_inc_paths;
	rstr_init_with_cstr(&rstr_inc_paths, include_paths);

	rstr_split(
		&(ctx->include_paths),
		&rstr_inc_paths,
		";",
		true
	);

	rstr_free(&rstr_inc_paths);

	return ctx;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
testq %rdi, %rdi
je 0x28b30
movq %rdi, %rbx
cmpq $0x0, 0x8(%rdi)
je 0x28b4f
testq %rsi, %rsi
je 0x28b6e
movq %r9, %r13
movq %r8, %r15
movq %rcx, -0x38(%rbp)
movq %rsi, -0x30(%rbp)
movq %r8, %rax
orq %r9, %rax
je 0x28b8d
movq %rdx, %r12
movl $0x58, %edi
callq 0xa120
movq %rax, %r14
movq %rbx, (%rax)
movq %r15, 0x8(%rax)
movq %r13, 0x10(%rax)
testq %r12, %r12
je 0x28a58
movq %r12, 0x18(%r14)
jmp 0x28a8b
movl $0x48, %edi
callq 0xa120
movq %rax, 0x18(%r14)
testq %rax, %rax
je 0x28bac
leaq -0x1bd1e(%rip), %rdx    # 0xcd58
leaq -0x1a0dd(%rip), %rcx    # 0xe9a0
movq %rax, %rdi
movq %rdx, %rsi
movq %rcx, %r8
callq 0xc4ec
movq -0x38(%rbp), %rax
testq %rax, %rax
je 0x28a9a
movq %rax, 0x20(%r14)
jmp 0x28ad0
movl $0x48, %edi
callq 0xa120
movq %rax, 0x20(%r14)
testq %rax, %rax
je 0x28bcb
leaq -0x1bd60(%rip), %rsi    # 0xcd58
leaq -0x1a11f(%rip), %rcx    # 0xe9a0
leaq 0x124(%rip), %r8        # 0x28bea
movq %rax, %rdi
xorl %edx, %edx
callq 0xc4ec
movq -0x30(%rbp), %r12
movq %r12, 0x28(%r14)
movq %r14, %rbx
addq $0x30, %rbx
leaq -0x1a146(%rip), %rdx    # 0xe9a0
movq %rbx, %rdi
xorl %esi, %esi
callq 0xbccc
leaq -0x48(%rbp), %r15
movq %r15, %rdi
movq %r12, %rsi
callq 0xe497
leaq 0x77bd(%rip), %rdx      # 0x302c3
movq %rbx, %rdi
movq %r15, %rsi
movl $0x1, %ecx
callq 0xefe1
movq %r15, %rdi
callq 0xe958
movq %r14, %rax
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0xde99(%rip), %rdi      # 0x369d0
leaq 0xde46(%rip), %rsi      # 0x36984
leaq 0xdecc(%rip), %rcx      # 0x36a11
movl $0x41c, %edx            # imm = 0x41C
callq 0xa0b0
leaq 0xde86(%rip), %rdi      # 0x369dc
leaq 0xde27(%rip), %rsi      # 0x36984
leaq 0xdead(%rip), %rcx      # 0x36a11
movl $0x41d, %edx            # imm = 0x41D
callq 0xa0b0
leaq 0xdf0b(%rip), %rdi      # 0x36a80
leaq 0xde08(%rip), %rsi      # 0x36984
leaq 0xde8e(%rip), %rcx      # 0x36a11
movl $0x41e, %edx            # imm = 0x41E
callq 0xa0b0
leaq 0xdefa(%rip), %rdi      # 0x36a8e
leaq 0xdde9(%rip), %rsi      # 0x36984
leaq 0xde6f(%rip), %rcx      # 0x36a11
movl $0x41f, %edx            # imm = 0x41F
callq 0xa0b0
leaq 0xdef9(%rip), %rdi      # 0x36aac
leaq 0xddca(%rip), %rsi      # 0x36984
leaq 0xde50(%rip), %rcx      # 0x36a11
movl $0x42b, %edx            # imm = 0x42B
callq 0xa0b0
leaq 0xdee6(%rip), %rdi      # 0x36ab8
leaq 0xddab(%rip), %rsi      # 0x36984
leaq 0xde31(%rip), %rcx      # 0x36a11
movl $0x437, %edx            # imm = 0x437
callq 0xa0b0