// File: /workspace/github_c_makefile_star2_O3/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), %rcx
movzbl (%rcx), %eax
cmpl $0x5c, %eax
jg 0x9e55
leal -0x21(%rax), %edx
cmpl $0x1d, %edx
ja 0x9e83
leaq 0x304b(%rip), %rax      # 0xce6c
movslq (%rax,%rdx,4), %rdx
addq %rax, %rdx
jmpq *%rdx
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0xe, %eax
cmpb $0x3d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x10, %eax
retq
leal -0x7b(%rax), %edx
cmpl $0x3, %edx
ja 0x9e73
leaq 0x3080(%rip), %rax      # 0xcee4
movslq (%rax,%rdx,4), %rdx
addq %rax, %rdx
jmpq *%rdx
movl $0x27, %eax
retq
cmpl $0x5d, %eax
je 0x9ec5
cmpl $0x5e, %eax
jne 0x9ecb
movl $0x2d, %eax
retq
cmpl $0x5b, %eax
jne 0x9ecb
movl $0x25, %eax
retq
movl $0x28, %eax
retq
movl $0x2f, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x7, %eax
cmpb $0x7c, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x2e, %eax
retq
movl $0x26, %eax
retq
xorl %eax, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0xd, %eax
cmpb $0x3d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0xf, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x18, %eax
cmpb $0x2d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x14, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
incl 0x2c(%rdi)
movb 0x1(%rcx), %al
movq 0x38(%rdi), %rcx
movb %al, (%rcx)
movq 0x38(%rdi), %rax
movb $0x0, 0x1(%rax)
movq (%rdi), %rcx
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
incl 0x2c(%rdi)
movl $0x6, %eax
cmpb $0x27, 0x1(%rcx)
jne 0xa0f8
retq
movl $0x24, %eax
retq
movl $0x23, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x21, %eax
cmpb $0x3d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x17, %eax
retq
movl $0x22, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x8, %eax
cmpb $0x26, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x1a, %eax
retq
movl $0x2a, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %eax
leal 0x1(%rax), %edx
movl %edx, 0x2c(%rdi)
movzbl 0x1(%rcx), %edx
cmpl $0x3d, %edx
je 0xa0d4
cmpl $0x3c, %edx
jne 0xa0e0
movl $0x2b, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %eax
leal 0x1(%rax), %edx
movl %edx, 0x2c(%rdi)
cmpb $0x2e, 0x1(%rcx)
jne 0xa0c8
cmpb $0x2e, 0x2(%rcx)
jne 0xa0c8
addq $0x2, %rcx
movq %rcx, (%rdi)
addl $0x2, %eax
movl %eax, 0x2c(%rdi)
movl $0x1c, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x20, %eax
cmpb $0x3d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x16, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x19, %eax
cmpb $0x2b, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x13, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %eax
leal 0x1(%rax), %edx
movl %edx, 0x2c(%rdi)
movzbl 0x1(%rcx), %edx
cmpl $0x3d, %edx
je 0xa0da
cmpl $0x3e, %edx
jne 0xa0ec
movl $0x2c, %eax
retq
leaq 0x1(%rcx), %rax
movq %rax, (%rdi)
movl 0x2c(%rdi), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x2c(%rdi)
movl $0x1f, %eax
cmpb $0x3d, 0x1(%rcx)
je 0x9f53
movq %rcx, (%rdi)
movl %edx, 0x2c(%rdi)
movl $0x15, %eax
retq
movl $0x1b, %eax
retq
movq %rcx, (%rdi)
movl %eax, 0x2c(%rdi)
movl $0x29, %eax
retq
movl $0xa, %eax
retq
movl $0xc, %eax
retq
movq %rcx, (%rdi)
movl %eax, 0x2c(%rdi)
movl $0xb, %eax
retq
movq %rcx, (%rdi)
movl %eax, 0x2c(%rdi)
movl $0x9, %eax
retq
pushq %rax
movq 0x38(%rdi), %rdx
leaq 0x2ea3(%rip), %rsi      # 0xcfa7
xorl %eax, %eax
callq 0x96c6