#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 */
int GetKey(int);
scalar_t__ isupper(char);
int /*<<< orphan*/ printf(char *, ...);
int toupper(int);
void GetStrName(char *ibuf, int max) {
  int cnt, ch, upflag;
  cnt = 0;
  ch = 1;
  upflag = 1;
  max++;
  for (;;) {
    ch = GetKey(4 | 8 | 16 | 128);
    if (ch == ' ' && upflag == 1)
      continue;
    if (((ch == '\b') || (ch == '\x7f')) && cnt == 0)
      continue;
    if ((ch == '\b') || (ch == '\x7f')) {
      cnt--;
      if (isupper(ibuf[cnt]))
        upflag = 1;
      else
        upflag = 0;
      printf("\b \b");
      continue;
    }
    if (ch == '\n') {
      ibuf[cnt] = '\0';
      cnt = 0;
      printf("\n");
      break;
    }
    if (max > 1 && cnt == max - 1)
      continue;
    if (ch < 32)
      continue;
    if (upflag == 1) {
      cnt++;
      ibuf[cnt - 1] = (char)toupper(ch);
      ibuf[cnt] = '\0';
      printf("%c", toupper(ch));
      upflag = 0;
    } else {
      cnt++;
      ibuf[cnt - 1] = (char)ch;
      ibuf[cnt] = '\0';
      printf("%c", ch);
    }
    if (ch == ' ' && upflag == 0)
      upflag = 1;
    else
      upflag = 0;
    if (max == 1) {
      ibuf[cnt] = '\0';
      break;
    }
  }
  return;
}


