// File: /workspace/github_c_makefile_star2_O2/Encryptr[P]O-plus-plus/opp/lexer/lexer.c
// Function: opp_lex_char
enum Opp_Token opp_lex_char(struct Opp_Scan* s)
{
	switch (*s->src)
	{
		case '(':  
			return TOPENP;

		case ')': 
			return TCLOSEP;

		case ',': 
			return TCOMMA; 

		case '[': 
			return TOPENB;
		
		case ']':
			return TCLOSEB;

		case ';': 
			return TSEMICOLON; 

		case '{': 
			return TOPENC;

		case '}': 
			return TCLOSEC;


		case ':': 
			return TCOLON;

		case '~':
			return TBITNOT;

		case '^':
			return TBITXOR;

		case '.': {
			INCR;
			if (*s->src == '.' && s->src[1] == '.') {
				INCR;
				return TVA_ARGS;
			}
			DECR;
			return TDOT;
		}

		case '-': {
			INCR;
			if (*s->src == '-') 
				return TDECR;
			DECR;
			return TMIN;
		}

		case '+': {
			INCR;
			if (*s->src == '+') 
				return TINCR;
			DECR;
			return TADD;
		}
			
		case '>': {
			INCR; 
			if (*s->src == '=') 
				return TGE;
			else if (*s->src == '>')
				return TSHR;
			DECR; 
			return TGT;
		}

		case '<': {
			INCR; 
			if (*s->src == '=') 
				return TLE;
			else if (*s->src == '<')
				return TSHL;
			DECR; 
			return TLT;
		}
		
		case '&': {
			INCR; 
			if (*s->src == '&') 
				return TAND; 
			DECR; 
			return TADDR;
		}

		case '|': {
			INCR; 
			if (*s->src == '|') 
				return TOR; 
			DECR; 
			return TBITOR;
		}

		case '=': {
			INCR; 
			if (*s->src == '=') 
				return TEQEQ; 
			DECR; 
			return TEQ;
		}

		case '!': {
			INCR; 
			if (*s->src == '=') 
				return TNOTEQ; 
			DECR; 
			return TNOT;
		}

		case '/': {
			INCR;
			 if (*s->src == '=') 
				return TDIVEQ; 
			DECR; 
			return TDIV;
		}

		case '*': {
			INCR; 
			if (*s->src == '=') 
				return TMULEQ; 
			DECR; 
			return TMUL;
		}

		case '%': {
			INCR; 
			if (*s->src == '=') 
				return TMODEQ; 
			DECR; 
			return TMOD;
		}

		case '\'': { 
			INCR;
			// add espcaps
			s->t.buffer.buf[0] = *s->src;
			s->t.buffer.buf[1] = 0;
			INCR;

			if (*s->src != '\'')
				opp_error(s, "Expected terminating ' next to '%s'",
					s->t.buffer.buf);

			return TCH;
		}

		default: break;
	}
	return INVALID;
}

// Assembly:
movq (%rdi), %rax
movzbl (%rax), %ecx
leal -0x21(%rcx), %edx
cmpl $0x1d, %edx
ja 0x9868
leaq 0x264e(%rip), %rcx      # 0xbe8c
movslq (%rcx,%rdx,4), %rdx
addq %rcx, %rdx
jmpq *%rdx
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x3d, 0x1(%rax)
jne 0x9adb
pushq $0xe
jmp 0x9b31
leal -0x7b(%rcx), %edx
cmpl $0x3, %edx
ja 0x9887
leaq 0x268d(%rip), %rcx      # 0xbf04
movslq (%rcx,%rdx,4), %rdx
addq %rcx, %rdx
jmpq *%rdx
pushq $0x27
jmp 0x9b31
cmpl $0x5b, %ecx
je 0x9a8b
cmpl $0x5d, %ecx
je 0x9a92
cmpl $0x5e, %ecx
jne 0x98a5
pushq $0x2d
jmp 0x9b31
xorl %eax, %eax
retq
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x3d, 0x1(%rax)
jne 0x9abd
pushq $0xd
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x2e, 0x1(%rax)
jne 0x9ab3
cmpb $0x2e, 0x2(%rax)
jne 0x9ab3
addq $0x2, %rax
movq %rax, (%rdi)
addl $0x2, %ecx
movl %ecx, 0x2c(%rdi)
pushq $0x1c
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x3d, 0x1(%rax)
jne 0x9ac7
pushq $0x1f
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x3d, 0x1(%rax)
jne 0x9ad1
pushq $0x20
jmp 0x9b31
pushq $0x24
jmp 0x9b31
pushq $0x23
jmp 0x9b31
pushq $0x1b
jmp 0x9b31
pushq $0x2a
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x26, 0x1(%rax)
jne 0x9ae5
pushq $0x8
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
incl 0x2c(%rdi)
movb 0x1(%rax), %al
movq 0x38(%rdi), %rcx
movb %al, (%rcx)
movq 0x38(%rdi), %rax
movb $0x0, 0x1(%rax)
movq (%rdi), %rax
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
incl 0x2c(%rdi)
cmpb $0x27, 0x1(%rax)
jne 0x9b33
pushq $0x6
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x3d, 0x1(%rax)
jne 0x9aef
pushq $0x21
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
movzbl 0x1(%rax), %edx
cmpl $0x3d, %edx
je 0x9b17
cmpl $0x3e, %edx
jne 0x9b1f
pushq $0x2c
jmp 0x9b31
pushq $0x22
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x2b, 0x1(%rax)
jne 0x9af9
pushq $0x19
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x2d, 0x1(%rax)
jne 0x9b03
pushq $0x18
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
movzbl 0x1(%rax), %edx
cmpl $0x3d, %edx
je 0x9b1b
cmpl $0x3c, %edx
jne 0x9b29
pushq $0x2b
jmp 0x9b31
pushq $0x28
jmp 0x9b31
pushq $0x2f
jmp 0x9b31
pushq $0x25
jmp 0x9b31
pushq $0x26
jmp 0x9b31
leaq 0x1(%rax), %rcx
movq %rcx, (%rdi)
movl 0x2c(%rdi), %ecx
leal 0x1(%rcx), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x7c, 0x1(%rax)
jne 0x9b0d
pushq $0x7
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x29
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0xf
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x15
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x16
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x10
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x1a
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x17
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x13
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x14
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x2e
jmp 0x9b31
pushq $0xc
jmp 0x9b31
pushq $0xa
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0x9
jmp 0x9b31
movq %rax, (%rdi)
movl %ecx, 0x2c(%rdi)
pushq $0xb
popq %rax
retq
pushq %rax
movq 0x38(%rdi), %rdx
leaq 0x2488(%rip), %rsi      # 0xbfc7
xorl %eax, %eax
callq 0x919e