// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/pre-process.c
// Function: expression_value
static int expression_value(struct token **where)
{
	struct expression *expr;
	struct token *p;
	struct token **list = where, **beginning = NULL;
	long long value;
	int state = 0;

	while (!eof_token(p = scan_next(list))) {
		switch (state) {
		case 0:
			if (token_type(p) != TOKEN_IDENT)
				break;
			if (p->ident == &defined_ident) {
				state = 1;
				beginning = list;
				break;
			}
			if (!expand_one_symbol(list))
				continue;
			if (token_type(p) != TOKEN_IDENT)
				break;
			token_type(p) = TOKEN_ZERO_IDENT;
			break;
		case 1:
			if (match_op(p, '(')) {
				state = 2;
			} else {
				state = 0;
				replace_with_defined(p);
				*beginning = p;
			}
			break;
		case 2:
			if (token_type(p) == TOKEN_IDENT)
				state = 3;
			else
				state = 0;
			replace_with_defined(p);
			*beginning = p;
			break;
		case 3:
			state = 0;
			if (!match_op(p, ')'))
				sparse_error(p->pos, "missing ')' after \"defined\"");
			*list = p->next;
			continue;
		}
		list = &p->next;
	}

	p = constant_expression(*where, &expr);
	if (!eof_token(p))
		sparse_error(p->pos, "garbage at end: %s", show_token_sequence(p, 0));
	value = get_expression_value(expr);
	return value != 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movl $0x0, -0x34(%rbp)
movq -0x20(%rbp), %rdi
callq 0x2eaf0
movq %rax, -0x18(%rbp)
leaq 0x7c069(%rip), %rcx     # 0xac9c0
cmpq %rcx, %rax
sete %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x30968
jmp 0x30ac9
movl -0x34(%rbp), %eax
movq %rax, -0x40(%rbp)
subq $0x3, %rax
ja 0x30ab8
movq -0x40(%rbp), %rax
leaq 0x36e18(%rip), %rcx     # 0x6779c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x18(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
cmpl $0x3, %eax
je 0x309a2
jmp 0x30ab8
movq -0x18(%rbp), %rax
leaq 0x59963(%rip), %rcx     # 0x8a310
cmpq %rcx, 0x10(%rax)
jne 0x309c7
movl $0x1, -0x34(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x30ab8
movq -0x20(%rbp), %rdi
callq 0x2eb70
cmpl $0x0, %eax
jne 0x309da
jmp 0x30943
movq -0x18(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
cmpl $0x3, %eax
je 0x309ef
jmp 0x30ab8
movq -0x18(%rbp), %rax
movq (%rax), %rcx
andq $-0x40, %rcx
orq $0x4, %rcx
movq %rcx, (%rax)
jmp 0x30ab8
movq -0x18(%rbp), %rdi
movl $0x28, %esi
callq 0x2c380
cmpl $0x0, %eax
je 0x30a22
movl $0x2, -0x34(%rbp)
jmp 0x30a3d
movl $0x0, -0x34(%rbp)
movq -0x18(%rbp), %rdi
callq 0x30b40
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x30ab8
movq -0x18(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
cmpl $0x3, %eax
jne 0x30a58
movl $0x3, -0x34(%rbp)
jmp 0x30a5f
movl $0x0, -0x34(%rbp)
movq -0x18(%rbp), %rdi
callq 0x30b40
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x30ab8
movl $0x0, -0x34(%rbp)
movq -0x18(%rbp), %rdi
movl $0x29, %esi
callq 0x2c380
cmpl $0x0, %eax
jne 0x30aa4
movq -0x18(%rbp), %rax
movq (%rax), %rdi
leaq 0x37270(%rip), %rsi     # 0x67d0d
movb $0x0, %al
callq 0x16f90
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x30943
movq -0x18(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x20(%rbp)
jmp 0x30943
movq -0x8(%rbp), %rax
movq (%rax), %rdi
leaq -0x10(%rbp), %rsi
callq 0x56f40
movq %rax, -0x18(%rbp)
leaq 0x7bedc(%rip), %rax     # 0xac9c0
cmpq %rax, -0x18(%rbp)
je 0x30b15
movq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x2e3c0
movq %rax, %rdx
movq -0x48(%rbp), %rax
movq (%rax), %rdi
leaq 0x3721b(%rip), %rsi     # 0x67d29
movb $0x0, %al
callq 0x16f90
movq -0x10(%rbp), %rdi
callq 0x11ff0
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
setne %al
andb $0x1, %al
movzbl %al, %eax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)