#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 */
typedef int /*<<< orphan*/ buf;
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ fclose(int /*<<< orphan*/ *);
scalar_t__ fgets(char *, int, int /*<<< orphan*/ *);
int /*<<< orphan*/ fieldcpy(char *, char *);
int /*<<< orphan*/ *fopen(char *, char *);
int /*<<< orphan*/ fputc(char, int /*<<< orphan*/);
int /*<<< orphan*/ fputs(char *, int /*<<< orphan*/);
int /*<<< orphan*/ free(char *);
char *malloc(size_t);
int /*<<< orphan*/ oom_die();
int /*<<< orphan*/ perror(char *);
char *realloc(char *, size_t);
int /*<<< orphan*/ stdout;
scalar_t__ strcmp(char *, char *);
int /*<<< orphan*/ strcpy(char *, char *);
int strlen(char *);
scalar_t__ strncasecmp(char *, char *, int);
void dopkgstanzas(char *pkgsfile, char **pkgs, int pkgc) {
  char buf[1000];
  char *accum;
  size_t accum_size = 0, accum_alloc = 1000 * 2;
  char cur_pkg[1000];
  FILE *f;
  accum = malloc(accum_alloc);
  if (!accum)
    oom_die();
  f = fopen(pkgsfile, "r");
  if (f == NULL) {
    perror(pkgsfile);
    free(accum);
    exit(1);
  }
  while (fgets(buf, sizeof(buf), f)) {
    if (*buf) {
      size_t len = strlen(buf);
      if (accum_size + len + 1 > accum_alloc) {
        accum_alloc = (accum_size + len + 1) * 2;
        accum = realloc(accum, accum_alloc);
        if (!accum)
          oom_die();
      }
      strcpy(accum + accum_size, buf);
      accum_size += len;
    }
    if (*buf && buf[strlen(buf) - 1] == '\n')
      buf[strlen(buf) - 1] = '\0';
    if (strncasecmp(buf, "Package:", 8) == 0) {
      fieldcpy(cur_pkg, buf);
    } else if (!*buf) {
      int i;
      for (i = 0; i < pkgc; i++) {
        if (!pkgs[i])
          continue;
        if (strcmp(cur_pkg, pkgs[i]) == 0) {
          fputs(accum, stdout);
          if (accum[accum_size - 1] != '\n')
            fputs("\n\n", stdout);
          else if (accum[accum_size - 2] != '\n')
            fputc('\n', stdout);
          break;
        }
      }
      *accum = '\0';
      accum_size = 0;
    }
  }
  fclose(f);
  free(accum);
}


