#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ isalpha(char);
int skip_vt102_codes_non_graph(char *str) {
  int skip = 0;
  switch (str[skip]) {
  case 5:
  case 7:
  case 8:
  case 9:
  case 11:
  case 12:
  case 13:
  case 14:
  case 15:
  case 17:
  case 19:
  case 24:
  case 26:
  case 127:
    return 1;
  case 27:
    break;
  default:
    return 0;
  }
  switch (str[1]) {
  case '\0':
    return 0;
  case 'c':
  case 'D':
  case 'E':
  case 'H':
  case 'M':
  case 'Z':
  case '7':
  case '8':
  case '>':
  case '=':
    return 2;
  case '%':
  case '#':
  case '(':
  case ')':
    return 3;
  case ']':
    switch (str[2]) {
    case 'P':
      return 10;
    case 'R':
      return 3;
    }
    return 2;
  case '[':
    break;
  default:
    return 2;
  }
  for (skip = 2; str[skip] != 0; skip++) {
    switch (str[skip]) {
    case 'm':
      return 0;
    case '@':
    case '`':
    case ']':
      return skip + 1;
    }
    if (isalpha(str[skip])) {
      return skip + 1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<skip_vt102_codes_non_graph>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xfffffffb,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x7a,%eax
ja     1166 <skip_vt102_codes_non_graph+0x56>
mov    -0x20(%rbp),%rax
lea    0xeb4(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x1,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
jmp    1172 <skip_vt102_codes_non_graph+0x62>
movl   $0x0,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x63,%eax
ja     1214 <skip_vt102_codes_non_graph+0x104>
mov    -0x28(%rbp),%rax
lea    0x1058(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x0,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
movl   $0x2,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
movl   $0x3,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
mov    %eax,-0x2c(%rbp)
sub    $0x50,%eax
je     11eb <skip_vt102_codes_non_graph+0xdb>
jmp    11da <skip_vt102_codes_non_graph+0xca>
mov    -0x2c(%rbp),%eax
sub    $0x52,%eax
je     11f7 <skip_vt102_codes_non_graph+0xe7>
jmp    1203 <skip_vt102_codes_non_graph+0xf3>
movl   $0xa,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
movl   $0x3,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
movl   $0x2,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
jmp    1220 <skip_vt102_codes_non_graph+0x110>
movl   $0x2,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
movl   $0x2,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     12e2 <skip_vt102_codes_non_graph+0x1d2>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x30(%rbp)
sub    $0x40,%eax
je     1298 <skip_vt102_codes_non_graph+0x188>
jmp    1259 <skip_vt102_codes_non_graph+0x149>
mov    -0x30(%rbp),%eax
sub    $0x5d,%eax
je     1298 <skip_vt102_codes_non_graph+0x188>
jmp    126a <skip_vt102_codes_non_graph+0x15a>
mov    -0x30(%rbp),%eax
sub    $0x60,%eax
je     1298 <skip_vt102_codes_non_graph+0x188>
jmp    127b <skip_vt102_codes_non_graph+0x16b>
mov    -0x30(%rbp),%eax
sub    $0x6d,%eax
jne    12a6 <skip_vt102_codes_non_graph+0x196>
jmp    128c <skip_vt102_codes_non_graph+0x17c>
movl   $0x0,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isalpha@plt>
cmp    $0x0,%rax
je     12cf <skip_vt102_codes_non_graph+0x1bf>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12e9 <skip_vt102_codes_non_graph+0x1d9>
jmp    12d4 <skip_vt102_codes_non_graph+0x1c4>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1227 <skip_vt102_codes_non_graph+0x117>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<skip_vt102_codes_non_graph>:
push   %r15
push   %r14
push   %rbx
movsbl (%rdi),%eax
add    $0xfffffffb,%eax
cmp    $0x7a,%eax
ja     113f <skip_vt102_codes_non_graph+0x2f>
mov    $0x1,%r14d
lea    0xed3(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %r14d,%eax
pop    %rbx
pop    %r14
pop    %r15
ret
xor    %r14d,%r14d
jmp    1136 <skip_vt102_codes_non_graph+0x26>
mov    %rdi,%rbx
movsbl 0x1(%rdi),%r14d
cmp    $0x63,%r14d
ja     1162 <skip_vt102_codes_non_graph+0x52>
lea    0x1093(%rip),%rax
movslq (%rax,%r14,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    $0x2,%r14d
jmp    1136 <skip_vt102_codes_non_graph+0x26>
mov    $0x3,%r14d
jmp    1136 <skip_vt102_codes_non_graph+0x26>
mov    0x2(%rbx),%al
xor    %r14d,%r14d
test   %al,%al
je     1136 <skip_vt102_codes_non_graph+0x26>
mov    $0x3,%r15d
movsbl %al,%edi
cmp    $0x5f,%edi
jg     1196 <skip_vt102_codes_non_graph+0x86>
cmp    $0x40,%edi
je     11da <skip_vt102_codes_non_graph+0xca>
cmp    $0x5d,%edi
jne    11a0 <skip_vt102_codes_non_graph+0x90>
jmp    11da <skip_vt102_codes_non_graph+0xca>
cmp    $0x6d,%edi
je     1136 <skip_vt102_codes_non_graph+0x26>
cmp    $0x60,%edi
je     11da <skip_vt102_codes_non_graph+0xca>
call   1030 <isalpha@plt>
test   %rax,%rax
jne    11da <skip_vt102_codes_non_graph+0xca>
movzbl (%rbx,%r15,1),%eax
add    $0x1,%r15
test   %al,%al
jne    1182 <skip_vt102_codes_non_graph+0x72>
jmp    1136 <skip_vt102_codes_non_graph+0x26>
mov    0x2(%rbx),%al
xor    %ecx,%ecx
cmp    $0x52,%al
sete   %cl
or     $0x2,%ecx
cmp    $0x50,%al
mov    $0xa,%r14d
cmovne %ecx,%r14d
jmp    1136 <skip_vt102_codes_non_graph+0x26>
mov    %r15d,%r14d
jmp    1136 <skip_vt102_codes_non_graph+0x26>

LLVM IR (-O0):
define i32 @skip_vt102_codes_non_graph(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %4
%5 = load i8*, i8** %3
%6 = load i32, i32* %4
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds i8, i8* %5, i64 %7
%9 = load i8, i8* %8
%10 = sext i8 %9 to i32
switch i32 %10, label %13 [
i32 5, label %11
i32 7, label %11
i32 8, label %11
i32 9, label %11
i32 11, label %11
i32 12, label %11
i32 13, label %11
i32 14, label %11
i32 15, label %11
i32 17, label %11
i32 19, label %11
i32 24, label %11
i32 26, label %11
i32 127, label %11
i32 27, label %12
]
11: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
store i32 1, i32* %2
br label %68
12: ; preds = %1
br label %14
13: ; preds = %1
store i32 0, i32* %2
br label %68
14: ; preds = %12
%15 = load i8*, i8** %3
%16 = getelementptr inbounds i8, i8* %15, i64 1
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
switch i32 %18, label %31 [
i32 0, label %19
i32 99, label %20
i32 68, label %20
i32 69, label %20
i32 72, label %20
i32 77, label %20
i32 90, label %20
i32 55, label %20
i32 56, label %20
i32 62, label %20
i32 61, label %20
i32 37, label %21
i32 35, label %21
i32 40, label %21
i32 41, label %21
i32 93, label %22
i32 91, label %30
]
19: ; preds = %14
store i32 0, i32* %2
br label %68
20: ; preds = %14, %14, %14, %14, %14, %14, %14, %14, %14, %14
store i32 2, i32* %2
br label %68
21: ; preds = %14, %14, %14, %14
store i32 3, i32* %2
br label %68
22: ; preds = %14
%23 = load i8*, i8** %3
%24 = getelementptr inbounds i8, i8* %23, i64 2
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
switch i32 %26, label %29 [
i32 80, label %27
i32 82, label %28
]
27: ; preds = %22
store i32 10, i32* %2
br label %68
28: ; preds = %22
store i32 3, i32* %2
br label %68
29: ; preds = %22
store i32 2, i32* %2
br label %68
30: ; preds = %14
br label %32
31: ; preds = %14
store i32 2, i32* %2
br label %68
32: ; preds = %30
store i32 2, i32* %4
br label %33
33: ; preds = %64, %32
%34 = load i8*, i8** %3
%35 = load i32, i32* %4
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %67
41: ; preds = %33
%42 = load i8*, i8** %3
%43 = load i32, i32* %4
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
switch i32 %47, label %52 [
i32 109, label %48
i32 64, label %49
i32 96, label %49
i32 93, label %49
]
48: ; preds = %41
store i32 0, i32* %2
br label %68
49: ; preds = %41, %41, %41
%50 = load i32, i32* %4
%51 = add nsw i32 %50, 1
store i32 %51, i32* %2
br label %68
52: ; preds = %41
%53 = load i8*, i8** %3
%54 = load i32, i32* %4
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %53, i64 %55
%57 = load i8, i8* %56
%58 = call i64 @isalpha(i8 signext %57)
%59 = icmp ne i64 %58, 0
br i1 %59, label %60, label %63
60: ; preds = %52
%61 = load i32, i32* %4
%62 = add nsw i32 %61, 1
store i32 %62, i32* %2
br label %68
63: ; preds = %52
br label %64
64: ; preds = %63
%65 = load i32, i32* %4
%66 = add nsw i32 %65, 1
store i32 %66, i32* %4
br label %33
67: ; preds = %33
store i32 0, i32* %2
br label %68
68: ; preds = %67, %60, %49, %48, %31, %29, %28, %27, %21, %20, %19, %13, %11
%69 = load i32, i32* %2
ret i32 %69
}

LLVM IR (-O2):
define i32 @skip_vt102_codes_non_graph(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = sext i8 %2 to i32
switch i32 %3, label %4 [
i32 5, label %41
i32 7, label %41
i32 8, label %41
i32 9, label %41
i32 11, label %41
i32 12, label %41
i32 13, label %41
i32 14, label %41
i32 15, label %41
i32 17, label %41
i32 19, label %41
i32 24, label %41
i32 26, label %41
i32 127, label %41
i32 27, label %5
]
4: ; preds = %1
br label %41
5: ; preds = %1
%6 = getelementptr inbounds i8, i8* %0, i64 1
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
switch i32 %8, label %22 [
i32 0, label %41
i32 99, label %13
i32 68, label %13
i32 69, label %13
i32 72, label %13
i32 77, label %13
i32 90, label %13
i32 55, label %13
i32 56, label %13
i32 62, label %13
i32 61, label %13
i32 37, label %14
i32 35, label %14
i32 40, label %14
i32 41, label %14
i32 93, label %15
i32 91, label %9
]
9: ; preds = %5
%10 = getelementptr inbounds i8, i8* %0, i64 2
%11 = load i8, i8* %10
%12 = icmp eq i8 %11, 0
br i1 %12, label %41, label %23
13: ; preds = %5, %5, %5, %5, %5, %5, %5, %5, %5, %5
br label %41
14: ; preds = %5, %5, %5, %5
br label %41
15: ; preds = %5
%16 = getelementptr inbounds i8, i8* %0, i64 2
%17 = load i8, i8* %16
%18 = icmp eq i8 %17, 82
%19 = select i1 %18, i32 3, i32 2
%20 = icmp eq i8 %17, 80
%21 = select i1 %20, i32 10, i32 %19
br label %41
22: ; preds = %5
br label %41
23: ; preds = %9, %36
%24 = phi i64 [ %37, %36 ], [ 2, %9 ]
%25 = phi i8 [ %39, %36 ], [ %11, %9 ]
%26 = sext i8 %25 to i32
switch i32 %26, label %30 [
i32 109, label %41
i32 64, label %27
i32 96, label %27
i32 93, label %27
]
27: ; preds = %23, %23, %23
%28 = trunc i64 %24 to i32
%29 = add nuw nsw i32 %28, 1
br label %41
30: ; preds = %23
%31 = tail call i64 @isalpha(i8 signext %25)
%32 = icmp eq i64 %31, 0
br i1 %32, label %36, label %33
33: ; preds = %30
%34 = trunc i64 %24 to i32
%35 = add nuw nsw i32 %34, 1
br label %41
36: ; preds = %30
%37 = add nuw i64 %24, 1
%38 = getelementptr inbounds i8, i8* %0, i64 %37
%39 = load i8, i8* %38
%40 = icmp eq i8 %39, 0
br i1 %40, label %41, label %23
41: ; preds = %23, %36, %9, %15, %5, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %33, %27, %22, %14, %13, %4
%42 = phi i32 [ 0, %4 ], [ 2, %22 ], [ %35, %33 ], [ %29, %27 ], [ 3, %14 ], [ 2, %13 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ %8, %5 ], [ %21, %15 ], [ 0, %9 ], [ 0, %36 ], [ 0, %23 ]
ret i32 %42
}