// File: /workspace/github_c_makefile_star2_O0/michaelforney[P]cproc/expr.c
// Function: decodechar
static size_t
decodechar(const char *src, uint_least32_t *chr, bool *hexoct, const char *desc, struct location *loc)
{
	uint_least32_t c;
	size_t n;
	int i;
	const unsigned char *s = (const unsigned char *)src;

	if (*s == '\\') {
		++s;
		switch (*s) {
		case '\'':
		case '"':
		case '?':
		case '\\': c = *s;   ++s; break;
		case 'a':  c = '\a'; ++s; break;
		case 'b':  c = '\b'; ++s; break;
		case 'f':  c = '\f'; ++s; break;
		case 'n':  c = '\n'; ++s; break;
		case 'r':  c = '\r'; ++s; break;
		case 't':  c = '\t'; ++s; break;
		case 'v':  c = '\v'; ++s; break;
		case 'x':
			++s;
			assert(isxdigit(*s));
			c = 0;
			do c = c * 16 + (*s > '9' ? 10 + tolower(*s) - 'a' : *s - '0');
			while (isxdigit(*++s));
			if (hexoct)
				*hexoct = true;
			break;
		default:
			assert(isodigit(*s));
			c = 0;
			i = 0;
			do c = c * 8 + (*s++ - '0');
			while (++i < 3 && isodigit(*s));
			if (hexoct)
				*hexoct = true;
		}
	} else {
		n = utf8dec(&c, s, 4);
		if (n == (size_t)-1)
			error(loc, "%s contains invalid UTF-8", desc);
		s += n;
	}
	*chr = c;
	return s - (const unsigned char *)src;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movzbl (%rax), %eax
cmpl $0x5c, %eax
jne 0x8ae7
movq -0x48(%rbp), %rax
incq %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movzbl (%rax), %eax
addl $-0x22, %eax
movl %eax, %ecx
movq %rcx, -0x50(%rbp)
subl $0x56, %eax
ja 0x8a46
movq -0x50(%rbp), %rax
leaq 0x10a91(%rip), %rcx     # 0x19334
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x48(%rbp), %rax
movzbl (%rax), %eax
movl %eax, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0x7, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0x8, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0xc, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0xa, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0xd, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0x9, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movl $0xb, -0x2c(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x8ae5
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
callq 0x3250
movq (%rax), %rax
movq -0x48(%rbp), %rcx
movzbl (%rcx), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x1000, %eax           # imm = 0x1000
cmpl $0x0, %eax
je 0x899d
jmp 0x89bc
leaq 0x111bb(%rip), %rdi     # 0x19b5f
leaq 0x10fba(%rip), %rsi     # 0x19965
movl $0x1c3, %edx            # imm = 0x1C3
leaq 0x111b5(%rip), %rcx     # 0x19b6c
callq 0x30f0
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
shll $0x4, %eax
movl %eax, -0x54(%rbp)
movq -0x48(%rbp), %rax
movzbl (%rax), %eax
cmpl $0x39, %eax
jle 0x89ef
movq -0x48(%rbp), %rax
movzbl (%rax), %edi
callq 0x31a0
addl $0xa, %eax
subl $0x61, %eax
movl %eax, -0x58(%rbp)
jmp 0x89fc
movq -0x48(%rbp), %rax
movzbl (%rax), %eax
subl $0x30, %eax
movl %eax, -0x58(%rbp)
movl -0x54(%rbp), %eax
movl -0x58(%rbp), %ecx
addl %ecx, %eax
movl %eax, -0x2c(%rbp)
callq 0x3250
movq (%rax), %rax
movq -0x48(%rbp), %rcx
movq %rcx, %rdx
addq $0x1, %rdx
movq %rdx, -0x48(%rbp)
movzbl 0x1(%rcx), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x1000, %eax           # imm = 0x1000
cmpl $0x0, %eax
jne 0x89c3
cmpq $0x0, -0x18(%rbp)
je 0x8a41
movq -0x18(%rbp), %rax
movb $0x1, (%rax)
jmp 0x8ae5
movq -0x48(%rbp), %rax
movzbl (%rax), %edi
callq 0x9d70
cmpl $0x0, %eax
je 0x8a59
jmp 0x8a78
leaq 0x11168(%rip), %rdi     # 0x19bc8
leaq 0x10efe(%rip), %rsi     # 0x19965
movl $0x1cb, %edx            # imm = 0x1CB
leaq 0x110f9(%rip), %rcx     # 0x19b6c
callq 0x30f0
movl $0x0, -0x2c(%rbp)
movl $0x0, -0x3c(%rbp)
movl -0x2c(%rbp), %eax
shll $0x3, %eax
movq -0x48(%rbp), %rcx
movq %rcx, %rdx
addq $0x1, %rdx
movq %rdx, -0x48(%rbp)
movzbl (%rcx), %ecx
subl $0x30, %ecx
addl %ecx, %eax
movl %eax, -0x2c(%rbp)
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movl %ecx, -0x3c(%rbp)
xorl %eax, %eax
cmpl $0x3, %ecx
movb %al, -0x59(%rbp)
jge 0x8ace
movq -0x48(%rbp), %rax
movzbl (%rax), %edi
callq 0x9d70
cmpl $0x0, %eax
setne %al
movb %al, -0x59(%rbp)
movb -0x59(%rbp), %al
testb $0x1, %al
jne 0x8a86
cmpq $0x0, -0x18(%rbp)
je 0x8ae3
movq -0x18(%rbp), %rax
movb $0x1, (%rax)
jmp 0x8ae5
jmp 0x8b26
movq -0x48(%rbp), %rsi
leaq -0x2c(%rbp), %rdi
movl $0x4, %edx
callq 0x122d0
movq %rax, -0x38(%rbp)
cmpq $-0x1, -0x38(%rbp)
jne 0x8b1a
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rdx
leaq 0x110c2(%rip), %rsi     # 0x19bd5
movb $0x0, %al
callq 0x11190
movq -0x38(%rbp), %rax
addq -0x48(%rbp), %rax
movq %rax, -0x48(%rbp)
movl -0x2c(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, (%rax)
movq -0x48(%rbp), %rax
movq -0x8(%rbp), %rcx
subq %rcx, %rax
addq $0x60, %rsp
popq %rbp
retq