// File: /workspace/github_cpp_makefile_star2_O3/mapbox[P]svg-tools/include/mapbox/svg/path_parser.hpp
// Function: mapbox::svg::PathParser<mapbox::svg::test::PathVertexReceiver>::operator()(char const*)
bool operator()(const char* str) {
        begin = str;
        cursor = str;
        error = PathParseErrorType::None;
        next = nullptr;

        char command;
        double x, y, x1, y1, x2, y2, xAxisRotation;
        bool relative, largeArcFlag, sweepFlag;

        skipWhitespace();
        while (*cursor) {
            command = *cursor++;
            relative = command >= 'a';
            skipWhitespace();

            if (command == 'Z' || command == 'z') { // closepath
                skipWhitespace();
                t.closePath();
                continue;
            }

            do {
                switch (command) {
                    case '\0':
                        break;
                    case 'M': case 'm': // moveto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.moveTo(x, y, relative);
                        break;
                    case 'L': case 'l': // lineto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.lineTo(x, y, relative);
                        break;
                    case 'H': case 'h': // horizontal lineto
                        if (!parseNumber(x)) return false;
                        t.horizontalLineTo(x, relative);
                        break;
                    case 'V': case 'v': // vertical lineto
                        if (!parseNumber(y)) return false;
                        t.verticalLineTo(y, relative);
                        break;
                    case 'C': case 'c': // curveto
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(x2)) return false;
                        if (!parseNumber(y2)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.curveTo(x1, y1, x2, y2, x, y, relative);
                        break;
                    case 'S': case 's': // smooth curveto
                        if (!parseNumber(x2)) return false;
                        if (!parseNumber(y2)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.smoothCurveTo(x2, y2, x, y, relative);
                        break;
                    case 'Q': case 'q': // quadratic bezier curveto
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.quadraticCurveTo(x1, y1, x, y, relative);
                        break;
                    case 'T': case 't': // smooth quadratic bezier curveto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.smoothQuadraticCurveTo(x, y, relative);
                        break;
                    case 'A': case 'a': // elliptical arc
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(xAxisRotation)) return false;
                        if (!parseFlag(largeArcFlag)) return false;
                        if (!parseFlag(sweepFlag)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.arc(x1, y1, xAxisRotation, largeArcFlag, sweepFlag, x, y, relative);
                        break;
                    default:
                        error = PathParseErrorType::CommandParsing;
                        return false;

                }
                // parse another instance of this command if there are more numbers
            } while ((*cursor >= '0' && *cursor <= '9') || *cursor == '.' || *cursor == '-');
        }
        return true;
    }

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x40, %rsp
movq %rdi, %rbx
movq %rsi, 0x8(%rdi)
movq %rsi, 0x10(%rdi)
movl $0x0, 0x20(%rdi)
movq $0x0, 0x18(%rdi)
movabsq $0x100002600, %r14      # imm = 0x100002600
movzbl (%rsi), %eax
cmpq $0x20, %rax
ja 0x2963
btq %rax, %r14
jae 0x294d
incq %rsi
movq %rsi, 0x10(%rbx)
jmp 0x2935
testq %rax, %rax
jne 0x2963
movb $0x1, %al
jmp 0x2e11
testl %r15d, %r15d
je 0x29d2
jmp 0x2e08
leaq 0x1(%rsi), %rcx
movq %rcx, 0x10(%rbx)
movzbl (%rsi), %r15d
addq $0x2, %rsi
movzbl (%rcx), %eax
cmpq $0x20, %rax
ja 0x298e
btq %rax, %r14
jae 0x298e
incq %rcx
movq %rcx, 0x10(%rbx)
incq %rsi
jmp 0x2973
movl %r15d, %ecx
andb $-0x21, %cl
cmpb $0x5a, %cl
jne 0x29b9
cmpb $0x20, %al
ja 0x2ded
movzbl %al, %eax
btq %rax, %r14
jae 0x2ded
movq %rsi, 0x10(%rbx)
movb (%rsi), %al
incq %rsi
jmp 0x2999
leal -0x41(%r15), %eax
cmpl $0x35, %eax
ja 0x2959
movabsq $0x2d1885002d1885, %rcx # imm = 0x2D1885002D1885
btq %rax, %rcx
jae 0x2959
leal -0x43(%r15), %eax
cmpl $0x13, %eax
jbe 0x29f8
leal -0x63(%r15), %eax
cmpl $0x13, %eax
ja 0x2cfd
leaq 0x16e1(%rip), %rcx      # 0x40d0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x1681(%rip), %rcx      # 0x4080
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x20(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x18(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x30(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x28(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x20(%rsp), %xmm0
movsd 0x18(%rsp), %xmm1
movsd 0x30(%rsp), %xmm2
movsd 0x28(%rsp), %xmm3
movsd 0x8(%rsp), %xmm4
movsd (%rsp), %xmm5
callq 0x31c2
jmp 0x2dcb
leaq 0x30(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x28(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x30(%rsp), %xmm0
movsd 0x28(%rsp), %xmm1
movsd 0x8(%rsp), %xmm2
movsd (%rsp), %xmm3
callq 0x3248
jmp 0x2dcb
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x8(%rsp), %xmm0
callq 0x30da
jmp 0x2dcb
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x8(%rsp), %xmm0
movsd (%rsp), %xmm1
callq 0x2fe6
jmp 0x2dcb
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x8(%rsp), %xmm0
movsd (%rsp), %xmm1
callq 0x334c
jmp 0x2dcb
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x8(%rsp), %xmm0
movsd (%rsp), %xmm1
callq 0x3060
jmp 0x2dcb
leaq 0x20(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x18(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd 0x20(%rsp), %xmm0
movsd 0x18(%rsp), %xmm1
movsd 0x8(%rsp), %xmm2
movsd (%rsp), %xmm3
callq 0x32ca
jmp 0x2dcb
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %esi, %esi
cmpb $0x61, %r15b
setge %sil
movq (%rbx), %rdi
movsd (%rsp), %xmm0
callq 0x314a
jmp 0x2dcb
testl %r15d, %r15d
je 0x2dcb
leaq 0x20(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x18(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x38(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
leaq 0x17(%rsp), %rsi
movq %rbx, %rdi
callq 0x33c6
testb %al, %al
je 0x2e0f
leaq 0x16(%rsp), %rsi
movq %rbx, %rdi
callq 0x33c6
testb %al, %al
je 0x2e0f
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x2f5e
testb %al, %al
je 0x2e0f
xorl %ecx, %ecx
cmpb $0x61, %r15b
setge %cl
movq (%rbx), %rdi
movsd 0x20(%rsp), %xmm0
movsd 0x18(%rsp), %xmm1
movsd 0x38(%rsp), %xmm2
movzbl 0x17(%rsp), %esi
movzbl 0x16(%rsp), %edx
movsd 0x8(%rsp), %xmm3
movsd (%rsp), %xmm4
callq 0x3430
movq 0x10(%rbx), %rsi
movb (%rsi), %al
leal -0x30(%rax), %ecx
cmpb $0xa, %cl
setb %cl
leal -0x2d(%rax), %edx
cmpb $0x2, %dl
setb %dl
orb %cl, %dl
jne 0x29d2
jmp 0x2dfb
movq (%rbx), %rdi
callq 0x2ef4
movq 0x10(%rbx), %rsi
movb (%rsi), %al
testb %al, %al
jne 0x2963
jmp 0x2952
movl $0x3, 0x20(%rbx)
xorl %eax, %eax
addq $0x40, %rsp
popq %rbx
popq %r14
popq %r15
retq
nop