int check_section_end(char c) {
  static int b = 0, q = 0, qq = 0;
  if (!c || (((c == '\n' || c == '\t' || c == '\r' || c == ' ') || c == ')' ||
              c == ';') &&
             b <= 0 && !q && !qq)) {
    b = q = qq = 0;
    return 1;
  }
  switch (c) {
  case '(':
    if (!q && !qq)
      b++;
    break;
  case ')':
    if (!q && !qq)
      b--;
    break;
  case '\'':
    if (!qq)
      q = !q;
    break;
  case '\"':
    qq = !qq;
    break;
  }
  return 0;
}


x86 assembly (clang, -O0):
<check_section_end>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
cmpb   $0x0,-0x5(%rbp)
je     1189 <check_section_end+0x89>
movsbl -0x5(%rbp),%eax
cmp    $0xa,%eax
je     1162 <check_section_end+0x62>
movsbl -0x5(%rbp),%eax
cmp    $0x9,%eax
je     1162 <check_section_end+0x62>
movsbl -0x5(%rbp),%eax
cmp    $0xd,%eax
je     1162 <check_section_end+0x62>
movsbl -0x5(%rbp),%eax
cmp    $0x20,%eax
je     1162 <check_section_end+0x62>
movsbl -0x5(%rbp),%eax
cmp    $0x29,%eax
je     1162 <check_section_end+0x62>
movsbl -0x5(%rbp),%eax
cmp    $0x3b,%eax
jne    11b3 <check_section_end+0xb3>
cmpl   $0x0,0x2ebb(%rip)
jg     11b3 <check_section_end+0xb3>
cmpl   $0x0,0x2eb2(%rip)
jne    11b3 <check_section_end+0xb3>
cmpl   $0x0,0x2ea9(%rip)
jne    11b3 <check_section_end+0xb3>
movl   $0x0,0x2e99(%rip)
movl   $0x0,0x2e8b(%rip)
movl   $0x0,0x2e7d(%rip)
movl   $0x1,-0x4(%rbp)
jmp    1280 <check_section_end+0x180>
movsbl -0x5(%rbp),%eax
add    $0xffffffde,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x7,%eax
ja     1279 <check_section_end+0x179>
mov    -0x10(%rbp),%rax
lea    0xe2c(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x0,0x2e44(%rip)
jne    1206 <check_section_end+0x106>
cmpl   $0x0,0x2e3b(%rip)
jne    1206 <check_section_end+0x106>
mov    0x2e27(%rip),%eax
add    $0x1,%eax
mov    %eax,0x2e1e(%rip)
jmp    1279 <check_section_end+0x179>
cmpl   $0x0,0x2e16(%rip)
jne    1234 <check_section_end+0x134>
cmpl   $0x0,0x2e0d(%rip)
jne    1234 <check_section_end+0x134>
mov    0x2df9(%rip),%eax
add    $0xffffffff,%eax
mov    %eax,0x2df0(%rip)
jmp    1279 <check_section_end+0x179>
cmpl   $0x0,0x2dec(%rip)
jne    125d <check_section_end+0x15d>
cmpl   $0x0,0x2ddb(%rip)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,0x2dcb(%rip)
jmp    1279 <check_section_end+0x179>
cmpl   $0x0,0x2dc3(%rip)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,0x2db3(%rip)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_section_end>:
test   %dil,%dil
je     115a <check_section_end+0x5a>
lea    -0xb(%rdi),%eax
cmp    $0xfe,%al
setb   %al
movzbl %dil,%ecx
movd   %ecx,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pcmpeqb 0xeda(%rip),%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
movmskps %xmm0,%ecx
test   %ecx,%ecx
sete   %cl
mov    0x2ee7(%rip),%r8d
mov    0x2ee5(%rip),%edx
mov    0x2ee3(%rip),%esi
test   %al,%cl
jne    117e <check_section_end+0x7e>
test   %r8d,%r8d
jg     117e <check_section_end+0x7e>
test   %edx,%edx
jne    117e <check_section_end+0x7e>
test   %esi,%esi
jne    117e <check_section_end+0x7e>
movl   $0x0,0x2ec8(%rip)
movl   $0x0,0x2eba(%rip)
movl   $0x0,0x2eac(%rip)
mov    $0x1,%eax
ret
movsbl %dil,%edi
xor    %eax,%eax
add    $0xffffffde,%edi
cmp    $0x7,%edi
ja     11d1 <check_section_end+0xd1>
lea    0xe7d(%rip),%rcx
movslq (%rcx,%rdi,4),%rdi
add    %rcx,%rdi
jmp    *%rdi
xor    %ecx,%ecx
test   %esi,%esi
sete   %cl
mov    %ecx,0x2e83(%rip)
jmp    11d1 <check_section_end+0xd1>
test   %esi,%esi
jne    11d1 <check_section_end+0xd1>
xor    %ecx,%ecx
test   %edx,%edx
sete   %cl
mov    %ecx,0x2e6c(%rip)
ret
or     %esi,%edx
jne    11d1 <check_section_end+0xd1>
add    $0x1,%r8d
mov    %r8d,0x2e58(%rip)
ret
or     %esi,%edx
je     11d2 <check_section_end+0xd2>
ret
add    $0xffffffff,%r8d
mov    %r8d,0x2e47(%rip)
ret

LLVM IR (-O0):
@check_section_end.b = internal global i32 0
@check_section_end.q = internal global i32 0
@check_section_end.qq = internal global i32 0
define i32 @check_section_end(i8 signext %0) {
%2 = alloca i32
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = icmp ne i8 %4, 0
br i1 %5, label %6, label %39
6: ; preds = %1
%7 = load i8, i8* %3
%8 = sext i8 %7 to i32
%9 = icmp eq i32 %8, 10
br i1 %9, label %30, label %10
10: ; preds = %6
%11 = load i8, i8* %3
%12 = sext i8 %11 to i32
%13 = icmp eq i32 %12, 9
br i1 %13, label %30, label %14
14: ; preds = %10
%15 = load i8, i8* %3
%16 = sext i8 %15 to i32
%17 = icmp eq i32 %16, 13
br i1 %17, label %30, label %18
18: ; preds = %14
%19 = load i8, i8* %3
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 32
br i1 %21, label %30, label %22
22: ; preds = %18
%23 = load i8, i8* %3
%24 = sext i8 %23 to i32
%25 = icmp eq i32 %24, 41
br i1 %25, label %30, label %26
26: ; preds = %22
%27 = load i8, i8* %3
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 59
br i1 %29, label %30, label %40
30: ; preds = %26, %22, %18, %14, %10, %6
%31 = load i32, i32* @check_section_end.b
%32 = icmp sle i32 %31, 0
br i1 %32, label %33, label %40
33: ; preds = %30
%34 = load i32, i32* @check_section_end.q
%35 = icmp ne i32 %34, 0
br i1 %35, label %40, label %36
36: ; preds = %33
%37 = load i32, i32* @check_section_end.qq
%38 = icmp ne i32 %37, 0
br i1 %38, label %40, label %39
39: ; preds = %36, %1
store i32 0, i32* @check_section_end.qq
store i32 0, i32* @check_section_end.q
store i32 0, i32* @check_section_end.b
store i32 1, i32* %2
br label %78
40: ; preds = %36, %33, %30, %26
%41 = load i8, i8* %3
%42 = sext i8 %41 to i32
switch i32 %42, label %77 [
i32 40, label %43
i32 41, label %53
i32 39, label %63
i32 34, label %72
]
43: ; preds = %40
%44 = load i32, i32* @check_section_end.q
%45 = icmp ne i32 %44, 0
br i1 %45, label %52, label %46
46: ; preds = %43
%47 = load i32, i32* @check_section_end.qq
%48 = icmp ne i32 %47, 0
br i1 %48, label %52, label %49
49: ; preds = %46
%50 = load i32, i32* @check_section_end.b
%51 = add nsw i32 %50, 1
store i32 %51, i32* @check_section_end.b
br label %52
52: ; preds = %49, %46, %43
br label %77
53: ; preds = %40
%54 = load i32, i32* @check_section_end.q
%55 = icmp ne i32 %54, 0
br i1 %55, label %62, label %56
56: ; preds = %53
%57 = load i32, i32* @check_section_end.qq
%58 = icmp ne i32 %57, 0
br i1 %58, label %62, label %59
59: ; preds = %56
%60 = load i32, i32* @check_section_end.b
%61 = add nsw i32 %60, -1
store i32 %61, i32* @check_section_end.b
br label %62
62: ; preds = %59, %56, %53
br label %77
63: ; preds = %40
%64 = load i32, i32* @check_section_end.qq
%65 = icmp ne i32 %64, 0
br i1 %65, label %71, label %66
66: ; preds = %63
%67 = load i32, i32* @check_section_end.q
%68 = icmp ne i32 %67, 0
%69 = xor i1 %68, true
%70 = zext i1 %69 to i32
store i32 %70, i32* @check_section_end.q
br label %71
71: ; preds = %66, %63
br label %77
72: ; preds = %40
%73 = load i32, i32* @check_section_end.qq
%74 = icmp ne i32 %73, 0
%75 = xor i1 %74, true
%76 = zext i1 %75 to i32
store i32 %76, i32* @check_section_end.qq
br label %77
77: ; preds = %40, %72, %71, %62, %52
store i32 0, i32* %2
br label %78
78: ; preds = %77, %39
%79 = load i32, i32* %2
ret i32 %79
}

LLVM IR (-O2):
@check_section_end.b = internal unnamed_addr global i32 0
@check_section_end.q = internal unnamed_addr global i32 0
@check_section_end.qq = internal unnamed_addr global i32 0
define i32 @check_section_end(i8 signext %0) {
%2 = icmp eq i8 %0, 0
br i1 %2, label %21, label %3
3: ; preds = %1
%4 = add i8 %0, -11
%5 = icmp ult i8 %4, -2
%6 = insertelement <4 x i8> poison, i8 %0, i64 0
%7 = shufflevector <4 x i8> %6, <4 x i8> poison, <4 x i32> zeroinitializer
%8 = icmp eq <4 x i8> %7, <i8 59, i8 41, i8 32, i8 13>
%9 = bitcast <4 x i1> %8 to i4
%10 = icmp eq i4 %9, 0
%11 = load i32, i32* @check_section_end.b
%12 = icmp sgt i32 %11, 0
%13 = and i1 %10, %5
%14 = select i1 %13, i1 true, i1 %12
%15 = load i32, i32* @check_section_end.q
%16 = icmp ne i32 %15, 0
%17 = select i1 %14, i1 true, i1 %16
%18 = load i32, i32* @check_section_end.qq
%19 = icmp ne i32 %18, 0
%20 = select i1 %17, i1 true, i1 %19
br i1 %20, label %22, label %21
21: ; preds = %3, %1
store i32 0, i32* @check_section_end.qq
store i32 0, i32* @check_section_end.q
store i32 0, i32* @check_section_end.b
br label %39
22: ; preds = %3
%23 = sext i8 %0 to i32
switch i32 %23, label %39 [
i32 40, label %24
i32 41, label %28
i32 39, label %32
i32 34, label %36
]
24: ; preds = %22
%25 = select i1 %16, i1 true, i1 %19
br i1 %25, label %39, label %26
26: ; preds = %24
%27 = add nsw i32 %11, 1
store i32 %27, i32* @check_section_end.b
br label %39
28: ; preds = %22
%29 = select i1 %16, i1 true, i1 %19
br i1 %29, label %39, label %30
30: ; preds = %28
%31 = add nsw i32 %11, -1
store i32 %31, i32* @check_section_end.b
br label %39
32: ; preds = %22
br i1 %19, label %39, label %33
33: ; preds = %32
%34 = xor i1 %16, true
%35 = zext i1 %34 to i32
store i32 %35, i32* @check_section_end.q
br label %39
36: ; preds = %22
%37 = xor i1 %19, true
%38 = zext i1 %37 to i32
store i32 %38, i32* @check_section_end.qq
br label %39
39: ; preds = %36, %22, %26, %24, %30, %28, %33, %32, %21
%40 = phi i32 [ 1, %21 ], [ 0, %32 ], [ 0, %33 ], [ 0, %28 ], [ 0, %30 ], [ 0, %24 ], [ 0, %26 ], [ 0, %22 ], [ 0, %36 ]
ret i32 %40
}