// File: /workspace/github_c_makefile_star2_O3/MaoKo[P]FGFX/fgfl/src/regex.c
// Function: regex_cce
static bitset_t*
regex_cce(int kind_cce) {
    bitset_t* cce_range = new_bitset();
    bitset_t* op_range = NULL_BITSET;

    switch (kind_cce) {
        case T_CCE_ALNUM:
            op_range = regex_cce(T_CCE_ALPHA);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            op_range = regex_cce(T_CCE_DIGIT);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            break;
        case T_CCE_ALPHA:
            op_range = regex_cce(T_CCE_LOWER);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            op_range = regex_cce(T_CCE_UPPER);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            break;
        case T_CCE_BLANK:
            ADD_BITSET(cce_range, '\t');
            ADD_BITSET(cce_range, ' ');
            break;
        case T_CCE_CNTRL:
            add_range_bitset(cce_range, '\0', '\x1F' + 1);
            ADD_BITSET(cce_range, '\x7F');
            break;
        case T_CCE_DIGIT:
            add_range_bitset(cce_range, '0', '9' + 1);
            break;
        case T_CCE_GRAPH:
            op_range = regex_cce(T_CCE_PRINT); OFF_BITSET(op_range, ' ');
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);
            break;
        case T_CCE_LOWER:
            add_range_bitset(cce_range, 'a', 'z' + 1);
            break;
        case T_CCE_PRINT:
            op_range = regex_cce(T_CCE_CNTRL);
            UNION_BITSET(cce_range, COMPL_BITSET(op_range));
            del_bitset(op_range);
            break;
        case T_CCE_PUNCT:
            op_range = regex_cce(T_CCE_GRAPH);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            op_range = regex_cce(T_CCE_ALNUM);
            UNION_BITSET(cce_range, COMPL_BITSET(op_range));
            del_bitset(op_range);        
            break;
        case T_CCE_SPACE:
            add_range_bitset(cce_range, '\t', '\r' + 1);
            ADD_BITSET(cce_range, ' ');
            break;
        case T_CCE_UPPER:
            add_range_bitset(cce_range, 'A', 'Z' + 1);
            break;
        case T_CCE_XDIGIT:
            op_range = regex_cce(T_CCE_DIGIT);
            UNION_BITSET(cce_range, op_range); del_bitset(op_range);        
            add_range_bitset(cce_range, 'a', 'f' + 1);
            add_range_bitset(cce_range, 'A', 'F' + 1);
            break;
    }
    return (cce_range);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
movl %edi, %r14d
callq 0x247c
movq %rax, %rbx
addl $-0x4b, %r14d
cmpl $0xb, %r14d
ja 0x725a
leaq 0x4993(%rip), %rax      # 0xb9b0
movslq (%rax,%r14,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movl $0x4c, %edi
callq 0x6ff6
movq %rax, %r14
xorl %edi, %edi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x27f4
movq %r14, %rdi
callq 0x24c6
callq 0x247c
movq %rax, %r14
movl $0x30, %esi
movl $0x3a, %edx
jmp 0x7199
callq 0x247c
movq %rax, %r14
movl $0x30, %esi
movl $0x3a, %edx
movq %rax, %rdi
callq 0x26df
xorl %edi, %edi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x27f4
movq %r14, %rdi
callq 0x24c6
movl $0x61, %esi
movl $0x67, %edx
movq %rbx, %rdi
callq 0x26df
movl $0x41, %esi
movl $0x47, %edx
jmp 0x71f4
movl $0x51, %edi
callq 0x6ff6
movq %rax, %r14
cmpl $0x21, 0x4(%rax)
jb 0x71a1
movq 0x8(%r14), %rax
movabsq $-0x100000001, %rcx     # imm = 0xFFFFFFFEFFFFFFFF
andq %rcx, (%rax)
jmp 0x71a1
movl 0x4(%rbx), %eax
cmpl $0x9, %eax
ja 0x7229
movl $0x9, %esi
movq %rbx, %rdi
callq 0x25b0
movl 0x4(%rbx), %eax
jmp 0x7234
movl $0x20, %edx
movq %rbx, %rdi
xorl %esi, %esi
callq 0x26df
cmpl $0x7f, 0x4(%rbx)
ja 0x7248
movl $0x7f, %esi
jmp 0x723e
movl $0x30, %esi
movl $0x3a, %edx
jmp 0x71f4
movl $0x4f, %edi
callq 0x6ff6
movq %rax, %r14
xorl %edi, %edi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x27f4
movq %r14, %rdi
callq 0x24c6
movl $0x4b, %edi
jmp 0x71bc
callq 0x247c
movq %rax, %r14
movl $0x61, %esi
movl $0x7b, %edx
movq %rax, %rdi
callq 0x26df
xorl %edi, %edi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x27f4
movq %r14, %rdi
callq 0x24c6
callq 0x247c
movq %rax, %r14
movl $0x41, %esi
movl $0x5b, %edx
movq %rax, %rdi
callq 0x26df
xorl %edi, %edi
movq %rbx, %rsi
movq %r14, %rdx
jmp 0x71db
movl $0x61, %esi
movl $0x7b, %edx
jmp 0x71f4
movl $0x4d, %edi
callq 0x6ff6
movq %rax, %r14
movl $0x3, %edi
movq %rax, %rsi
xorl %edx, %edx
callq 0x27f4
xorl %edi, %edi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x27f4
movq %r14, %rdi
callq 0x24c6
jmp 0x725a
movl $0x41, %esi
movl $0x5b, %edx
movq %rbx, %rdi
callq 0x26df
jmp 0x725a
movl $0x9, %esi
movl $0xe, %edx
movq %rbx, %rdi
callq 0x26df
cmpl $0x20, 0x4(%rbx)
jbe 0x7239
movq 0x8(%rbx), %rax
movabsq $0x100000000, %rcx      # imm = 0x100000000
orq %rcx, (%rax)
jmp 0x725a
movq 0x8(%rbx), %rcx
orq $0x200, (%rcx)          # imm = 0x200
cmpl $0x20, %eax
ja 0x7216
movl $0x20, %esi
movq %rbx, %rdi
callq 0x25b0
jmp 0x725a
movq 0x8(%rbx), %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
orq %rcx, 0x8(%rax)
movq %rbx, %rax
popq %rbx
popq %r14
popq %rbp
retq