// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/pre-process.c
// Function: init_preprocessor
static void init_preprocessor(void)
{
	int i;
	int stream = init_stream(NULL, "preprocessor", -1, includepath);
	static struct {
		const char *name;
		int (*handler)(struct stream *, struct token **, struct token *);
	} normal[] = {
		{ "define",		handle_define },
		{ "weak_define",	handle_weak_define },
		{ "strong_define",	handle_strong_define },
		{ "undef",		handle_undef },
		{ "strong_undef",	handle_strong_undef },
		{ "warning",		handle_warning },
		{ "error",		handle_error },
		{ "include",		handle_include },
		{ "include_next",	handle_include_next },
		{ "pragma",		handle_pragma },
		{ "line",		handle_line },
		{ "ident",		handle_ident },

		// our internal preprocessor tokens
		{ "nostdinc",	   handle_nostdinc },
		{ "add_include",   handle_add_include },
		{ "add_isystem",   handle_add_isystem },
		{ "add_system",    handle_add_system },
		{ "add_dirafter",  handle_add_dirafter },
		{ "split_include", handle_split_include },
		{ "argv_include",  handle_argv_include },
	}, special[] = {
		{ "ifdef",	handle_ifdef },
		{ "ifndef",	handle_ifndef },
		{ "else",	handle_else },
		{ "endif",	handle_endif },
		{ "if",		handle_if },
		{ "elif",	handle_elif },
	};
	static struct {
		const char *name;
		void (*expand_simple)(struct token *);
		bool (*expand)(struct token *, struct arg *args);
	} dynamic[] = {
		{ "__LINE__",		expand_line },
		{ "__FILE__",		expand_file },
		{ "__BASE_FILE__",	expand_basefile },
		{ "__DATE__",		expand_date },
		{ "__TIME__",		expand_time },
		{ "__COUNTER__",	expand_counter },
		{ "__INCLUDE_LEVEL__",	expand_include_level },
		{ "__has_attribute",	NULL, expand_has_attribute },
		{ "__has_builtin",	NULL, expand_has_builtin },
		{ "__has_extension",	NULL, expand_has_extension },
		{ "__has_feature",	NULL, expand_has_feature },
	};

	for (i = 0; i < ARRAY_SIZE(normal); i++) {
		struct symbol *sym;
		sym = create_symbol(stream, normal[i].name, SYM_PREPROCESSOR, NS_PREPROCESSOR);
		sym->handler = normal[i].handler;
		sym->normal = 1;
	}
	for (i = 0; i < ARRAY_SIZE(special); i++) {
		struct symbol *sym;
		sym = create_symbol(stream, special[i].name, SYM_PREPROCESSOR, NS_PREPROCESSOR);
		sym->handler = special[i].handler;
		sym->normal = 0;
	}
	for (i = 0; i < ARRAY_SIZE(dynamic); i++) {
		struct symbol *sym;
		sym = create_symbol(stream, dynamic[i].name, SYM_NODE, NS_MACRO);
		sym->expand_simple = dynamic[i].expand_simple;
		if ((sym->expand = dynamic[i].expand) != NULL)
			create_arglist(sym, 1);
	}

	counter_macro = 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
xorl %eax, %eax
movl %eax, %edi
leaq 0x3bece(%rip), %rsi     # 0x67891
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq 0x5ca51(%rip), %rcx     # 0x88420
callq 0x44b60
movl %eax, -0x8(%rbp)
movl $0x0, -0x4(%rbp)
movslq -0x4(%rbp), %rax
cmpq $0x13, %rax
jae 0x2ba47
movl -0x8(%rbp), %edi
movslq -0x4(%rbp), %rcx
leaq 0x5d39a(%rip), %rax     # 0x88d90
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rsi
movl $0x1, %edx
movl $0x40, %ecx
callq 0x40ab0
movq %rax, -0x10(%rbp)
movslq -0x4(%rbp), %rcx
leaq 0x5d372(%rip), %rax     # 0x88d90
shlq $0x4, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x10(%rbp), %rax
movl $0x1, 0x50(%rax)
movl -0x4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4(%rbp)
jmp 0x2b9de
movl $0x0, -0x4(%rbp)
movslq -0x4(%rbp), %rax
cmpq $0x6, %rax
jae 0x2bab7
movl -0x8(%rbp), %edi
movslq -0x4(%rbp), %rcx
leaq 0x5d45a(%rip), %rax     # 0x88ec0
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rsi
movl $0x1, %edx
movl $0x40, %ecx
callq 0x40ab0
movq %rax, -0x18(%rbp)
movslq -0x4(%rbp), %rcx
leaq 0x5d432(%rip), %rax     # 0x88ec0
shlq $0x4, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x18(%rbp), %rax
movl $0x0, 0x50(%rax)
movl -0x4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4(%rbp)
jmp 0x2ba4e
movl $0x0, -0x4(%rbp)
movslq -0x4(%rbp), %rax
cmpq $0xb, %rax
jae 0x2bb57
movl -0x8(%rbp), %edi
movslq -0x4(%rbp), %rcx
leaq 0x5d446(%rip), %rax     # 0x88f20
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq (%rax), %rsi
movl $0x3, %edx
movl $0x1, %ecx
callq 0x40ab0
movq %rax, -0x20(%rbp)
movslq -0x4(%rbp), %rcx
leaq 0x5d41e(%rip), %rax     # 0x88f20
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x60(%rax)
movslq -0x4(%rbp), %rcx
leaq 0x5d400(%rip), %rax     # 0x88f20
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
movq -0x20(%rbp), %rcx
movq %rax, 0x68(%rcx)
cmpq $0x0, %rax
je 0x2bb47
movq -0x20(%rbp), %rdi
movl $0x1, %esi
callq 0x2dbf0
jmp 0x2bb49
movl -0x4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4(%rbp)
jmp 0x2babe
movl $0x0, 0x619cf(%rip)     # 0x8d530
addq $0x20, %rsp
popq %rbp
retq
nopw (%rax,%rax)