#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 */
long get_key_buf_char_sub();
long get_key_n(char *);
scalar_t__ isalpha(long);
long toupper(long);
long get_key_buf_char(void) {
  long c;
  while (1) {
    c = get_key_buf_char_sub();
    if (c == '\0')
      return c;
    if (c == '\\') {
      c = get_key_buf_char_sub();
      if (c == '\0')
        return c;
      if (isalpha(c)) {
        switch (c) {
        case 'n':
          return '\n';
        case 't':
          return '\t';
        }
        continue;
      } else {
        return c;
      }
    } else if (c == '^') {
      c = get_key_buf_char_sub();
      if (c == '\0')
        return c;
      if (isalpha(c)) {
        return (toupper(c) - '@');
      } else {
        continue;
      }
    } else if (c == '&') {
      const long max_len = 127;
      static char buf[127 + 1];
      long i;
      for (i = 0; i < max_len;) {
        c = get_key_buf_char_sub();
        if (c == ';')
          break;
        if (c == '\0')
          continue;
        if (c == '|')
          continue;
        buf[i] = c;
        i++;
      }
      buf[i] = '\0';
      return get_key_n(buf);
    } else {
      return c;
    }
  }
  return c;
}


x86 assembly (clang, -O0):
<get_key_buf_char>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    $0x0,%al
call   1050 <get_key_buf_char_sub@plt>
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    116b <get_key_buf_char+0x2b>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
cmpq   $0x5c,-0x10(%rbp)
jne    1202 <get_key_buf_char+0xc2>
mov    $0x0,%al
call   1050 <get_key_buf_char_sub@plt>
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1199 <get_key_buf_char+0x59>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
mov    -0x10(%rbp),%rdi
call   1060 <isalpha@plt>
cmp    $0x0,%rax
je     11f5 <get_key_buf_char+0xb5>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
sub    $0x6e,%rax
je     11d6 <get_key_buf_char+0x96>
jmp    11c3 <get_key_buf_char+0x83>
mov    -0x28(%rbp),%rax
sub    $0x74,%rax
je     11e3 <get_key_buf_char+0xa3>
jmp    11f0 <get_key_buf_char+0xb0>
movq   $0xa,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
movq   $0x9,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
jmp    1148 <get_key_buf_char+0x8>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
cmpq   $0x5e,-0x10(%rbp)
jne    125e <get_key_buf_char+0x11e>
mov    $0x0,%al
call   1050 <get_key_buf_char_sub@plt>
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1230 <get_key_buf_char+0xf0>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
mov    -0x10(%rbp),%rdi
call   1060 <isalpha@plt>
cmp    $0x0,%rax
je     1259 <get_key_buf_char+0x119>
mov    -0x10(%rbp),%rdi
call   1040 <toupper@plt>
sub    $0x40,%rax
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
jmp    1148 <get_key_buf_char+0x8>
cmpq   $0x26,-0x10(%rbp)
jne    1308 <get_key_buf_char+0x1c8>
movq   $0x7f,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
cmpq   $0x7f,-0x20(%rbp)
jge    12e4 <get_key_buf_char+0x1a4>
mov    $0x0,%al
call   1050 <get_key_buf_char_sub@plt>
mov    %rax,-0x10(%rbp)
cmpq   $0x3b,-0x10(%rbp)
jne    129f <get_key_buf_char+0x15f>
jmp    12e4 <get_key_buf_char+0x1a4>
cmpq   $0x0,-0x10(%rbp)
jne    12af <get_key_buf_char+0x16f>
jmp    1279 <get_key_buf_char+0x139>
cmpq   $0x7c,-0x10(%rbp)
jne    12bf <get_key_buf_char+0x17f>
jmp    1279 <get_key_buf_char+0x139>
mov    -0x10(%rbp),%rax
mov    %al,%dl
mov    -0x20(%rbp),%rcx
lea    0x2d80(%rip),%rax
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1279 <get_key_buf_char+0x139>
mov    -0x20(%rbp),%rcx
lea    0x2d61(%rip),%rax
movb   $0x0,(%rax,%rcx,1)
lea    0x2d56(%rip),%rdi
call   1030 <get_key_n@plt>
mov    %rax,-0x8(%rbp)
jmp    1310 <get_key_buf_char+0x1d0>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_key_buf_char>:
push   %r15
push   %r14
push   %rbx
cs nopw 0x0(%rax,%rax,1)
nop
xor    %eax,%eax
call   1050 <get_key_buf_char_sub@plt>
mov    %rax,%rbx
cmp    $0x5d,%rax
jg     11a0 <get_key_buf_char+0x60>
cmp    $0x5c,%rbx
jne    11de <get_key_buf_char+0x9e>
xor    %eax,%eax
call   1050 <get_key_buf_char_sub@plt>
test   %rax,%rax
je     124d <get_key_buf_char+0x10d>
mov    %rax,%rbx
mov    %rax,%rdi
call   1060 <isalpha@plt>
test   %rax,%rax
je     125d <get_key_buf_char+0x11d>
cmp    $0x6e,%rbx
je     1251 <get_key_buf_char+0x111>
cmp    $0x74,%rbx
jne    1150 <get_key_buf_char+0x10>
jmp    1258 <get_key_buf_char+0x118>
nop
cmp    $0x5e,%rbx
jne    125d <get_key_buf_char+0x11d>
xor    %eax,%eax
call   1050 <get_key_buf_char_sub@plt>
test   %rax,%rax
je     124d <get_key_buf_char+0x10d>
mov    %rax,%rbx
mov    %rax,%rdi
call   1060 <isalpha@plt>
test   %rax,%rax
je     1150 <get_key_buf_char+0x10>
mov    %rbx,%rdi
call   1040 <toupper@plt>
mov    %rax,%rbx
add    $0xffffffffffffffc0,%rbx
jmp    125d <get_key_buf_char+0x11d>
test   %rbx,%rbx
je     125d <get_key_buf_char+0x11d>
cmp    $0x26,%rbx
jne    125d <get_key_buf_char+0x11d>
mov    $0x1,%bl
lea    0x2e5e(%rip),%r14
xor    %r15d,%r15d
jmp    1205 <get_key_buf_char+0xc5>
nopw   0x0(%rax,%rax,1)
test   $0x1,%bl
je     123b <get_key_buf_char+0xfb>
xor    %eax,%eax
call   1050 <get_key_buf_char_sub@plt>
test   %rax,%rax
je     1200 <get_key_buf_char+0xc0>
cmp    $0x7c,%rax
je     1200 <get_key_buf_char+0xc0>
cmp    $0x3b,%rax
je     123b <get_key_buf_char+0xfb>
mov    %al,(%r15,%r14,1)
cmp    $0x7e,%r15
lea    0x1(%r15),%rax
setb   %bl
mov    %rax,%r15
cmp    $0x7f,%rax
jne    1205 <get_key_buf_char+0xc5>
mov    $0x7f,%r15d
movb   $0x0,(%r15,%r14,1)
mov    %r14,%rdi
pop    %rbx
pop    %r14
pop    %r15
jmp    1030 <get_key_n@plt>
xor    %ebx,%ebx
jmp    125d <get_key_buf_char+0x11d>
mov    $0xa,%ebx
jmp    125d <get_key_buf_char+0x11d>
mov    $0x9,%ebx
mov    %rbx,%rax
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@get_key_buf_char.buf = internal global [128 x i8] zeroinitializer
define i64 @get_key_buf_char() {
%1 = alloca i64
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
br label %5
5: ; preds = %0, %28, %48
%6 = call i64 (...) @get_key_buf_char_sub()
store i64 %6, i64* %2
%7 = load i64, i64* %2
%8 = icmp eq i64 %7, 0
br i1 %8, label %9, label %11
9: ; preds = %5
%10 = load i64, i64* %2
store i64 %10, i64* %1
br label %82
11: ; preds = %5
%12 = load i64, i64* %2
%13 = icmp eq i64 %12, 92
br i1 %13, label %14, label %31
14: ; preds = %11
%15 = call i64 (...) @get_key_buf_char_sub()
store i64 %15, i64* %2
%16 = load i64, i64* %2
%17 = icmp eq i64 %16, 0
br i1 %17, label %18, label %20
18: ; preds = %14
%19 = load i64, i64* %2
store i64 %19, i64* %1
br label %82
20: ; preds = %14
%21 = load i64, i64* %2
%22 = call i64 @isalpha(i64 %21)
%23 = icmp ne i64 %22, 0
br i1 %23, label %24, label %29
24: ; preds = %20
%25 = load i64, i64* %2
switch i64 %25, label %28 [
i64 110, label %26
i64 116, label %27
]
26: ; preds = %24
store i64 10, i64* %1
br label %82
27: ; preds = %24
store i64 9, i64* %1
br label %82
28: ; preds = %24
br label %5
29: ; preds = %20
%30 = load i64, i64* %2
store i64 %30, i64* %1
br label %82
31: ; preds = %11
%32 = load i64, i64* %2
%33 = icmp eq i64 %32, 94
br i1 %33, label %34, label %49
34: ; preds = %31
%35 = call i64 (...) @get_key_buf_char_sub()
store i64 %35, i64* %2
%36 = load i64, i64* %2
%37 = icmp eq i64 %36, 0
br i1 %37, label %38, label %40
38: ; preds = %34
%39 = load i64, i64* %2
store i64 %39, i64* %1
br label %82
40: ; preds = %34
%41 = load i64, i64* %2
%42 = call i64 @isalpha(i64 %41)
%43 = icmp ne i64 %42, 0
br i1 %43, label %44, label %48
44: ; preds = %40
%45 = load i64, i64* %2
%46 = call i64 @toupper(i64 %45)
%47 = sub nsw i64 %46, 64
store i64 %47, i64* %1
br label %82
48: ; preds = %40
br label %5
49: ; preds = %31
%50 = load i64, i64* %2
%51 = icmp eq i64 %50, 38
br i1 %51, label %52, label %80
52: ; preds = %49
store i64 127, i64* %3
store i64 0, i64* %4
br label %53
53: ; preds = %69, %68, %64, %52
%54 = load i64, i64* %4
%55 = icmp slt i64 %54, 127
br i1 %55, label %56, label %76
56: ; preds = %53
%57 = call i64 (...) @get_key_buf_char_sub()
store i64 %57, i64* %2
%58 = load i64, i64* %2
%59 = icmp eq i64 %58, 59
br i1 %59, label %60, label %61
60: ; preds = %56
br label %76
61: ; preds = %56
%62 = load i64, i64* %2
%63 = icmp eq i64 %62, 0
br i1 %63, label %64, label %65
64: ; preds = %61
br label %53
65: ; preds = %61
%66 = load i64, i64* %2
%67 = icmp eq i64 %66, 124
br i1 %67, label %68, label %69
68: ; preds = %65
br label %53
69: ; preds = %65
%70 = load i64, i64* %2
%71 = trunc i64 %70 to i8
%72 = load i64, i64* %4
%73 = getelementptr inbounds [128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 %72
store i8 %71, i8* %73
%74 = load i64, i64* %4
%75 = add nsw i64 %74, 1
store i64 %75, i64* %4
br label %53
76: ; preds = %60, %53
%77 = load i64, i64* %4
%78 = getelementptr inbounds [128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 %77
store i8 0, i8* %78
%79 = call i64 @get_key_n(i8* getelementptr inbounds ([128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 0))
store i64 %79, i64* %1
br label %82
80: ; preds = %49
%81 = load i64, i64* %2
store i64 %81, i64* %1
br label %82
82: ; preds = %80, %76, %44, %38, %29, %27, %26, %18, %9
%83 = load i64, i64* %1
ret i64 %83
}

LLVM IR (-O2):
@get_key_buf_char.buf = internal global [128 x i8] zeroinitializer
define i64 @get_key_buf_char() {
br label %1
1: ; preds = %10, %0
%2 = tail call i64 (...) @get_key_buf_char_sub()
switch i64 %2, label %38 [
i64 0, label %36
i64 92, label %3
i64 94, label %11
i64 38, label %29
]
3: ; preds = %1
%4 = tail call i64 (...) @get_key_buf_char_sub()
%5 = icmp eq i64 %4, 0
br i1 %5, label %36, label %6
6: ; preds = %3
%7 = tail call i64 @isalpha(i64 %4)
%8 = icmp eq i64 %7, 0
br i1 %8, label %36, label %9
9: ; preds = %6
switch i64 %4, label %10 [
i64 110, label %36
i64 116, label %38
]
10: ; preds = %9, %14
br label %1
11: ; preds = %1
%12 = tail call i64 (...) @get_key_buf_char_sub()
%13 = icmp eq i64 %12, 0
br i1 %13, label %36, label %14
14: ; preds = %11
%15 = tail call i64 @isalpha(i64 %12)
%16 = icmp eq i64 %15, 0
br i1 %16, label %10, label %17
17: ; preds = %14
%18 = tail call i64 @toupper(i64 %12)
%19 = add nsw i64 %18, -64
br label %38
20: ; preds = %29, %22
%21 = tail call i64 (...) @get_key_buf_char_sub()
switch i64 %21, label %23 [
i64 59, label %32
i64 124, label %22
i64 0, label %22
]
22: ; preds = %20, %20
br i1 %30, label %20, label %32
23: ; preds = %20
%24 = trunc i64 %21 to i8
%25 = getelementptr inbounds [128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 %31
store i8 %24, i8* %25
%26 = add nuw nsw i64 %31, 1
%27 = icmp ult i64 %31, 126
%28 = icmp eq i64 %26, 127
br i1 %28, label %32, label %29
29: ; preds = %1, %23
%30 = phi i1 [ %27, %23 ], [ true, %1 ]
%31 = phi i64 [ %26, %23 ], [ 0, %1 ]
br label %20
32: ; preds = %23, %22, %20
%33 = phi i64 [ %31, %20 ], [ %31, %22 ], [ 127, %23 ]
%34 = getelementptr inbounds [128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 %33
store i8 0, i8* %34
%35 = tail call i64 @get_key_n(i8* getelementptr inbounds ([128 x i8], [128 x i8]* @get_key_buf_char.buf, i64 0, i64 0))
br label %38
36: ; preds = %3, %9, %6, %11, %1
%37 = phi i64 [ 0, %11 ], [ %4, %6 ], [ 10, %9 ], [ 0, %3 ], [ %2, %1 ]
br label %38
38: ; preds = %1, %9, %36, %32, %17
%39 = phi i64 [ %19, %17 ], [ %35, %32 ], [ %37, %36 ], [ 9, %9 ], [ %2, %1 ]
ret i64 %39
}