// File: arnoldrobbins[P]mcilroy-regex/re2.cpp
// Function: token(Cenv*)
static int
token(Cenv *env)
{
	long n = env->cursor.n;
	if(n <= 0)
		return T_END;
	int c = *env->cursor.p;
	if(env->flags & REG_LITERAL)
		return c;
	if(env->posixkludge) {
		env->posixkludge = 0;
		if(c ==	'*')
			return c;	// * first in subexr
	}
	if(c == '\\') {
		if(n < 2)
			return T_BAD;
		c = env->cursor.p[1];
		if(c=='(' && env->retype==BRE)
			env->posixkludge = 1;
		else if(c==')' && env->retype==BRE && env->parnest==0)
			return T_BAD;
		if(escindex[c])
			return escape[escindex[c]].val[env->retype].esc;
		else
			return T_BAD;
	}
	if(c=='$' && n==1)
		return T_DOLL;
	else if(c=='^' && env->retype==BRE && env->cursor.p==env->expr.p) {
		env->posixkludge = 1;
		return T_CFLX;
	} else if(c==')' && env->retype!=BRE && env->parnest==0)
		return c;
	return escindex[c]? escape[escindex[c]].val[env->retype].unesc: c;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movslq 0x10(%rax), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jg 0xe7e7
movl $0x103, -0x4(%rbp)      # imm = 0x103
jmp 0xe9c9
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movzbl (%rax), %eax
movl %eax, -0x1c(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
andl $0x100, %eax            # imm = 0x100
cmpl $0x0, %eax
je 0xe810
movl -0x1c(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0xe9c9
movq -0x10(%rbp), %rax
cmpl $0x0, 0x48(%rax)
je 0xe838
movq -0x10(%rbp), %rax
movl $0x0, 0x48(%rax)
cmpl $0x2a, -0x1c(%rbp)
jne 0xe836
movl -0x1c(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0xe9c9
jmp 0xe838
cmpl $0x5c, -0x1c(%rbp)
jne 0xe900
cmpq $0x2, -0x18(%rbp)
jge 0xe855
movl $0x104, -0x4(%rbp)      # imm = 0x104
jmp 0xe9c9
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0x1(%rax), %eax
movl %eax, -0x1c(%rbp)
cmpl $0x28, -0x1c(%rbp)
jne 0xe884
movq -0x10(%rbp), %rax
movzbl 0x3a(%rax), %eax
cmpl $0x0, %eax
jne 0xe884
movq -0x10(%rbp), %rax
movl $0x1, 0x48(%rax)
jmp 0xe8af
cmpl $0x29, -0x1c(%rbp)
jne 0xe8ad
movq -0x10(%rbp), %rax
movzbl 0x3a(%rax), %eax
cmpl $0x0, %eax
jne 0xe8ad
movq -0x10(%rbp), %rax
cmpl $0x0, 0x34(%rax)
jne 0xe8ad
movl $0x104, -0x4(%rbp)      # imm = 0x104
jmp 0xe9c9
jmp 0xe8af
movslq -0x1c(%rbp), %rcx
leaq 0x9c96(%rip), %rax      # 0x18550
cmpb $0x0, (%rax,%rcx)
je 0xe8f4
movslq -0x1c(%rbp), %rcx
leaq 0x9c85(%rip), %rax      # 0x18550
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x9618(%rip), %rax      # 0x17ef0
imulq $0xe, %rcx, %rcx
addq %rcx, %rax
movq -0x10(%rbp), %rcx
movzbl 0x3a(%rcx), %ecx
movswl 0x4(%rax,%rcx,4), %eax
movl %eax, -0x4(%rbp)
jmp 0xe9c9
movl $0x104, -0x4(%rbp)      # imm = 0x104
jmp 0xe9c9
cmpl $0x24, -0x1c(%rbp)
jne 0xe919
cmpq $0x1, -0x18(%rbp)
jne 0xe919
movl $0x105, -0x4(%rbp)      # imm = 0x105
jmp 0xe9c9
cmpl $0x5e, -0x1c(%rbp)
jne 0xe952
movq -0x10(%rbp), %rax
movzbl 0x3a(%rax), %eax
cmpl $0x0, %eax
jne 0xe952
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jne 0xe952
movq -0x10(%rbp), %rax
movl $0x1, 0x48(%rax)
movl $0x101, -0x4(%rbp)      # imm = 0x101
jmp 0xe9c9
cmpl $0x29, -0x1c(%rbp)
jne 0xe977
movq -0x10(%rbp), %rax
movzbl 0x3a(%rax), %eax
cmpl $0x0, %eax
je 0xe977
movq -0x10(%rbp), %rax
cmpl $0x0, 0x34(%rax)
jne 0xe977
movl -0x1c(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0xe9c9
jmp 0xe979
jmp 0xe97b
movslq -0x1c(%rbp), %rcx
leaq 0x9bca(%rip), %rax      # 0x18550
cmpb $0x0, (%rax,%rcx)
je 0xe9bd
movslq -0x1c(%rbp), %rcx
leaq 0x9bb9(%rip), %rax      # 0x18550
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x954c(%rip), %rax      # 0x17ef0
imulq $0xe, %rcx, %rcx
addq %rcx, %rax
movq -0x10(%rbp), %rcx
movzbl 0x3a(%rcx), %ecx
movswl 0x2(%rax,%rcx,4), %eax
movl %eax, -0x20(%rbp)
jmp 0xe9c3
movl -0x1c(%rbp), %eax
movl %eax, -0x20(%rbp)
movl -0x20(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
popq %rbp
retq
nop