x86 assembly (clang, -O0):
<dopkgstanzas>:
push   %rbp
mov    %rsp,%rbp
sub    $0x820,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movq   $0x0,-0x410(%rbp)
movq   $0x7d0,-0x418(%rbp)
mov    -0x418(%rbp),%rdi
call   10b0 <malloc@plt>
mov    %rax,-0x408(%rbp)
cmpq   $0x0,-0x408(%rbp)
jne    1254 <dopkgstanzas+0x54>
mov    $0x0,%al
call   1100 <oom_die@plt>
mov    -0x8(%rbp),%rdi
lea    0xda1(%rip),%rsi
call   10e0 <fopen@plt>
mov    %rax,-0x808(%rbp)
cmpq   $0x0,-0x808(%rbp)
jne    1298 <dopkgstanzas+0x98>
mov    -0x8(%rbp),%rdi
call   10f0 <perror@plt>
mov    -0x408(%rbp),%rdi
call   1030 <free@plt>
mov    $0x1,%edi
call   1110 <exit@plt>
jmp    129d <dopkgstanzas+0x9d>
lea    -0x400(%rbp),%rdi
mov    -0x808(%rbp),%rdx
mov    $0x3e8,%esi
call   1090 <fgets@plt>
cmp    $0x0,%rax
je     152d <dopkgstanzas+0x32d>
cmpb   $0x0,-0x400(%rbp)
je     1380 <dopkgstanzas+0x180>
lea    -0x400(%rbp),%rdi
call   1060 <strlen@plt>
cltq
mov    %rax,-0x810(%rbp)
mov    -0x410(%rbp),%rax
add    -0x810(%rbp),%rax
add    $0x1,%rax
cmp    -0x418(%rbp),%rax
jbe    1351 <dopkgstanzas+0x151>
mov    -0x410(%rbp),%rax
add    -0x810(%rbp),%rax
add    $0x1,%rax
shl    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x408(%rbp),%rdi
mov    -0x418(%rbp),%rsi
call   10d0 <realloc@plt>
mov    %rax,-0x408(%rbp)
cmpq   $0x0,-0x408(%rbp)
jne    134c <dopkgstanzas+0x14c>
mov    $0x0,%al
call   1100 <oom_die@plt>
jmp    1351 <dopkgstanzas+0x151>
mov    -0x408(%rbp),%rdi
add    -0x410(%rbp),%rdi
lea    -0x400(%rbp),%rsi
call   1040 <strcpy@plt>
mov    -0x810(%rbp),%rax
add    -0x410(%rbp),%rax
mov    %rax,-0x410(%rbp)
movsbl -0x400(%rbp),%eax
cmp    $0x0,%eax
je     13cb <dopkgstanzas+0x1cb>
lea    -0x400(%rbp),%rdi
call   1060 <strlen@plt>
sub    $0x1,%eax
cltq
movsbl -0x400(%rbp,%rax,1),%eax
ff
cmp    $0xa,%eax
jne    13cb <dopkgstanzas+0x1cb>
lea    -0x400(%rbp),%rdi
call   1060 <strlen@plt>
sub    $0x1,%eax
cltq
movb   $0x0,-0x400(%rbp,%rax,1)
lea    -0x400(%rbp),%rdi
lea    0xc29(%rip),%rsi
mov    $0x8,%edx
call   10c0 <strncasecmp@plt>
cmp    $0x0,%rax
jne    1405 <dopkgstanzas+0x205>
lea    -0x800(%rbp),%rdi
lea    -0x400(%rbp),%rsi
call   1120 <fieldcpy@plt>
jmp    1528 <dopkgstanzas+0x328>
cmpb   $0x0,-0x400(%rbp)
jne    1523 <dopkgstanzas+0x323>
movl   $0x0,-0x814(%rbp)
mov    -0x814(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    150e <dopkgstanzas+0x30e>
mov    -0x10(%rbp),%rax
movslq -0x814(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    1446 <dopkgstanzas+0x246>
jmp    14fa <dopkgstanzas+0x2fa>
lea    -0x800(%rbp),%rdi
mov    -0x10(%rbp),%rax
movslq -0x814(%rbp),%rcx
mov    (%rax,%rcx,8),%rsi
call   10a0 <strcmp@plt>
cmp    $0x0,%rax
jne    14f5 <dopkgstanzas+0x2f5>
mov    -0x408(%rbp),%rdi
mov    0x2b67(%rip),%rax
mov    (%rax),%esi
call   1070 <fputs@plt>
mov    -0x408(%rbp),%rax
mov    -0x410(%rbp),%rcx
sub    $0x1,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     14b9 <dopkgstanzas+0x2b9>
mov    0x2b3a(%rip),%rax
mov    (%rax),%esi
lea    0xb5c(%rip),%rdi
call   1070 <fputs@plt>
jmp    14f0 <dopkgstanzas+0x2f0>
mov    -0x408(%rbp),%rax
mov    -0x410(%rbp),%rcx
sub    $0x2,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     14eb <dopkgstanzas+0x2eb>
mov    0x2b01(%rip),%rax
mov    (%rax),%esi
mov    $0xa,%edi
call   1080 <fputc@plt>
jmp    14f0 <dopkgstanzas+0x2f0>
jmp    150e <dopkgstanzas+0x30e>
jmp    14fa <dopkgstanzas+0x2fa>
mov    -0x814(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x814(%rbp)
jmp    141c <dopkgstanzas+0x21c>
mov    -0x408(%rbp),%rax
movb   $0x0,(%rax)
movq   $0x0,-0x410(%rbp)
jmp    1528 <dopkgstanzas+0x328>
jmp    129d <dopkgstanzas+0x9d>
mov    -0x808(%rbp),%rdi
call   1050 <fclose@plt>
mov    -0x408(%rbp),%rdi
call   1030 <free@plt>
add    $0x820,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dopkgstanzas>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x808,%rsp
mov    %edx,0xc(%rsp)
mov    %rsi,%r13
mov    %rdi,%rbp
mov    $0x7d0,%edi
call   10b0 <malloc@plt>
mov    %rax,%r14
test   %rax,%rax
jne    1234 <dopkgstanzas+0x34>
xor    %eax,%eax
call   1100 <oom_die@plt>
lea    0xdc5(%rip),%rsi
mov    %rbp,%rdi
call   10e0 <fopen@plt>
test   %rax,%rax
je     145b <dopkgstanzas+0x25b>
mov    %rax,%rbx
lea    0x30(%rsp),%rdi
mov    $0x3e8,%esi
mov    %rax,%rdx
call   1090 <fgets@plt>
test   %rax,%rax
je     1439 <dopkgstanzas+0x239>
mov    0xc(%rsp),%eax
mov    %rax,0x28(%rsp)
mov    $0x7d0,%eax
mov    %rax,0x10(%rsp)
xor    %r15d,%r15d
mov    %r13,0x18(%rsp)
mov    %rbx,0x20(%rsp)
jmp    12bc <dopkgstanzas+0xbc>
nopl   0x0(%rax)
lea    0x420(%rsp),%rdi
mov    %rbp,%rsi
call   1120 <fieldcpy@plt>
mov    %rbp,%rdi
mov    $0x3e8,%esi
mov    %rbx,%rdx
call   1090 <fgets@plt>
mov    %r12,%r15
test   %rax,%rax
je     1439 <dopkgstanzas+0x239>
cmpb   $0x0,0x30(%rsp)
je     1300 <dopkgstanzas+0x100>
lea    0x30(%rsp),%rdi
call   1060 <strlen@plt>
movslq %eax,%r12
lea    (%r15,%r12,1),%r13
add    $0x1,%r13
mov    0x10(%rsp),%rax
cmp    %rax,%r13
jbe    1310 <dopkgstanzas+0x110>
add    %r13,%r13
mov    %r14,%rdi
mov    %r13,%rsi
call   10d0 <realloc@plt>
test   %rax,%rax
je     1315 <dopkgstanzas+0x115>
mov    %rax,%r14
jmp    1320 <dopkgstanzas+0x120>
nopw   0x0(%rax,%rax,1)
mov    %r15,%r12
lea    0x30(%rsp),%rbp
jmp    1367 <dopkgstanzas+0x167>
nopw   0x0(%rax,%rax,1)
mov    %rax,%r13
jmp    1320 <dopkgstanzas+0x120>
xor    %eax,%eax
call   1100 <oom_die@plt>
xor    %r14d,%r14d
nop
add    %r15,%r12
add    %r14,%r15
mov    %r15,%rdi
lea    0x30(%rsp),%rbp
mov    %rbp,%rsi
call   1040 <strcpy@plt>
cmpb   $0x0,0x30(%rsp)
je     135d <dopkgstanzas+0x15d>
mov    %rbp,%rdi
call   1060 <strlen@plt>
cltq
cmpb   $0xa,-0x1(%rax,%rbp,1)
jne    135d <dopkgstanzas+0x15d>
mov    %rbp,%rdi
call   1060 <strlen@plt>
cltq
movb   $0x0,-0x1(%rax,%rbp,1)
mov    %r13,0x10(%rsp)
mov    0x18(%rsp),%r13
mov    %rbp,%rdi
lea    0xc91(%rip),%rsi
mov    $0x8,%edx
call   10c0 <strncasecmp@plt>
test   %rax,%rax
je     1290 <dopkgstanzas+0x90>
cmpb   $0x0,0x30(%rsp)
jne    12a0 <dopkgstanzas+0xa0>
mov    %r14,%r15
cmpl   $0x0,0xc(%rsp)
mov    0x28(%rsp),%rbx
lea    0x420(%rsp),%r14
jle    1420 <dopkgstanzas+0x220>
xor    %ebp,%ebp
jmp    13b9 <dopkgstanzas+0x1b9>
xchg   %ax,%ax
add    $0x1,%rbp
cmp    %rbp,%rbx
je     1420 <dopkgstanzas+0x220>
mov    0x0(%r13,%rbp,8),%rsi
test   %rsi,%rsi
je     13b0 <dopkgstanzas+0x1b0>
mov    %r14,%rdi
call   10a0 <strcmp@plt>
test   %rax,%rax
jne    13b0 <dopkgstanzas+0x1b0>
mov    0x2c09(%rip),%rbx
mov    (%rbx),%esi
mov    %r15,%rbp
mov    %r15,%rdi
call   1070 <fputs@plt>
cmpb   $0xa,-0x1(%r12,%r15,1)
jne    1409 <dopkgstanzas+0x209>
cmpb   $0xa,-0x2(%r12,%rbp,1)
je     1420 <dopkgstanzas+0x220>
mov    0x2be5(%rip),%rax
mov    (%rax),%esi
mov    $0xa,%edi
call   1080 <fputc@plt>
jmp    1420 <dopkgstanzas+0x220>
mov    (%rbx),%esi
lea    0xbf9(%rip),%rdi
call   1070 <fputs@plt>
nopw   0x0(%rax,%rax,1)
mov    %r15,%r14
movb   $0x0,(%r15)
xor    %r12d,%r12d
lea    0x30(%rsp),%rbp
mov    0x20(%rsp),%rbx
jmp    12a0 <dopkgstanzas+0xa0>
mov    %rbx,%rdi
call   1050 <fclose@plt>
mov    %r14,%rdi
call   1030 <free@plt>
add    $0x808,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rbp,%rdi
call   10f0 <perror@plt>
mov    %r14,%rdi
call   1030 <free@plt>
mov    $0x1,%edi
call   1110 <exit@plt>

LLVM IR (-O0):
@.str = [2 x i8] c"r\00"
@.str.1 = [9 x i8] c"Package:\00"
@stdout = global i32 0
@.str.2 = [3 x i8] c"\0A\0A\00"
define void @dopkgstanzas(i8* %0, i8** %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i8**
%6 = alloca i32
%7 = alloca [1000 x i8]
%8 = alloca i8*
%9 = alloca i64
%10 = alloca i64
%11 = alloca [1000 x i8]
%12 = alloca i32*
%13 = alloca i64
%14 = alloca i32
store i8* %0, i8** %4
store i8** %1, i8*** %5
store i32 %2, i32* %6
store i64 0, i64* %9
store i64 2000, i64* %10
%15 = load i64, i64* %10
%16 = call i8* @malloc(i64 %15)
store i8* %16, i8** %8
%17 = load i8*, i8** %8
%18 = icmp ne i8* %17, null
br i1 %18, label %21, label %19
19: ; preds = %3
%20 = call i32 (...) @oom_die()
br label %21
21: ; preds = %19, %3
%22 = load i8*, i8** %4
%23 = call i32* @fopen(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
store i32* %23, i32** %12
%24 = load i32*, i32** %12
%25 = icmp eq i32* %24, null
br i1 %25, label %26, label %32
26: ; preds = %21
%27 = load i8*, i8** %4
%28 = call i32 @perror(i8* %27)
%29 = load i8*, i8** %8
%30 = call i32 @free(i8* %29)
%31 = call i32 @exit(i32 1)
unreachable
32: ; preds = %21
br label %33
33: ; preds = %163, %32
%34 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%35 = load i32*, i32** %12
%36 = call i64 @fgets(i8* %34, i32 1000, i32* %35)
%37 = icmp ne i64 %36, 0
br i1 %37, label %38, label %164
38: ; preds = %33
%39 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%40 = load i8, i8* %39
%41 = icmp ne i8 %40, 0
br i1 %41, label %42, label %75
42: ; preds = %38
%43 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%44 = call i32 @strlen(i8* %43)
%45 = sext i32 %44 to i64
store i64 %45, i64* %13
%46 = load i64, i64* %9
%47 = load i64, i64* %13
%48 = add i64 %46, %47
%49 = add i64 %48, 1
%50 = load i64, i64* %10
%51 = icmp ugt i64 %49, %50
br i1 %51, label %52, label %66
52: ; preds = %42
%53 = load i64, i64* %9
%54 = load i64, i64* %13
%55 = add i64 %53, %54
%56 = add i64 %55, 1
%57 = mul i64 %56, 2
store i64 %57, i64* %10
%58 = load i8*, i8** %8
%59 = load i64, i64* %10
%60 = call i8* @realloc(i8* %58, i64 %59)
store i8* %60, i8** %8
%61 = load i8*, i8** %8
%62 = icmp ne i8* %61, null
br i1 %62, label %65, label %63
63: ; preds = %52
%64 = call i32 (...) @oom_die()
br label %65
65: ; preds = %63, %52
br label %66
66: ; preds = %65, %42
%67 = load i8*, i8** %8
%68 = load i64, i64* %9
%69 = getelementptr inbounds i8, i8* %67, i64 %68
%70 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%71 = call i32 @strcpy(i8* %69, i8* %70)
%72 = load i64, i64* %13
%73 = load i64, i64* %9
%74 = add i64 %73, %72
store i64 %74, i64* %9
br label %75
75: ; preds = %66, %38
%76 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp ne i32 %78, 0
br i1 %79, label %80, label %95
80: ; preds = %75
%81 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%82 = call i32 @strlen(i8* %81)
%83 = sub nsw i32 %82, 1
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 %84
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 10
br i1 %88, label %89, label %95
89: ; preds = %80
%90 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%91 = call i32 @strlen(i8* %90)
%92 = sub nsw i32 %91, 1
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 %93
store i8 0, i8* %94
br label %95
95: ; preds = %89, %80, %75
%96 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%97 = call i64 @strncasecmp(i8* %96, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0), i32 8)
%98 = icmp eq i64 %97, 0
br i1 %98, label %99, label %103
99: ; preds = %95
%100 = getelementptr inbounds [1000 x i8], [1000 x i8]* %11, i64 0, i64 0
%101 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%102 = call i32 @fieldcpy(i8* %100, i8* %101)
br label %163
103: ; preds = %95
%104 = getelementptr inbounds [1000 x i8], [1000 x i8]* %7, i64 0, i64 0
%105 = load i8, i8* %104
%106 = icmp ne i8 %105, 0
br i1 %106, label %162, label %107
107: ; preds = %103
store i32 0, i32* %14
br label %108
108: ; preds = %157, %107
%109 = load i32, i32* %14
%110 = load i32, i32* %6
%111 = icmp slt i32 %109, %110
br i1 %111, label %112, label %160
112: ; preds = %108
%113 = load i8**, i8*** %5
%114 = load i32, i32* %14
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i8*, i8** %113, i64 %115
%117 = load i8*, i8** %116
%118 = icmp ne i8* %117, null
br i1 %118, label %120, label %119
119: ; preds = %112
br label %157
120: ; preds = %112
%121 = getelementptr inbounds [1000 x i8], [1000 x i8]* %11, i64 0, i64 0
%122 = load i8**, i8*** %5
%123 = load i32, i32* %14
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i8*, i8** %122, i64 %124
%126 = load i8*, i8** %125
%127 = call i64 @strcmp(i8* %121, i8* %126)
%128 = icmp eq i64 %127, 0
br i1 %128, label %129, label %156
129: ; preds = %120
%130 = load i8*, i8** %8
%131 = load i32, i32* @stdout
%132 = call i32 @fputs(i8* %130, i32 %131)
%133 = load i8*, i8** %8
%134 = load i64, i64* %9
%135 = sub i64 %134, 1
%136 = getelementptr inbounds i8, i8* %133, i64 %135
%137 = load i8, i8* %136
%138 = sext i8 %137 to i32
%139 = icmp ne i32 %138, 10
br i1 %139, label %140, label %143
140: ; preds = %129
%141 = load i32, i32* @stdout
%142 = call i32 @fputs(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 %141)
br label %155
143: ; preds = %129
%144 = load i8*, i8** %8
%145 = load i64, i64* %9
%146 = sub i64 %145, 2
%147 = getelementptr inbounds i8, i8* %144, i64 %146
%148 = load i8, i8* %147
%149 = sext i8 %148 to i32
%150 = icmp ne i32 %149, 10
br i1 %150, label %151, label %154
151: ; preds = %143
%152 = load i32, i32* @stdout
%153 = call i32 @fputc(i8 signext 10, i32 %152)
br label %154
154: ; preds = %151, %143
br label %155
155: ; preds = %154, %140
br label %160
156: ; preds = %120
br label %157
157: ; preds = %156, %119
%158 = load i32, i32* %14
%159 = add nsw i32 %158, 1
store i32 %159, i32* %14
br label %108
160: ; preds = %155, %108
%161 = load i8*, i8** %8
store i8 0, i8* %161
store i64 0, i64* %9
br label %162
162: ; preds = %160, %103
br label %163
163: ; preds = %162, %99
br label %33
164: ; preds = %33
%165 = load i32*, i32** %12
%166 = call i32 @fclose(i32* %165)
%167 = load i8*, i8** %8
%168 = call i32 @free(i8* %167)
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c"r\00"
@.str.1 = [9 x i8] c"Package:\00"
@stdout = global i32 0
@.str.2 = [3 x i8] c"\0A\0A\00"
define void @dopkgstanzas(i8* nocapture %0, i8** nocapture %1, i32 %2) {
%4 = alloca [1000 x i8]
%5 = alloca [1000 x i8]
%6 = getelementptr inbounds [1000 x i8], [1000 x i8]* %4, i64 0, i64 0
%7 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 0
%8 = tail call dereferenceable_or_null(2000) i8* @malloc(i64 2000)
%9 = icmp eq i8* %8, null
br i1 %9, label %10, label %12
10: ; preds = %3
%11 = tail call i32 (...) @oom_die()
br label %12
12: ; preds = %10, %3
%13 = tail call i32* @fopen(i8* %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%14 = icmp eq i32* %13, null
br i1 %14, label %21, label %15
15: ; preds = %12
%16 = call i64 @fgets(i8* %6, i32 1000, i32* %13)
%17 = icmp eq i64 %16, 0
br i1 %17, label %108, label %18
18: ; preds = %15
%19 = icmp sgt i32 %2, 0
%20 = zext i32 %2 to i64
br label %25
21: ; preds = %12
%22 = tail call i32 @perror(i8* %0)
%23 = tail call i32 @free(i8* %8)
%24 = tail call i32 @exit(i32 1)
unreachable
25: ; preds = %18, %104
%26 = phi i8* [ %8, %18 ], [ %63, %104 ]
%27 = phi i64 [ 0, %18 ], [ %105, %104 ]
%28 = phi i64 [ 2000, %18 ], [ %65, %104 ]
%29 = load i8, i8* %6
%30 = icmp eq i8 %29, 0
br i1 %30, label %62, label %31
31: ; preds = %25
%32 = call i32 @strlen(i8* %6)
%33 = sext i32 %32 to i64
%34 = add i64 %27, %33
%35 = add i64 %34, 1
%36 = icmp ugt i64 %35, %28
br i1 %36, label %37, label %43
37: ; preds = %31
%38 = shl i64 %35, 1
%39 = call i8* @realloc(i8* %26, i64 %38)
%40 = icmp eq i8* %39, null
br i1 %40, label %41, label %43
41: ; preds = %37
%42 = call i32 (...) @oom_die()
br label %43
43: ; preds = %31, %41, %37
%44 = phi i64 [ %38, %37 ], [ %38, %41 ], [ %28, %31 ]
%45 = phi i8* [ %39, %37 ], [ null, %41 ], [ %26, %31 ]
%46 = getelementptr inbounds i8, i8* %45, i64 %27
%47 = call i32 @strcpy(i8* %46, i8* %6)
%48 = load i8, i8* %6
%49 = icmp eq i8 %48, 0
br i1 %49, label %62, label %50
50: ; preds = %43
%51 = call i32 @strlen(i8* %6)
%52 = add nsw i32 %51, -1
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [1000 x i8], [1000 x i8]* %4, i64 0, i64 %53
%55 = load i8, i8* %54
%56 = icmp eq i8 %55, 10
br i1 %56, label %57, label %62
57: ; preds = %50
%58 = call i32 @strlen(i8* %6)
%59 = add nsw i32 %58, -1
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds [1000 x i8], [1000 x i8]* %4, i64 0, i64 %60
store i8 0, i8* %61
br label %62
62: ; preds = %25, %57, %50, %43
%63 = phi i8* [ %45, %57 ], [ %45, %50 ], [ %45, %43 ], [ %26, %25 ]
%64 = phi i64 [ %34, %57 ], [ %34, %50 ], [ %34, %43 ], [ %27, %25 ]
%65 = phi i64 [ %44, %57 ], [ %44, %50 ], [ %44, %43 ], [ %28, %25 ]
%66 = call i64 @strncasecmp(i8* %6, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0), i32 8)
%67 = icmp eq i64 %66, 0
br i1 %67, label %68, label %70
68: ; preds = %62
%69 = call i32 @fieldcpy(i8* %7, i8* %6)
br label %104
70: ; preds = %62
%71 = load i8, i8* %6
%72 = icmp eq i8 %71, 0
br i1 %72, label %73, label %104
73: ; preds = %70
br i1 %19, label %74, label %103
74: ; preds = %73, %100
%75 = phi i64 [ %101, %100 ], [ 0, %73 ]
%76 = getelementptr inbounds i8*, i8** %1, i64 %75
%77 = load i8*, i8** %76
%78 = icmp eq i8* %77, null
br i1 %78, label %100, label %79
79: ; preds = %74
%80 = call i64 @strcmp(i8* %7, i8* %77)
%81 = icmp eq i64 %80, 0
br i1 %81, label %82, label %100
82: ; preds = %79
%83 = load i32, i32* @stdout
%84 = call i32 @fputs(i8* %63, i32 %83)
%85 = add i64 %64, -1
%86 = getelementptr inbounds i8, i8* %63, i64 %85
%87 = load i8, i8* %86
%88 = icmp eq i8 %87, 10
br i1 %88, label %92, label %89
89: ; preds = %82
%90 = load i32, i32* @stdout
%91 = call i32 @fputs(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 %90)
br label %103
92: ; preds = %82
%93 = add i64 %64, -2
%94 = getelementptr inbounds i8, i8* %63, i64 %93
%95 = load i8, i8* %94
%96 = icmp eq i8 %95, 10
br i1 %96, label %103, label %97
97: ; preds = %92
%98 = load i32, i32* @stdout
%99 = call i32 @fputc(i8 signext 10, i32 %98)
br label %103
100: ; preds = %79, %74
%101 = add nuw nsw i64 %75, 1
%102 = icmp eq i64 %101, %20
br i1 %102, label %103, label %74
103: ; preds = %100, %73, %89, %97, %92
store i8 0, i8* %63
br label %104
104: ; preds = %70, %103, %68
%105 = phi i64 [ %64, %68 ], [ %64, %70 ], [ 0, %103 ]
%106 = call i64 @fgets(i8* %6, i32 1000, i32* %13)
%107 = icmp eq i64 %106, 0
br i1 %107, label %108, label %25
108: ; preds = %104, %15
%109 = phi i8* [ %8, %15 ], [ %63, %104 ]
%110 = call i32 @fclose(i32* %13)
%111 = call i32 @free(i8* %109)
ret void
}