#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 */
char fgetc(int /*<<< orphan*/);
char *reallocMemory(char *, int *);
int /*<<< orphan*/ stdin;
int readName(char **name) {
  char *tmpName = NULL;
  char c;
  int maxMemory = 0, nameLength = 0, spacesInRow = 0;
  int spaceAtEnd = 0;
  while (1) {
    c = fgetc(stdin);
    if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && c != ' ') {
      if (nameLength == 0) {
        if (c == '\n')
          return -2;
        else
          return 0;
      }
      if (c != '\n')
        return 0;
      else if (c == '\n' && spaceAtEnd)
        return -2;
      else
        break;
    } else {
      if (c == ' ') {
        spacesInRow++;
        spaceAtEnd = 1;
        if (spacesInRow == 2 || nameLength == 0)
          return 0;
      } else {
        spacesInRow = 0;
        spaceAtEnd = 0;
      }
      if (nameLength + 1 >= maxMemory)
        tmpName = reallocMemory(tmpName, &maxMemory);
      tmpName[nameLength++] = c;
      *name = tmpName;
    }
  }
  tmpName[nameLength] = '\0';
  *name = tmpName;
  return 1;
}


x86 assembly (clang, -O0):
<readName>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    0x2e91(%rip),%rax
mov    (%rax),%edi
call   1030 <fgetc@plt>
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x61,%eax
jl     117b <readName+0x5b>
movsbl -0x19(%rbp),%eax
cmp    $0x7a,%eax
jle    1212 <readName+0xf2>
movsbl -0x19(%rbp),%eax
cmp    $0x41,%eax
jl     1195 <readName+0x75>
movsbl -0x19(%rbp),%eax
cmp    $0x5a,%eax
jle    1212 <readName+0xf2>
movsbl -0x19(%rbp),%eax
cmp    $0x20,%eax
je     1212 <readName+0xf2>
cmpl   $0x0,-0x24(%rbp)
jne    11d1 <readName+0xb1>
movsbl -0x19(%rbp),%eax
cmp    $0xa,%eax
jne    11c5 <readName+0xa5>
movl   $0xfffffffe,-0x4(%rbp)
jmp    12c8 <readName+0x1a8>
movl   $0x0,-0x4(%rbp)
jmp    12c8 <readName+0x1a8>
movsbl -0x19(%rbp),%eax
cmp    $0xa,%eax
je     11ea <readName+0xca>
movl   $0x0,-0x4(%rbp)
jmp    12c8 <readName+0x1a8>
movsbl -0x19(%rbp),%eax
cmp    $0xa,%eax
jne    120d <readName+0xed>
cmpl   $0x0,-0x2c(%rbp)
je     120d <readName+0xed>
movl   $0xfffffffe,-0x4(%rbp)
jmp    12c8 <readName+0x1a8>
jmp    12aa <readName+0x18a>
movsbl -0x19(%rbp),%eax
cmp    $0x20,%eax
jne    1254 <readName+0x134>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movl   $0x1,-0x2c(%rbp)
cmpl   $0x2,-0x28(%rbp)
je     1243 <readName+0x123>
cmpl   $0x0,-0x24(%rbp)
jne    124f <readName+0x12f>
movl   $0x0,-0x4(%rbp)
jmp    12c8 <readName+0x1a8>
jmp    1262 <readName+0x142>
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
cmp    -0x20(%rbp),%eax
jl     1282 <readName+0x162>
mov    -0x18(%rbp),%rdi
lea    -0x20(%rbp),%rsi
call   1040 <reallocMemory@plt>
mov    %rax,-0x18(%rbp)
mov    -0x19(%rbp),%dl
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
jmp    1150 <readName+0x30>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<readName>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdi,%r14
movl   $0x0,0x4(%rsp)
xor    %r13d,%r13d
xor    %r12d,%r12d
xor    %ebp,%ebp
jmp    114e <readName+0x2e>
mov    %bl,(%r12,%r13,1)
mov    %r12,(%r14)
add    $0x1,%r13
mov    %r15d,%ebp
mov    0x2e93(%rip),%rax
mov    (%rax),%edi
call   1030 <fgetc@plt>
mov    %eax,%ebx
lea    -0x7b(%rbx),%eax
mov    $0x0,%r15d
cmp    $0xe5,%al
ja     1194 <readName+0x74>
cmp    $0x20,%bl
je     1177 <readName+0x57>
lea    -0x5b(%rbx),%eax
cmp    $0xe5,%al
jbe    11b0 <readName+0x90>
mov    $0x0,%r15d
cmp    $0x20,%bl
jne    1194 <readName+0x74>
xor    %eax,%eax
cmp    $0x1,%ebp
je     11e4 <readName+0xc4>
mov    $0x1,%r15d
test   %r13,%r13
je     11e4 <readName+0xc4>
lea    0x1(%r13),%eax
cmp    %eax,0x4(%rsp)
jg     1140 <readName+0x20>
mov    %r12,%rdi
lea    0x4(%rsp),%rsi
call   1040 <reallocMemory@plt>
mov    %rax,%r12
jmp    1140 <readName+0x20>
test   %r13d,%r13d
je     11d7 <readName+0xb7>
xor    %eax,%eax
cmp    $0xa,%bl
jne    11e4 <readName+0xc4>
mov    $0xfffffffe,%eax
test   %ebp,%ebp
jne    11e4 <readName+0xc4>
mov    %r13d,%eax
movb   $0x0,(%r12,%rax,1)
mov    %r12,(%r14)
mov    $0x1,%eax
jmp    11e4 <readName+0xc4>
xor    %eax,%eax
cmp    $0xa,%bl
setne  %al
add    %eax,%eax
add    $0xfffffffe,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@stdin = global i32 0
define i32 @readName(i8** %0) {
%2 = alloca i32
%3 = alloca i8**
%4 = alloca i8*
%5 = alloca i8
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8** %0, i8*** %3
store i8* null, i8** %4
store i32 0, i32* %6
store i32 0, i32* %7
store i32 0, i32* %8
store i32 0, i32* %9
br label %10
10: ; preds = %1, %87
%11 = load i32, i32* @stdin
%12 = call signext i8 @fgetc(i32 %11)
store i8 %12, i8* %5
%13 = load i8, i8* %5
%14 = sext i8 %13 to i32
%15 = icmp slt i32 %14, 97
br i1 %15, label %20, label %16
16: ; preds = %10
%17 = load i8, i8* %5
%18 = sext i8 %17 to i32
%19 = icmp sgt i32 %18, 122
br i1 %19, label %20, label %55
20: ; preds = %16, %10
%21 = load i8, i8* %5
%22 = sext i8 %21 to i32
%23 = icmp slt i32 %22, 65
br i1 %23, label %28, label %24
24: ; preds = %20
%25 = load i8, i8* %5
%26 = sext i8 %25 to i32
%27 = icmp sgt i32 %26, 90
br i1 %27, label %28, label %55
28: ; preds = %24, %20
%29 = load i8, i8* %5
%30 = sext i8 %29 to i32
%31 = icmp ne i32 %30, 32
br i1 %31, label %32, label %55
32: ; preds = %28
%33 = load i32, i32* %7
%34 = icmp eq i32 %33, 0
br i1 %34, label %35, label %41
35: ; preds = %32
%36 = load i8, i8* %5
%37 = sext i8 %36 to i32
%38 = icmp eq i32 %37, 10
br i1 %38, label %39, label %40
39: ; preds = %35
store i32 -2, i32* %2
br label %95
40: ; preds = %35
store i32 0, i32* %2
br label %95
41: ; preds = %32
%42 = load i8, i8* %5
%43 = sext i8 %42 to i32
%44 = icmp ne i32 %43, 10
br i1 %44, label %45, label %46
45: ; preds = %41
store i32 0, i32* %2
br label %95
46: ; preds = %41
%47 = load i8, i8* %5
%48 = sext i8 %47 to i32
%49 = icmp eq i32 %48, 10
br i1 %49, label %50, label %54
50: ; preds = %46
%51 = load i32, i32* %9
%52 = icmp ne i32 %51, 0
br i1 %52, label %53, label %54
53: ; preds = %50
store i32 -2, i32* %2
br label %95
54: ; preds = %50, %46
br label %88
55: ; preds = %28, %24, %16
%56 = load i8, i8* %5
%57 = sext i8 %56 to i32
%58 = icmp eq i32 %57, 32
br i1 %58, label %59, label %69
59: ; preds = %55
%60 = load i32, i32* %8
%61 = add nsw i32 %60, 1
store i32 %61, i32* %8
store i32 1, i32* %9
%62 = load i32, i32* %8
%63 = icmp eq i32 %62, 2
br i1 %63, label %67, label %64
64: ; preds = %59
%65 = load i32, i32* %7
%66 = icmp eq i32 %65, 0
br i1 %66, label %67, label %68
67: ; preds = %64, %59
store i32 0, i32* %2
br label %95
68: ; preds = %64
br label %70
69: ; preds = %55
store i32 0, i32* %8
store i32 0, i32* %9
br label %70
70: ; preds = %69, %68
%71 = load i32, i32* %7
%72 = add nsw i32 %71, 1
%73 = load i32, i32* %6
%74 = icmp sge i32 %72, %73
br i1 %74, label %75, label %78
75: ; preds = %70
%76 = load i8*, i8** %4
%77 = call i8* @reallocMemory(i8* %76, i32* %6)
store i8* %77, i8** %4
br label %78
78: ; preds = %75, %70
%79 = load i8, i8* %5
%80 = load i8*, i8** %4
%81 = load i32, i32* %7
%82 = add nsw i32 %81, 1
store i32 %82, i32* %7
%83 = sext i32 %81 to i64
%84 = getelementptr inbounds i8, i8* %80, i64 %83
store i8 %79, i8* %84
%85 = load i8*, i8** %4
%86 = load i8**, i8*** %3
store i8* %85, i8** %86
br label %87
87: ; preds = %78
br label %10
88: ; preds = %54
%89 = load i8*, i8** %4
%90 = load i32, i32* %7
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds i8, i8* %89, i64 %91
store i8 0, i8* %92
%93 = load i8*, i8** %4
%94 = load i8**, i8*** %3
store i8* %93, i8** %94
store i32 1, i32* %2
br label %95
95: ; preds = %88, %67, %53, %45, %40, %39
%96 = load i32, i32* %2
ret i32 %96
}

