// File: /workspace/github_c_makefile_star2_O0/chgzm[P]minic/tokenizer.c
// Function: read_symbol
static Token* read_symbol(const char* p, int* pos) {
    Token* token = calloc(1, sizeof(Token));

    const char f = p[*pos];
    ++(*pos);
    const char s = p[*pos];
    switch (f) {
    case '+': {
        switch (s) {
        case '+': {
            token->type = TK_INC;
            ++(*pos);
            return token;
        }
        case '=': {
            token->type = TK_ADD_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_PLUS;
            return token;
        }
        }
    }
    case '-': {
        switch (s) {
        case '-': {
            token->type = TK_DEC;
            ++(*pos);
            return token;
        }
        case '=': {
            token->type = TK_SUB_EQ;
            ++(*pos);
            return token;
        }
        case '>': {
            token->type = TK_ARROW;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_MINUS;
            return token;
        }
        }
    }
    case '*': {
        switch (s) {
        case '=': {
            token->type = TK_MUL_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_ASTER;
            return token;
        }
        }
    }
    case '/': {
        switch (s) {
        case '=': {
            token->type = TK_DIV_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_SLASH;
            return token;
        }
        }
    }
    case '%': {
        switch (s) {
        case '=': {
            token->type = TK_MOD_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_PER;
            return token;
        }
        }
    }
    case '=': {
        switch (s) {
        case '=': {
            token->type = TK_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_ASSIGN;
            return token;
        }
        }
    }
    case ';': {
        token->type = TK_SEMICOL;
        return token;
    }
    case ':': {
        token->type = TK_COLON;
        return token;
    }
    case '(': {
        token->type = TK_LPAREN;
        return token;
    }
    case ')': {
        token->type = TK_RPAREN;
        return token;
    }
    case '{': {
        token->type = TK_LBRCKT;
        return token;
    }
    case '}': {
        token->type = TK_RBRCKT;
        return token;
    }
    case '[': {
        token->type = TK_LSQUARE;
        return token;
    }
    case ']': {
        token->type = TK_RSQUARE;
        return token;
    }
    case '<': {
        switch (s) {
        case '<': {
            token->type = TK_LSH;
            ++(*pos);
            return token;
        }
        case '=': {
            token->type = TK_LE;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_LANGLE;
            return token;
        }
        }
    }
    case '>': {
        switch (s) {
        case '>': {
            token->type = TK_RSH;
            ++(*pos);
            return token;
        }
        case '=': {
            token->type = TK_GE;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_RANGLE;
            return token;
        }
        }
    }
    case '!': {
        switch (s) {
        case '=': {
            token->type = TK_NE;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_EXCLA;
            return token;
        }
        }
    }
    case '?': {
        token->type = TK_QUESTION;
        return token;
    }
    case '&': {
        switch (s) {
        case '&': {
            token->type = TK_LOGAND;
            ++(*pos);
            return token;
        }
        case '=': {
            token->type = TK_AND_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_AMP;
            return token;
        }
        }
    }
    case '^': {
        switch (s) {
        case '=': {
            token->type = TK_XOR_EQ;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_HAT;
            return token;
        }
        }
    }
    case '|': {
        switch (s) {
        case '=': {
            token->type = TK_OR_EQ;
            ++(*pos);
            return token;
        }
        case '|': {
            token->type = TK_LOGOR;
            ++(*pos);
            return token;
        }
        default: {
            token->type = TK_PIPE;
            return token;
        }
        }
    }
    case ',': {
        token->type = TK_COMMA;
        return token;
    }
    case '.': {
        const char t = p[*pos + 1];
        if (s == '.' && t == '.') {
            token->type = TK_ELLIPSIS;
            *pos += 2;
        } else {
            token->type = TK_DOT;
        }
        return token;
    }
    case '\\': {
        token->type = TK_BS;
        return token;
    }
    default: {
        return NULL;
    }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl $0x1, %edi
movl $0x18, %esi
callq 0x10b0
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movslq (%rcx), %rcx
movb (%rax,%rcx), %al
movb %al, -0x21(%rbp)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
incl %ecx
movl %ecx, (%rax)
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movslq (%rcx), %rcx
movb (%rax,%rcx), %al
movb %al, -0x22(%rbp)
movsbl -0x21(%rbp), %eax
addl $-0x21, %eax
movl %eax, %ecx
movq %rcx, -0x30(%rbp)
subl $0x5c, %eax
ja 0xd97d
movq -0x30(%rbp), %rax
leaq 0x3694(%rip), %rcx      # 0x10a54
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movsbl -0x22(%rbp), %eax
movl %eax, -0x34(%rbp)
subl $0x2b, %eax
je 0xd3e1
jmp 0xd3d7
movl -0x34(%rbp), %eax
subl $0x3d, %eax
je 0xd403
jmp 0xd425
movq -0x20(%rbp), %rax
movl $0x3b, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x40, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x18, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movsbl -0x22(%rbp), %eax
movl %eax, -0x38(%rbp)
subl $0x2d, %eax
je 0xd45e
jmp 0xd44a
movl -0x38(%rbp), %eax
subl $0x3d, %eax
je 0xd480
jmp 0xd454
movl -0x38(%rbp), %eax
subl $0x3e, %eax
je 0xd4a2
jmp 0xd4c4
movq -0x20(%rbp), %rax
movl $0x3c, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x41, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x32, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x19, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd506
jmp 0xd4e4
movq -0x20(%rbp), %rax
movl $0x3d, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1a, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd548
jmp 0xd526
movq -0x20(%rbp), %rax
movl $0x3e, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1b, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd58a
jmp 0xd568
movq -0x20(%rbp), %rax
movl $0x3f, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1d, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd5cc
jmp 0xd5aa
movq -0x20(%rbp), %rax
movl $0x33, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1e, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1f, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x20, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x21, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x22, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x23, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x24, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x25, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x26, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movsbl -0x22(%rbp), %eax
movl %eax, -0x3c(%rbp)
subl $0x3c, %eax
je 0xd6b3
jmp 0xd6a9
movl -0x3c(%rbp), %eax
subl $0x3d, %eax
je 0xd6d5
jmp 0xd6f7
movq -0x20(%rbp), %rax
movl $0x39, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x35, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x27, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movsbl -0x22(%rbp), %eax
movl %eax, -0x40(%rbp)
subl $0x3d, %eax
je 0xd748
jmp 0xd71c
movl -0x40(%rbp), %eax
subl $0x3e, %eax
jne 0xd76a
jmp 0xd726
movq -0x20(%rbp), %rax
movl $0x3a, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x36, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x28, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd7ac
jmp 0xd78a
movq -0x20(%rbp), %rax
movl $0x34, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x29, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x2a, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movsbl -0x22(%rbp), %eax
movl %eax, -0x44(%rbp)
subl $0x26, %eax
je 0xd7f2
jmp 0xd7e8
movl -0x44(%rbp), %eax
subl $0x3d, %eax
je 0xd814
jmp 0xd836
movq -0x20(%rbp), %rax
movl $0x38, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x42, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x2b, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movb -0x22(%rbp), %al
subb $0x3d, %al
jne 0xd878
jmp 0xd856
movq -0x20(%rbp), %rax
movl $0x43, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x2c, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movsbl -0x22(%rbp), %eax
movl %eax, -0x48(%rbp)
subl $0x3d, %eax
je 0xd8a7
jmp 0xd89d
movl -0x48(%rbp), %eax
subl $0x7c, %eax
je 0xd8c9
jmp 0xd8eb
movq -0x20(%rbp), %rax
movl $0x44, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x37, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x2e, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x30, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movl (%rcx), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movb (%rax,%rcx), %al
movb %al, -0x23(%rbp)
movsbl -0x22(%rbp), %eax
cmpl $0x2e, %eax
jne 0xd955
movsbl -0x23(%rbp), %eax
cmpl $0x2e, %eax
jne 0xd955
movq -0x20(%rbp), %rax
movl $0x45, (%rax)
movq -0x18(%rbp), %rax
movl (%rax), %ecx
addl $0x2, %ecx
movl %ecx, (%rax)
jmp 0xd95f
movq -0x20(%rbp), %rax
movl $0x31, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq -0x20(%rbp), %rax
movl $0x1c, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd985
movq $0x0, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nop