x86 assembly (clang, -O0):
<GetStrName>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x1,-0x14(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    $0x9c,%edi
call   1050 <GetKey@plt>
mov    %eax,-0x14(%rbp)
cmpl   $0x20,-0x14(%rbp)
jne    1193 <GetStrName+0x53>
cmpl   $0x1,-0x18(%rbp)
jne    1193 <GetStrName+0x53>
jmp    116d <GetStrName+0x2d>
cmpl   $0x8,-0x14(%rbp)
je     11a7 <GetStrName+0x67>
cmpl   $0x7f,-0x14(%rbp)
jne    11b6 <GetStrName+0x76>
cmpl   $0x0,-0x10(%rbp)
jne    11b6 <GetStrName+0x76>
jmp    116d <GetStrName+0x2d>
cmpl   $0x8,-0x14(%rbp)
je     11ca <GetStrName+0x8a>
cmpl   $0x7f,-0x14(%rbp)
jne    1214 <GetStrName+0xd4>
mov    -0x10(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1060 <isupper@plt>
cmp    $0x0,%rax
je     11fa <GetStrName+0xba>
movl   $0x1,-0x18(%rbp)
jmp    1201 <GetStrName+0xc1>
movl   $0x0,-0x18(%rbp)
lea    0xdf8(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    116d <GetStrName+0x2d>
cmpl   $0xa,-0x14(%rbp)
jne    1244 <GetStrName+0x104>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
movl   $0x0,-0x10(%rbp)
lea    0xdcc(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1352 <GetStrName+0x212>
cmpl   $0x1,-0xc(%rbp)
jle    1264 <GetStrName+0x124>
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    1264 <GetStrName+0x124>
jmp    116d <GetStrName+0x2d>
cmpl   $0x20,-0x14(%rbp)
jge    1273 <GetStrName+0x133>
jmp    116d <GetStrName+0x2d>
cmpl   $0x1,-0x18(%rbp)
jne    12d0 <GetStrName+0x190>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x14(%rbp),%edi
call   1030 <toupper@plt>
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x14(%rbp),%edi
call   1030 <toupper@plt>
mov    %eax,%esi
lea    0xd49(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x0,-0x18(%rbp)
jmp    130b <GetStrName+0x1cb>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x14(%rbp),%esi
lea    0xd02(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
cmpl   $0x20,-0x14(%rbp)
jne    132b <GetStrName+0x1eb>
cmpl   $0x0,-0x18(%rbp)
jne    132b <GetStrName+0x1eb>
movl   $0x1,-0x18(%rbp)
jmp    1332 <GetStrName+0x1f2>
movl   $0x0,-0x18(%rbp)
cmpl   $0x1,-0xc(%rbp)
jne    134d <GetStrName+0x20d>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1352 <GetStrName+0x212>
jmp    116d <GetStrName+0x2d>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetStrName>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %esi,%r12d
mov    %rdi,(%rsp)
mov    $0x1,%ebp
xor    %r13d,%r13d
mov    %ebp,%r15d
mov    %r15d,%ebp
mov    $0x9c,%edi
call   1060 <GetKey@plt>
mov    %eax,%ebx
mov    $0x1,%r15d
jmp    11a1 <GetStrName+0x51>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cmp    $0x20,%ebx
jge    11e6 <GetStrName+0x96>
mov    $0x9c,%edi
call   1060 <GetKey@plt>
mov    %eax,%ebx
cmp    $0x20,%eax
sete   %r14b
jne    11af <GetStrName+0x5f>
cmp    $0x1,%ebp
je     116d <GetStrName+0x1d>
cmp    $0x8,%ebx
setne  %al
cmp    $0x7f,%ebx
setne  %cl
test   %cl,%al
jne    11c4 <GetStrName+0x74>
test   %r13d,%r13d
je     1167 <GetStrName+0x17>
cmp    $0x7f,%ebx
je     1220 <GetStrName+0xd0>
cmp    $0xa,%ebx
je     128e <GetStrName+0x13e>
cmp    $0x8,%ebx
je     1220 <GetStrName+0xd0>
test   %r12d,%r12d
jle    1190 <GetStrName+0x40>
cmp    %r12d,%r13d
je     1195 <GetStrName+0x45>
cmp    $0x1f,%ebx
jle    1195 <GetStrName+0x45>
movslq %r13d,%r15
lea    0x1(%r15),%r13
cmp    $0x1,%ebp
jne    1252 <GetStrName+0x102>
mov    %ebx,%edi
call   1040 <toupper@plt>
mov    (%rsp),%rcx
mov    %al,(%rcx,%r15,1)
movb   $0x0,(%rcx,%r13,1)
mov    %ebx,%edi
call   1040 <toupper@plt>
mov    %eax,%ebx
jmp    125f <GetStrName+0x10f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movslq %r13d,%r13
mov    (%rsp),%rax
movsbl -0x1(%rax,%r13,1),%edi
add    $0xffffffffffffffff,%r13
call   1070 <isupper@plt>
xor    %ebp,%ebp
test   %rax,%rax
setne  %bpl
lea    0xdba(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
jmp    116a <GetStrName+0x1a>
mov    (%rsp),%rax
mov    %bl,(%rax,%r15,1)
movb   $0x0,(%rax,%r13,1)
mov    %ebx,%edi
call   1030 <putchar@plt>
movzbl %r14b,%ebp
and    $0x1,%ebp
test   %r12d,%r12d
jne    116a <GetStrName+0x1a>
mov    (%rsp),%rax
movb   $0x0,(%rax,%r13,1)
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movslq %r13d,%rax
mov    (%rsp),%rcx
movb   $0x0,(%rcx,%rax,1)
mov    $0xa,%edi
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <putchar@plt>

LLVM IR (-O0):
@.str = [4 x i8] c"\08 \08\00"
@.str.1 = [2 x i8] c"\0A\00"
@.str.2 = [3 x i8] c"%c\00"
define void @GetStrName(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 0, i32* %5
store i32 1, i32* %6
store i32 1, i32* %7
%8 = load i32, i32* %4
%9 = add nsw i32 %8, 1
store i32 %9, i32* %4
br label %10
10: ; preds = %123, %69, %65, %46, %27, %17, %2
%11 = call i32 @GetKey(i32 156)
store i32 %11, i32* %6
%12 = load i32, i32* %6
%13 = icmp eq i32 %12, 32
br i1 %13, label %14, label %18
14: ; preds = %10
%15 = load i32, i32* %7
%16 = icmp eq i32 %15, 1
br i1 %16, label %17, label %18
17: ; preds = %14
br label %10
18: ; preds = %14, %10
%19 = load i32, i32* %6
%20 = icmp eq i32 %19, 8
br i1 %20, label %24, label %21
21: ; preds = %18
%22 = load i32, i32* %6
%23 = icmp eq i32 %22, 127
br i1 %23, label %24, label %28
24: ; preds = %21, %18
%25 = load i32, i32* %5
%26 = icmp eq i32 %25, 0
br i1 %26, label %27, label %28
27: ; preds = %24
br label %10
28: ; preds = %24, %21
%29 = load i32, i32* %6
%30 = icmp eq i32 %29, 8
br i1 %30, label %34, label %31
31: ; preds = %28
%32 = load i32, i32* %6
%33 = icmp eq i32 %32, 127
br i1 %33, label %34, label %48
34: ; preds = %31, %28
%35 = load i32, i32* %5
%36 = add nsw i32 %35, -1
store i32 %36, i32* %5
%37 = load i8*, i8** %3
%38 = load i32, i32* %5
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
%41 = load i8, i8* %40
%42 = call i64 @isupper(i8 signext %41)
%43 = icmp ne i64 %42, 0
br i1 %43, label %44, label %45
44: ; preds = %34
store i32 1, i32* %7
br label %46
45: ; preds = %34
store i32 0, i32* %7
br label %46
46: ; preds = %45, %44
%47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
br label %10
48: ; preds = %31
%49 = load i32, i32* %6
%50 = icmp eq i32 %49, 10
br i1 %50, label %51, label %57
51: ; preds = %48
%52 = load i8*, i8** %3
%53 = load i32, i32* %5
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
store i8 0, i8* %55
store i32 0, i32* %5
%56 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
br label %124
57: ; preds = %48
%58 = load i32, i32* %4
%59 = icmp sgt i32 %58, 1
br i1 %59, label %60, label %66
60: ; preds = %57
%61 = load i32, i32* %5
%62 = load i32, i32* %4
%63 = sub nsw i32 %62, 1
%64 = icmp eq i32 %61, %63
br i1 %64, label %65, label %66
65: ; preds = %60
br label %10
66: ; preds = %60, %57
%67 = load i32, i32* %6
%68 = icmp slt i32 %67, 32
br i1 %68, label %69, label %70
69: ; preds = %66
br label %10
70: ; preds = %66
%71 = load i32, i32* %7
%72 = icmp eq i32 %71, 1
br i1 %72, label %73, label %91
73: ; preds = %70
%74 = load i32, i32* %5
%75 = add nsw i32 %74, 1
store i32 %75, i32* %5
%76 = load i32, i32* %6
%77 = call i32 @toupper(i32 %76)
%78 = trunc i32 %77 to i8
%79 = load i8*, i8** %3
%80 = load i32, i32* %5
%81 = sub nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8, i8* %79, i64 %82
store i8 %78, i8* %83
%84 = load i8*, i8** %3
%85 = load i32, i32* %5
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %84, i64 %86
store i8 0, i8* %87
%88 = load i32, i32* %6
%89 = call i32 @toupper(i32 %88)
%90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 %89)
store i32 0, i32* %7
br label %107
91: ; preds = %70
%92 = load i32, i32* %5
%93 = add nsw i32 %92, 1
store i32 %93, i32* %5
%94 = load i32, i32* %6
%95 = trunc i32 %94 to i8
%96 = load i8*, i8** %3
%97 = load i32, i32* %5
%98 = sub nsw i32 %97, 1
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds i8, i8* %96, i64 %99
store i8 %95, i8* %100
%101 = load i8*, i8** %3
%102 = load i32, i32* %5
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %101, i64 %103
store i8 0, i8* %104
%105 = load i32, i32* %6
%106 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 %105)
br label %107
107: ; preds = %91, %73
%108 = load i32, i32* %6
%109 = icmp eq i32 %108, 32
br i1 %109, label %110, label %114
110: ; preds = %107
%111 = load i32, i32* %7
%112 = icmp eq i32 %111, 0
br i1 %112, label %113, label %114
113: ; preds = %110
store i32 1, i32* %7
br label %115
114: ; preds = %110, %107
store i32 0, i32* %7
br label %115
115: ; preds = %114, %113
%116 = load i32, i32* %4
%117 = icmp eq i32 %116, 1
br i1 %117, label %118, label %123
118: ; preds = %115
%119 = load i8*, i8** %3
%120 = load i32, i32* %5
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %119, i64 %121
store i8 0, i8* %122
br label %124
123: ; preds = %115
br label %10
124: ; preds = %118, %51
ret void
}

LLVM IR (-O2):
@.str = [4 x i8] c"\08 \08\00"
define void @GetStrName(i8* nocapture %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
%4 = icmp eq i32 %1, 0
br label %5
5: ; preds = %34, %2
%6 = phi i32 [ 0, %2 ], [ %35, %34 ]
%7 = phi i32 [ 1, %2 ], [ %36, %34 ]
%8 = icmp eq i32 %6, 0
%9 = icmp eq i32 %6, %1
br label %10
10: ; preds = %16, %5
%11 = phi i32 [ %7, %5 ], [ 1, %16 ]
%12 = tail call i32 @GetKey(i32 156)
%13 = icmp eq i32 %12, 32
%14 = icmp eq i32 %11, 1
%15 = select i1 %13, i1 %14, i1 false
br i1 %15, label %16, label %17
16: ; preds = %45, %10
br label %10
17: ; preds = %10, %45
%18 = phi i1 [ %47, %45 ], [ %13, %10 ]
%19 = phi i32 [ %46, %45 ], [ %12, %10 ]
%20 = icmp eq i32 %19, 8
%21 = icmp eq i32 %19, 127
%22 = or i1 %20, %21
%23 = select i1 %22, i1 %8, i1 false
br i1 %23, label %34, label %24
24: ; preds = %17
switch i32 %19, label %41 [
i32 127, label %25
i32 8, label %25
i32 10, label %37
]
25: ; preds = %24, %24
%26 = add nsw i32 %6, -1
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %0, i64 %27
%29 = load i8, i8* %28
%30 = tail call i64 @isupper(i8 signext %29)
%31 = icmp ne i64 %30, 0
%32 = zext i1 %31 to i32
%33 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
br label %34
34: ; preds = %17, %25, %66
%35 = phi i32 [ %51, %66 ], [ %26, %25 ], [ 0, %17 ]
%36 = phi i32 [ %69, %66 ], [ %32, %25 ], [ %11, %17 ]
br label %5
37: ; preds = %24
%38 = sext i32 %6 to i64
%39 = getelementptr inbounds i8, i8* %0, i64 %38
store i8 0, i8* %39
%40 = tail call i32 @putchar(i32 10)
br label %73
41: ; preds = %24
%42 = icmp slt i32 %19, 32
br i1 %3, label %43, label %49
43: ; preds = %41
%44 = select i1 %9, i1 true, i1 %42
br i1 %44, label %45, label %50
45: ; preds = %43, %49
%46 = tail call i32 @GetKey(i32 156)
%47 = icmp eq i32 %46, 32
%48 = select i1 %47, i1 %14, i1 false
br i1 %48, label %16, label %17
49: ; preds = %41
br i1 %42, label %45, label %50
50: ; preds = %43, %49
%51 = add nsw i32 %6, 1
br i1 %14, label %52, label %60
52: ; preds = %50
%53 = tail call i32 @toupper(i32 %19)
%54 = trunc i32 %53 to i8
%55 = sext i32 %6 to i64
%56 = getelementptr inbounds i8, i8* %0, i64 %55
store i8 %54, i8* %56
%57 = sext i32 %51 to i64
%58 = getelementptr inbounds i8, i8* %0, i64 %57
store i8 0, i8* %58
%59 = tail call i32 @toupper(i32 %19)
br label %66
60: ; preds = %50
%61 = trunc i32 %19 to i8
%62 = sext i32 %6 to i64
%63 = getelementptr inbounds i8, i8* %0, i64 %62
store i8 %61, i8* %63
%64 = sext i32 %51 to i64
%65 = getelementptr inbounds i8, i8* %0, i64 %64
store i8 0, i8* %65
br label %66
66: ; preds = %60, %52
%67 = phi i32 [ %19, %60 ], [ %59, %52 ]
%68 = tail call i32 @putchar(i32 %67)
%69 = zext i1 %18 to i32
br i1 %4, label %70, label %34
70: ; preds = %66
%71 = sext i32 %51 to i64
%72 = getelementptr inbounds i8, i8* %0, i64 %71
store i8 0, i8* %72
br label %73
73: ; preds = %70, %37
ret void
}