// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/pre-process.c
// Function: combine
static enum token_type combine(struct token *left, struct token *right, char *p)
{
	int len;
	enum token_type t1 = token_type(left), t2 = token_type(right);

	if (t1 != TOKEN_IDENT && t1 != TOKEN_NUMBER && t1 != TOKEN_SPECIAL)
		return TOKEN_ERROR;

	if (t1 == TOKEN_IDENT && left->ident == &L_ident) {
		if (t2 >= TOKEN_CHAR && t2 < TOKEN_WIDE_CHAR)
			return t2 + TOKEN_WIDE_CHAR - TOKEN_CHAR;
		if (t2 == TOKEN_STRING)
			return TOKEN_WIDE_STRING;
	}

	if (t2 != TOKEN_IDENT && t2 != TOKEN_NUMBER && t2 != TOKEN_SPECIAL)
		return TOKEN_ERROR;

	strcpy(p, show_token(left));
	strcat(p, show_token(right));
	len = strlen(p);

	if (len >= 256)
		return TOKEN_ERROR;

	if (t1 == TOKEN_IDENT) {
		if (t2 == TOKEN_SPECIAL)
			return TOKEN_ERROR;
		if (t2 == TOKEN_NUMBER && strpbrk(p, "+-."))
			return TOKEN_ERROR;
		return TOKEN_IDENT;
	}

	if (t1 == TOKEN_NUMBER) {
		if (t2 == TOKEN_SPECIAL) {
			switch (right->special) {
			case '.':
				break;
			case '+': case '-':
				if (strchr("eEpP", p[len - 2]))
					break;
			default:
				return TOKEN_ERROR;
			}
		}
		return TOKEN_NUMBER;
	}

	if (p[0] == '.' && isdigit((unsigned char)p[1]))
		return TOKEN_NUMBER;

	return TOKEN_SPECIAL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
movl %eax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
movl %eax, -0x2c(%rbp)
cmpl $0x3, -0x28(%rbp)
je 0x302fe
cmpl $0x5, -0x28(%rbp)
je 0x302fe
cmpl $0x12, -0x28(%rbp)
je 0x302fe
movl $0x2, -0x4(%rbp)
jmp 0x304b6
cmpl $0x3, -0x28(%rbp)
jne 0x30346
movq -0x10(%rbp), %rax
leaq 0x59e99(%rip), %rcx     # 0x8a1a8
cmpq %rcx, 0x10(%rax)
jne 0x30346
cmpl $0x6, -0x2c(%rbp)
jb 0x30332
cmpl $0xb, -0x2c(%rbp)
jae 0x30332
movl -0x2c(%rbp), %eax
addl $0xb, %eax
subl $0x6, %eax
movl %eax, -0x4(%rbp)
jmp 0x304b6
cmpl $0x10, -0x2c(%rbp)
jne 0x30344
movl $0x11, -0x4(%rbp)
jmp 0x304b6
jmp 0x30346
cmpl $0x3, -0x2c(%rbp)
je 0x30364
cmpl $0x5, -0x2c(%rbp)
je 0x30364
cmpl $0x12, -0x2c(%rbp)
je 0x30364
movl $0x2, -0x4(%rbp)
jmp 0x304b6
movq -0x20(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rdi
callq 0x44420
movq -0x40(%rbp), %rdi
movq %rax, %rsi
callq 0x11090
movq -0x20(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
callq 0x44420
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x112b0
movq -0x20(%rbp), %rdi
callq 0x110c0
movl %eax, -0x24(%rbp)
cmpl $0x100, -0x24(%rbp)     # imm = 0x100
jl 0x303bf
movl $0x2, -0x4(%rbp)
jmp 0x304b6
cmpl $0x3, -0x28(%rbp)
jne 0x3040b
cmpl $0x12, -0x2c(%rbp)
jne 0x303d7
movl $0x2, -0x4(%rbp)
jmp 0x304b6
cmpl $0x5, -0x2c(%rbp)
jne 0x303ff
movq -0x20(%rbp), %rdi
leaq 0x3785d(%rip), %rsi     # 0x67c45
callq 0x11220
cmpq $0x0, %rax
je 0x303ff
movl $0x2, -0x4(%rbp)
jmp 0x304b6
movl $0x3, -0x4(%rbp)
jmp 0x304b6
cmpl $0x5, -0x28(%rbp)
jne 0x30479
cmpl $0x12, -0x2c(%rbp)
jne 0x30470
movq -0x18(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x44(%rbp)
subl $0x2b, %eax
je 0x3043e
jmp 0x30428
movl -0x44(%rbp), %eax
subl $0x2d, %eax
je 0x3043e
jmp 0x30432
movl -0x44(%rbp), %eax
subl $0x2e, %eax
jne 0x30465
jmp 0x3043c
jmp 0x3046e
movq -0x20(%rbp), %rax
movl -0x24(%rbp), %ecx
subl $0x2, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %esi
leaq 0x377f3(%rip), %rdi     # 0x67c49
callq 0x110e0
cmpq $0x0, %rax
je 0x30463
jmp 0x3046e
jmp 0x30465
movl $0x2, -0x4(%rbp)
jmp 0x304b6
jmp 0x30470
movl $0x5, -0x4(%rbp)
jmp 0x304b6
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x2e, %eax
jne 0x304af
callq 0x112f0
movq (%rax), %rax
movq -0x20(%rbp), %rcx
movzbl 0x1(%rcx), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x800, %eax            # imm = 0x800
cmpl $0x0, %eax
je 0x304af
movl $0x5, -0x4(%rbp)
jmp 0x304b6
movl $0x12, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x50, %rsp
popq %rbp
retq
nop