LLVM IR (-O2):
@stdin = global i32 0
define i32 @readName(i8** nocapture writeonly %0) {
%2 = alloca i32
%3 = bitcast i32* %2 to i8*
store i32 0, i32* %2
br label %4
4: ; preds = %40, %1
%5 = phi i64 [ %34, %40 ], [ 0, %1 ]
%6 = phi i8* [ %41, %40 ], [ null, %1 ]
%7 = phi i32 [ %33, %40 ], [ 0, %1 ]
%8 = load i32, i32* @stdin
%9 = call signext i8 @fgetc(i32 %8)
%10 = add i8 %9, -123
%11 = icmp ult i8 %10, -26
br i1 %11, label %12, label %32
12: ; preds = %4
%13 = add i8 %9, -91
%14 = icmp ult i8 %13, -26
%15 = icmp ne i8 %9, 32
%16 = and i1 %15, %14
br i1 %16, label %17, label %26
17: ; preds = %12
%18 = trunc i64 %5 to i32
%19 = icmp eq i32 %18, 0
%20 = icmp eq i8 %9, 10
br i1 %19, label %21, label %23
21: ; preds = %17
%22 = select i1 %20, i32 -2, i32 0
br label %46
23: ; preds = %17
br i1 %20, label %24, label %46
24: ; preds = %23
%25 = icmp eq i32 %7, 0
br i1 %25, label %43, label %46
26: ; preds = %12
%27 = icmp eq i8 %9, 32
br i1 %27, label %28, label %32
28: ; preds = %26
%29 = icmp eq i32 %7, 1
%30 = icmp eq i64 %5, 0
%31 = select i1 %29, i1 true, i1 %30
br i1 %31, label %46, label %32
32: ; preds = %4, %26, %28
%33 = phi i32 [ 1, %28 ], [ 0, %26 ], [ 0, %4 ]
%34 = add nuw i64 %5, 1
%35 = load i32, i32* %2
%36 = trunc i64 %34 to i32
%37 = icmp sgt i32 %35, %36
br i1 %37, label %40, label %38
38: ; preds = %32
%39 = call i8* @reallocMemory(i8* %6, i32* %2)
br label %40
40: ; preds = %38, %32
%41 = phi i8* [ %39, %38 ], [ %6, %32 ]
%42 = getelementptr inbounds i8, i8* %41, i64 %5
store i8 %9, i8* %42
store i8* %41, i8** %0
br label %4
43: ; preds = %24
%44 = and i64 %5, 4294967295
%45 = getelementptr inbounds i8, i8* %6, i64 %44
store i8 0, i8* %45
store i8* %6, i8** %0
br label %46
46: ; preds = %28, %24, %23, %21, %43
%47 = phi i32 [ 1, %43 ], [ %22, %21 ], [ 0, %23 ], [ -2, %24 ], [ 0, %28 ]
ret i32 %47
}