#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*/ FILE;

/* Variables and functions */
long EOF;
int /*<<< orphan*/ exit(int);
char *fgets(char *, int, int /*<<< orphan*/ *);
long getc(int /*<<< orphan*/ *);
scalar_t__ isalpha(char);
scalar_t__ strncmp(char *, char *, int);
void *tolower(char);
int /*<<< orphan*/ ungetc(long, int /*<<< orphan*/ *);
int fgetseq(char *name, char *sequence, long int *seqlen, FILE *fpi) {
  char line[1000];
  char *ptr;
  long int i, j, c;
  char *ptrRet;
  line[0] = '\0';
  *sequence = '\0';
  *seqlen = 0;
  if (fgets(line, 1000, fpi) == NULL) {
    return 0;
  } else if (line[0] == ';') {
    if (line[1] != ' ') {
      for (i = 0, ptr = &(line[1]); *ptr != ' ' && *ptr != '\n'; i++)
        name[i] = *ptr++;
      name[i] = '\0';
      while ((c = getc(fpi)) == ';')
        ptrRet = fgets(line, 1000, fpi);
      ungetc(c, fpi);
      ptr = sequence;
      while ((c = getc(fpi)) != ';' && c != EOF)
        if (isalpha(c)) {
          *ptr = tolower(c);
          ptr++;
          (*seqlen)++;
        }
      if (c != EOF)
        ungetc(c, fpi);
      *ptr = '\0';
    } else if (line[1] == ' ') {
      while ((c = getc(fpi)) == ';')
        ptrRet = fgets(line, 1000, fpi);
      ungetc(c, fpi);
      fgets(line, 1000, fpi);
      for (i = 0, ptr = &(line[0]); *ptr != ' ' && *ptr != '\n'; i++)
        name[i] = *ptr++;
      name[i] = '\0';
      ptr = sequence;
      while ((c = getc(fpi)) != ';' && c != EOF)
        if (isalpha(c)) {
          *ptr = tolower(c);
          ptr++;
          (*seqlen)++;
        }
      if (c != EOF)
        ungetc(c, fpi);
      *ptr = '\0';
    }
  } else if (line[0] == '>') {
    for (i = 1; line[i] == ' '; i++)
      ;
    for (j = 0, ptr = &line[i]; *ptr != ' '; ptr++, j++)
      name[j] = *ptr;
    name[j] = '\0';
    ptr = sequence;
    while ((c = getc(fpi)) != '>' && c != EOF)
      if (isalpha(c)) {
        *ptr = tolower(c);
        *seqlen += 1;
        ptr++;
      }
    if (c != EOF)
      ungetc(c, fpi);
    *ptr = '\0';
  } else {
    while (strncmp(line, "LOCUS", 5) != 0)
      if (fgets(line, 1000, fpi) == NULL)
        exit(1);
    for (i = 0, ptr = &line[12]; *ptr != ' '; ptr++, i++)
      name[i] = *ptr;
    name[i] = '\0';
    while (strncmp(line, "ORIGIN", 6) != 0)
      if (fgets(line, 1000, fpi) == NULL)
        exit(1);
    ptr = sequence;
    *seqlen = 0;
    ptrRet = fgets(line, 1000, fpi);
    while (strncmp(line, "//", 2) != 0) {
      for (i = 0; line[i] != '\n'; i++)
        if (isalpha(line[i])) {
          *ptr++ = tolower(line[i]);
          (*seqlen)++;
        }
      ptrRet = fgets(line, 1000, fpi);
    }
    *ptr = '\0';
  }
  return (1);
}


x86 assembly (clang, -O0):
<fgetseq>:
push   %rbp
mov    %rsp,%rbp
sub    $0x440,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movb   $0x0,-0x410(%rbp)
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
cmp    $0x0,%rax
jne    11cf <fgetseq+0x5f>
movl   $0x0,-0x4(%rbp)
jmp    19e6 <fgetseq+0x876>
movsbl -0x410(%rbp),%eax
cmp    $0x3b,%eax
jne    15de <fgetseq+0x46e>
movsbl -0x40f(%rbp),%eax
cmp    $0x20,%eax
je     13d1 <fgetseq+0x261>
movq   $0x0,-0x420(%rbp)
lea    -0x410(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x418(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x439(%rbp)
je     123d <fgetseq+0xcd>
mov    -0x418(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
setne  %al
mov    %al,-0x439(%rbp)
mov    -0x439(%rbp),%al
test   $0x1,%al
jne    1250 <fgetseq+0xe0>
jmp    128c <fgetseq+0x11c>
mov    -0x418(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x418(%rbp)
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x420(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x420(%rbp)
jmp    120c <fgetseq+0x9c>
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rdi
call   1090 <getc@plt>
mov    %rax,-0x430(%rbp)
cmp    $0x3b,%rax
jne    12d6 <fgetseq+0x166>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
mov    %rax,-0x438(%rbp)
jmp    129b <fgetseq+0x12b>
mov    -0x430(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1060 <ungetc@plt>
mov    -0x18(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x28(%rbp),%rdi
call   1090 <getc@plt>
mov    %rax,%rcx
mov    %rcx,-0x430(%rbp)
xor    %eax,%eax
cmp    $0x3b,%rcx
mov    %al,-0x43a(%rbp)
je     1330 <fgetseq+0x1c0>
mov    -0x430(%rbp),%rax
mov    0x2cc4(%rip),%rcx
cmp    (%rcx),%rax
setne  %al
mov    %al,-0x43a(%rbp)
mov    -0x43a(%rbp),%al
test   $0x1,%al
jne    1343 <fgetseq+0x1d3>
jmp    139b <fgetseq+0x22b>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1070 <isalpha@plt>
cmp    $0x0,%rax
je     1396 <fgetseq+0x226>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1050 <tolower@plt>
mov    %al,%cl
mov    -0x418(%rbp),%rax
mov    %cl,(%rax)
mov    -0x418(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    12f1 <fgetseq+0x181>
mov    -0x430(%rbp),%rax
mov    0x2c3f(%rip),%rcx
cmp    (%rcx),%rax
je     13c2 <fgetseq+0x252>
mov    -0x430(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1060 <ungetc@plt>
mov    -0x418(%rbp),%rax
movb   $0x0,(%rax)
jmp    15d9 <fgetseq+0x469>
movsbl -0x40f(%rbp),%eax
cmp    $0x20,%eax
jne    15d4 <fgetseq+0x464>
jmp    13e6 <fgetseq+0x276>
mov    -0x28(%rbp),%rdi
call   1090 <getc@plt>
mov    %rax,-0x430(%rbp)
cmp    $0x3b,%rax
jne    1421 <fgetseq+0x2b1>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
mov    %rax,-0x438(%rbp)
jmp    13e6 <fgetseq+0x276>
mov    -0x430(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1060 <ungetc@plt>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
movq   $0x0,-0x420(%rbp)
lea    -0x410(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x418(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x43b(%rbp)
je     1490 <fgetseq+0x320>
mov    -0x418(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
setne  %al
mov    %al,-0x43b(%rbp)
mov    -0x43b(%rbp),%al
test   $0x1,%al
jne    14a3 <fgetseq+0x333>
jmp    14df <fgetseq+0x36f>
mov    -0x418(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x418(%rbp)
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x420(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x420(%rbp)
jmp    145f <fgetseq+0x2ef>
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x28(%rbp),%rdi
call   1090 <getc@plt>
mov    %rax,%rcx
mov    %rcx,-0x430(%rbp)
xor    %eax,%eax
cmp    $0x3b,%rcx
mov    %al,-0x43c(%rbp)
je     1538 <fgetseq+0x3c8>
mov    -0x430(%rbp),%rax
mov    0x2abc(%rip),%rcx
cmp    (%rcx),%rax
setne  %al
mov    %al,-0x43c(%rbp)
mov    -0x43c(%rbp),%al
test   $0x1,%al
jne    154b <fgetseq+0x3db>
jmp    15a3 <fgetseq+0x433>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1070 <isalpha@plt>
cmp    $0x0,%rax
je     159e <fgetseq+0x42e>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1050 <tolower@plt>
mov    %al,%cl
mov    -0x418(%rbp),%rax
mov    %cl,(%rax)
mov    -0x418(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    14f9 <fgetseq+0x389>
mov    -0x430(%rbp),%rax
mov    0x2a37(%rip),%rcx
cmp    (%rcx),%rax
je     15ca <fgetseq+0x45a>
mov    -0x430(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1060 <ungetc@plt>
mov    -0x418(%rbp),%rax
movb   $0x0,(%rax)
jmp    15d9 <fgetseq+0x469>
jmp    19da <fgetseq+0x86a>
movsbl -0x410(%rbp),%eax
cmp    $0x3e,%eax
jne    179a <fgetseq+0x62a>
movq   $0x1,-0x420(%rbp)
mov    -0x420(%rbp),%rax
movsbl -0x410(%rbp,%rax,1),%eax
ff
cmp    $0x20,%eax
jne    162d <fgetseq+0x4bd>
jmp    1616 <fgetseq+0x4a6>
mov    -0x420(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x420(%rbp)
jmp    15f9 <fgetseq+0x489>
movq   $0x0,-0x428(%rbp)
lea    -0x410(%rbp),%rax
add    -0x420(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x418(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
je     16a0 <fgetseq+0x530>
mov    -0x418(%rbp),%rax
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x428(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x418(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x428(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x428(%rbp)
jmp    164d <fgetseq+0x4dd>
mov    -0x10(%rbp),%rax
mov    -0x428(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x28(%rbp),%rdi
call   1090 <getc@plt>
mov    %rax,%rcx
mov    %rcx,-0x430(%rbp)
xor    %eax,%eax
cmp    $0x3e,%rcx
mov    %al,-0x43d(%rbp)
je     16f9 <fgetseq+0x589>
mov    -0x430(%rbp),%rax
mov    0x28fb(%rip),%rcx
cmp    (%rcx),%rax
setne  %al
mov    %al,-0x43d(%rbp)
mov    -0x43d(%rbp),%al
test   $0x1,%al
jne    170c <fgetseq+0x59c>
jmp    1764 <fgetseq+0x5f4>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1070 <isalpha@plt>
cmp    $0x0,%rax
je     175f <fgetseq+0x5ef>
mov    -0x430(%rbp),%rax
movsbl %al,%edi
call   1050 <tolower@plt>
mov    %al,%cl
mov    -0x418(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
mov    -0x418(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
jmp    16ba <fgetseq+0x54a>
mov    -0x430(%rbp),%rax
mov    0x2876(%rip),%rcx
cmp    (%rcx),%rax
je     178b <fgetseq+0x61b>
mov    -0x430(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1060 <ungetc@plt>
mov    -0x418(%rbp),%rax
movb   $0x0,(%rax)
jmp    19d5 <fgetseq+0x865>
jmp    179f <fgetseq+0x62f>
lea    -0x410(%rbp),%rdi
lea    0x853(%rip),%rsi
mov    $0x5,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
je     17ef <fgetseq+0x67f>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
cmp    $0x0,%rax
jne    17ea <fgetseq+0x67a>
mov    $0x1,%edi
call   1080 <exit@plt>
jmp    179f <fgetseq+0x62f>
movq   $0x0,-0x420(%rbp)
lea    -0x410(%rbp),%rax
add    $0xc,%rax
mov    %rax,-0x418(%rbp)
mov    -0x418(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
je     185f <fgetseq+0x6ef>
mov    -0x418(%rbp),%rax
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x418(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x418(%rbp)
mov    -0x420(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x420(%rbp)
jmp    180c <fgetseq+0x69c>
mov    -0x10(%rbp),%rax
mov    -0x420(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
lea    -0x410(%rbp),%rdi
lea    0x78a(%rip),%rsi
mov    $0x6,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
je     18be <fgetseq+0x74e>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
cmp    $0x0,%rax
jne    18b9 <fgetseq+0x749>
mov    $0x1,%edi
call   1080 <exit@plt>
jmp    186e <fgetseq+0x6fe>
mov    -0x18(%rbp),%rax
mov    %rax,-0x418(%rbp)
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
mov    %rax,-0x438(%rbp)
lea    -0x410(%rbp),%rdi
lea    0x70f(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
je     19cb <fgetseq+0x85b>
movq   $0x0,-0x420(%rbp)
mov    -0x420(%rbp),%rax
movsbl -0x410(%rbp,%rax,1),%eax
ff
cmp    $0xa,%eax
je     19aa <fgetseq+0x83a>
mov    -0x420(%rbp),%rax
movsbl -0x410(%rbp,%rax,1),%edi
ff
call   1070 <isalpha@plt>
cmp    $0x0,%rax
je     198e <fgetseq+0x81e>
mov    -0x420(%rbp),%rax
movsbl -0x410(%rbp,%rax,1),%edi
ff
call   1050 <tolower@plt>
mov    %al,%cl
mov    -0x418(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x418(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    1993 <fgetseq+0x823>
mov    -0x420(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x420(%rbp)
jmp    191d <fgetseq+0x7ad>
lea    -0x410(%rbp),%rdi
mov    -0x28(%rbp),%rdx
mov    $0x3e8,%esi
call   1040 <fgets@plt>
mov    %rax,-0x438(%rbp)
jmp    18f0 <fgetseq+0x780>
mov    -0x418(%rbp),%rax
movb   $0x0,(%rax)
jmp    19da <fgetseq+0x86a>
jmp    19df <fgetseq+0x86f>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x440,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fgetseq>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x3e8,%rsp
mov    %rcx,%r14
mov    %rdx,%r15
mov    %rsi,%r12
mov    %rdi,%rbx
movb   $0x0,(%rsp)
movb   $0x0,(%rsi)
movq   $0x0,(%rdx)
mov    %rsp,%rdi
mov    $0x3e8,%esi
mov    %rcx,%rdx
call   1040 <fgets@plt>
test   %rax,%rax
je     125b <fgetseq+0xeb>
mov    (%rsp),%al
cmp    $0x3b,%al
je     1262 <fgetseq+0xf2>
cmp    $0x3e,%al
jne    12df <fgetseq+0x16f>
lea    0x1(%rsp),%rax
nopl   0x0(%rax)
movzbl (%rax),%ecx
add    $0x1,%rax
cmp    $0x20,%cl
je     11d0 <fgetseq+0x60>
nopl   0x0(%rax)
mov    %cl,(%rbx)
movzbl (%rax),%ecx
add    $0x1,%rbx
add    $0x1,%rax
cmp    $0x20,%cl
jne    11e0 <fgetseq+0x70>
movb   $0x0,(%rbx)
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x2de1(%rip),%rbp
jmp    121b <fgetseq+0xab>
nopl   0x0(%rax)
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x0(%rbp),%rcx
cmp    %rcx,%rax
setne  %al
cmp    $0x3e,%rbx
je     1573 <fgetseq+0x403>
cmp    %rcx,%rbx
je     1573 <fgetseq+0x403>
movsbl %bl,%edi
call   1070 <isalpha@plt>
test   %rax,%rax
je     1210 <fgetseq+0xa0>
movsbl %bl,%edi
call   1050 <tolower@plt>
mov    %al,(%r12)
addq   $0x1,(%r15)
add    $0x1,%r12
jmp    1210 <fgetseq+0xa0>
xor    %eax,%eax
jmp    158c <fgetseq+0x41c>
mov    0x1(%rsp),%al
cmp    $0x20,%al
jne    1440 <fgetseq+0x2d0>
mov    %r14,%rdi
call   1090 <getc@plt>
cmp    $0x3b,%rax
jne    129e <fgetseq+0x12e>
mov    %rsp,%rbp
nop
mov    %rbp,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
mov    %r14,%rdi
call   1090 <getc@plt>
cmp    $0x3b,%rax
je     1280 <fgetseq+0x110>
mov    %rax,%rdi
mov    %r14,%rsi
call   1060 <ungetc@plt>
mov    %rsp,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movzbl (%rsp,%rax,1),%ecx
cmp    $0xa,%cl
je     150b <fgetseq+0x39b>
cmp    $0x20,%cl
je     150b <fgetseq+0x39b>
mov    %cl,(%rbx,%rax,1)
add    $0x1,%rax
jmp    12c0 <fgetseq+0x150>
lea    0xd1a(%rip),%r13
mov    %rsp,%rbp
nopl   0x0(%rax)
mov    %rbp,%rdi
mov    %r13,%rsi
mov    $0x5,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     131c <fgetseq+0x1ac>
mov    %rbp,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
test   %rax,%rax
jne    12f0 <fgetseq+0x180>
jmp    137a <fgetseq+0x20a>
mov    0xc(%rsp),%cl
xor    %eax,%eax
cmp    $0x20,%cl
je     1341 <fgetseq+0x1d1>
nopw   0x0(%rax,%rax,1)
mov    %cl,(%rbx,%rax,1)
movzbl 0xd(%rsp,%rax,1),%ecx
add    $0x1,%rax
cmp    $0x20,%cl
jne    1330 <fgetseq+0x1c0>
movb   $0x0,(%rbx,%rax,1)
lea    0xcba(%rip),%rbx
mov    %rsp,%rbp
nop
mov    %rbp,%rdi
mov    %rbx,%rsi
mov    $0x6,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1384 <fgetseq+0x214>
mov    %rbp,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
test   %rax,%rax
jne    1350 <fgetseq+0x1e0>
mov    $0x1,%edi
call   1080 <exit@plt>
movq   $0x0,(%r15)
mov    %rsp,%rbx
mov    %rbx,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
lea    0xc68(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1582 <fgetseq+0x412>
mov    %rsp,%rbx
lea    0xc48(%rip),%r13
jmp    13f9 <fgetseq+0x289>
nopw   0x0(%rax,%rax,1)
mov    %rbx,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
mov    %rbx,%rdi
mov    %r13,%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1582 <fgetseq+0x412>
mov    (%rsp),%al
cmp    $0xa,%al
je     13d0 <fgetseq+0x260>
lea    0x1(%rsp),%rbp
jmp    141c <fgetseq+0x2ac>
nopw   0x0(%rax,%rax,1)
movzbl 0x0(%rbp),%eax
add    $0x1,%rbp
cmp    $0xa,%al
je     13d0 <fgetseq+0x260>
movsbl %al,%edi
call   1070 <isalpha@plt>
test   %rax,%rax
je     1410 <fgetseq+0x2a0>
movsbl -0x1(%rbp),%edi
call   1050 <tolower@plt>
mov    %al,(%r12)
add    $0x1,%r12
addq   $0x1,(%r15)
jmp    1410 <fgetseq+0x2a0>
xor    %ecx,%ecx
cmp    $0xa,%al
je     1464 <fgetseq+0x2f4>
cs nopw 0x0(%rax,%rax,1)
cmp    $0x20,%al
je     1464 <fgetseq+0x2f4>
mov    %al,(%rbx,%rcx,1)
movzbl 0x2(%rsp,%rcx,1),%eax
add    $0x1,%rcx
cmp    $0xa,%al
jne    1450 <fgetseq+0x2e0>
movb   $0x0,(%rbx,%rcx,1)
mov    %r14,%rdi
call   1090 <getc@plt>
cmp    $0x3b,%rax
jne    149e <fgetseq+0x32e>
mov    %rsp,%rbx
nopl   0x0(%rax)
mov    %rbx,%rdi
mov    $0x3e8,%esi
mov    %r14,%rdx
call   1040 <fgets@plt>
mov    %r14,%rdi
call   1090 <getc@plt>
cmp    $0x3b,%rax
je     1480 <fgetseq+0x310>
mov    %rax,%rdi
mov    %r14,%rsi
call   1060 <ungetc@plt>
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x2b2d(%rip),%rbp
jmp    14cb <fgetseq+0x35b>
nopl   (%rax)
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x0(%rbp),%rcx
cmp    %rcx,%rax
setne  %al
cmp    $0x3b,%rbx
je     1573 <fgetseq+0x403>
cmp    %rcx,%rbx
je     1573 <fgetseq+0x403>
movsbl %bl,%edi
call   1070 <isalpha@plt>
test   %rax,%rax
je     14c0 <fgetseq+0x350>
movsbl %bl,%edi
call   1050 <tolower@plt>
mov    %al,(%r12)
add    $0x1,%r12
addq   $0x1,(%r15)
jmp    14c0 <fgetseq+0x350>
movb   $0x0,(%rbx,%rax,1)
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x2ac7(%rip),%rbp
jmp    153b <fgetseq+0x3cb>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r14,%rdi
call   1090 <getc@plt>
mov    %rax,%rbx
mov    0x0(%rbp),%rcx
cmp    %rcx,%rax
setne  %al
cmp    $0x3b,%rbx
je     1573 <fgetseq+0x403>
cmp    %rcx,%rbx
je     1573 <fgetseq+0x403>
movsbl %bl,%edi
call   1070 <isalpha@plt>
test   %rax,%rax
je     1530 <fgetseq+0x3c0>
movsbl %bl,%edi
call   1050 <tolower@plt>
mov    %al,(%r12)
add    $0x1,%r12
addq   $0x1,(%r15)
jmp    1530 <fgetseq+0x3c0>
test   %al,%al
je     1582 <fgetseq+0x412>
mov    %rbx,%rdi
mov    %r14,%rsi
call   1060 <ungetc@plt>
movb   $0x0,(%r12)
mov    $0x1,%eax
add    $0x3e8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@EOF = global i64 0
@.str = [6 x i8] c"LOCUS\00"
@.str.1 = [7 x i8] c"ORIGIN\00"
@.str.2 = [3 x i8] c"//\00"
define i32 @fgetseq(i8* %0, i8* %1, i64* %2, i32* %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i64*
%9 = alloca i32*
%10 = alloca [1000 x i8]
%11 = alloca i8*
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
%15 = alloca i8*
store i8* %0, i8** %6
store i8* %1, i8** %7
store i64* %2, i64** %8
store i32* %3, i32** %9
%16 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
store i8 0, i8* %16
%17 = load i8*, i8** %7
store i8 0, i8* %17
%18 = load i64*, i64** %8
store i64 0, i64* %18
%19 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%20 = load i32*, i32** %9
%21 = call i8* @fgets(i8* %19, i32 1000, i32* %20)
%22 = icmp eq i8* %21, null
br i1 %22, label %23, label %24
23: ; preds = %4
store i32 0, i32* %5
br label %371
24: ; preds = %4
%25 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = icmp eq i32 %27, 59
br i1 %28, label %29, label %200
29: ; preds = %24
%30 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 1
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp ne i32 %32, 32
br i1 %33, label %34, label %112
34: ; preds = %29
store i64 0, i64* %12
%35 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 1
store i8* %35, i8** %11
br label %36
36: ; preds = %55, %34
%37 = load i8*, i8** %11
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp ne i32 %39, 32
br i1 %40, label %41, label %46
41: ; preds = %36
%42 = load i8*, i8** %11
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp ne i32 %44, 10
br label %46
46: ; preds = %41, %36
%47 = phi i1 [ false, %36 ], [ %45, %41 ]
br i1 %47, label %48, label %58
48: ; preds = %46
%49 = load i8*, i8** %11
%50 = getelementptr inbounds i8, i8* %49, i32 1
store i8* %50, i8** %11
%51 = load i8, i8* %49
%52 = load i8*, i8** %6
%53 = load i64, i64* %12
%54 = getelementptr inbounds i8, i8* %52, i64 %53
store i8 %51, i8* %54
br label %55
55: ; preds = %48
%56 = load i64, i64* %12
%57 = add nsw i64 %56, 1
store i64 %57, i64* %12
br label %36
58: ; preds = %46
%59 = load i8*, i8** %6
%60 = load i64, i64* %12
%61 = getelementptr inbounds i8, i8* %59, i64 %60
store i8 0, i8* %61
br label %62
62: ; preds = %66, %58
%63 = load i32*, i32** %9
%64 = call i64 @getc(i32* %63)
store i64 %64, i64* %14
%65 = icmp eq i64 %64, 59
br i1 %65, label %66, label %70
66: ; preds = %62
%67 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%68 = load i32*, i32** %9
%69 = call i8* @fgets(i8* %67, i32 1000, i32* %68)
store i8* %69, i8** %15
br label %62
70: ; preds = %62
%71 = load i64, i64* %14
%72 = load i32*, i32** %9
%73 = call i32 @ungetc(i64 %71, i32* %72)
%74 = load i8*, i8** %7
store i8* %74, i8** %11
br label %75
75: ; preds = %101, %70
%76 = load i32*, i32** %9
%77 = call i64 @getc(i32* %76)
store i64 %77, i64* %14
%78 = icmp ne i64 %77, 59
br i1 %78, label %79, label %83
79: ; preds = %75
%80 = load i64, i64* %14
%81 = load i64, i64* @EOF
%82 = icmp ne i64 %80, %81
br label %83
83: ; preds = %79, %75
%84 = phi i1 [ false, %75 ], [ %82, %79 ]
br i1 %84, label %85, label %102
85: ; preds = %83
%86 = load i64, i64* %14
%87 = trunc i64 %86 to i8
%88 = call i64 @isalpha(i8 signext %87)
%89 = icmp ne i64 %88, 0
br i1 %89, label %90, label %101
90: ; preds = %85
%91 = load i64, i64* %14
%92 = trunc i64 %91 to i8
%93 = call i8* @tolower(i8 signext %92)
%94 = ptrtoint i8* %93 to i8
%95 = load i8*, i8** %11
store i8 %94, i8* %95
%96 = load i8*, i8** %11
%97 = getelementptr inbounds i8, i8* %96, i32 1
store i8* %97, i8** %11
%98 = load i64*, i64** %8
%99 = load i64, i64* %98
%100 = add nsw i64 %99, 1
store i64 %100, i64* %98
br label %101
101: ; preds = %90, %85
br label %75
102: ; preds = %83
%103 = load i64, i64* %14
%104 = load i64, i64* @EOF
%105 = icmp ne i64 %103, %104
br i1 %105, label %106, label %110
106: ; preds = %102
%107 = load i64, i64* %14
%108 = load i32*, i32** %9
%109 = call i32 @ungetc(i64 %107, i32* %108)
br label %110
110: ; preds = %106, %102
%111 = load i8*, i8** %11
store i8 0, i8* %111
br label %199
112: ; preds = %29
%113 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 1
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = icmp eq i32 %115, 32
br i1 %116, label %117, label %198
117: ; preds = %112
br label %118
118: ; preds = %122, %117
%119 = load i32*, i32** %9
%120 = call i64 @getc(i32* %119)
store i64 %120, i64* %14
%121 = icmp eq i64 %120, 59
br i1 %121, label %122, label %126
122: ; preds = %118
%123 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%124 = load i32*, i32** %9
%125 = call i8* @fgets(i8* %123, i32 1000, i32* %124)
store i8* %125, i8** %15
br label %118
126: ; preds = %118
%127 = load i64, i64* %14
%128 = load i32*, i32** %9
%129 = call i32 @ungetc(i64 %127, i32* %128)
%130 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%131 = load i32*, i32** %9
%132 = call i8* @fgets(i8* %130, i32 1000, i32* %131)
store i64 0, i64* %12
%133 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
store i8* %133, i8** %11
br label %134
134: ; preds = %153, %126
%135 = load i8*, i8** %11
%136 = load i8, i8* %135
%137 = sext i8 %136 to i32
%138 = icmp ne i32 %137, 32
br i1 %138, label %139, label %144
139: ; preds = %134
%140 = load i8*, i8** %11
%141 = load i8, i8* %140
%142 = sext i8 %141 to i32
%143 = icmp ne i32 %142, 10
br label %144
144: ; preds = %139, %134
%145 = phi i1 [ false, %134 ], [ %143, %139 ]
br i1 %145, label %146, label %156
146: ; preds = %144
%147 = load i8*, i8** %11
%148 = getelementptr inbounds i8, i8* %147, i32 1
store i8* %148, i8** %11
%149 = load i8, i8* %147
%150 = load i8*, i8** %6
%151 = load i64, i64* %12
%152 = getelementptr inbounds i8, i8* %150, i64 %151
store i8 %149, i8* %152
br label %153
153: ; preds = %146
%154 = load i64, i64* %12
%155 = add nsw i64 %154, 1
store i64 %155, i64* %12
br label %134
156: ; preds = %144
%157 = load i8*, i8** %6
%158 = load i64, i64* %12
%159 = getelementptr inbounds i8, i8* %157, i64 %158
store i8 0, i8* %159
%160 = load i8*, i8** %7
store i8* %160, i8** %11
br label %161
161: ; preds = %187, %156
%162 = load i32*, i32** %9
%163 = call i64 @getc(i32* %162)
store i64 %163, i64* %14
%164 = icmp ne i64 %163, 59
br i1 %164, label %165, label %169
165: ; preds = %161
%166 = load i64, i64* %14
%167 = load i64, i64* @EOF
%168 = icmp ne i64 %166, %167
br label %169
169: ; preds = %165, %161
%170 = phi i1 [ false, %161 ], [ %168, %165 ]
br i1 %170, label %171, label %188
171: ; preds = %169
%172 = load i64, i64* %14
%173 = trunc i64 %172 to i8
%174 = call i64 @isalpha(i8 signext %173)
%175 = icmp ne i64 %174, 0
br i1 %175, label %176, label %187
176: ; preds = %171
%177 = load i64, i64* %14
%178 = trunc i64 %177 to i8
%179 = call i8* @tolower(i8 signext %178)
%180 = ptrtoint i8* %179 to i8
%181 = load i8*, i8** %11
store i8 %180, i8* %181
%182 = load i8*, i8** %11
%183 = getelementptr inbounds i8, i8* %182, i32 1
store i8* %183, i8** %11
%184 = load i64*, i64** %8
%185 = load i64, i64* %184
%186 = add nsw i64 %185, 1
store i64 %186, i64* %184
br label %187
187: ; preds = %176, %171
br label %161
188: ; preds = %169
%189 = load i64, i64* %14
%190 = load i64, i64* @EOF
%191 = icmp ne i64 %189, %190
br i1 %191, label %192, label %196
192: ; preds = %188
%193 = load i64, i64* %14
%194 = load i32*, i32** %9
%195 = call i32 @ungetc(i64 %193, i32* %194)
br label %196
196: ; preds = %192, %188
%197 = load i8*, i8** %11
store i8 0, i8* %197
br label %198
198: ; preds = %196, %112
br label %199
199: ; preds = %198, %110
br label %369
200: ; preds = %24
%201 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%202 = load i8, i8* %201
%203 = sext i8 %202 to i32
%204 = icmp eq i32 %203, 62
br i1 %204, label %205, label %277
205: ; preds = %200
store i64 1, i64* %12
br label %206
206: ; preds = %213, %205
%207 = load i64, i64* %12
%208 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 %207
%209 = load i8, i8* %208
%210 = sext i8 %209 to i32
%211 = icmp eq i32 %210, 32
br i1 %211, label %212, label %216
212: ; preds = %206
br label %213
213: ; preds = %212
%214 = load i64, i64* %12
%215 = add nsw i64 %214, 1
store i64 %215, i64* %12
br label %206
216: ; preds = %206
store i64 0, i64* %13
%217 = load i64, i64* %12
%218 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 %217
store i8* %218, i8** %11
br label %219
219: ; preds = %230, %216
%220 = load i8*, i8** %11
%221 = load i8, i8* %220
%222 = sext i8 %221 to i32
%223 = icmp ne i32 %222, 32
br i1 %223, label %224, label %235
224: ; preds = %219
%225 = load i8*, i8** %11
%226 = load i8, i8* %225
%227 = load i8*, i8** %6
%228 = load i64, i64* %13
%229 = getelementptr inbounds i8, i8* %227, i64 %228
store i8 %226, i8* %229
br label %230
230: ; preds = %224
%231 = load i8*, i8** %11
%232 = getelementptr inbounds i8, i8* %231, i32 1
store i8* %232, i8** %11
%233 = load i64, i64* %13
%234 = add nsw i64 %233, 1
store i64 %234, i64* %13
br label %219
235: ; preds = %219
%236 = load i8*, i8** %6
%237 = load i64, i64* %13
%238 = getelementptr inbounds i8, i8* %236, i64 %237
store i8 0, i8* %238
%239 = load i8*, i8** %7
store i8* %239, i8** %11
br label %240
240: ; preds = %266, %235
%241 = load i32*, i32** %9
%242 = call i64 @getc(i32* %241)
store i64 %242, i64* %14
%243 = icmp ne i64 %242, 62
br i1 %243, label %244, label %248
244: ; preds = %240
%245 = load i64, i64* %14
%246 = load i64, i64* @EOF
%247 = icmp ne i64 %245, %246
br label %248
248: ; preds = %244, %240
%249 = phi i1 [ false, %240 ], [ %247, %244 ]
br i1 %249, label %250, label %267
250: ; preds = %248
%251 = load i64, i64* %14
%252 = trunc i64 %251 to i8
%253 = call i64 @isalpha(i8 signext %252)
%254 = icmp ne i64 %253, 0
br i1 %254, label %255, label %266
255: ; preds = %250
%256 = load i64, i64* %14
%257 = trunc i64 %256 to i8
%258 = call i8* @tolower(i8 signext %257)
%259 = ptrtoint i8* %258 to i8
%260 = load i8*, i8** %11
store i8 %259, i8* %260
%261 = load i64*, i64** %8
%262 = load i64, i64* %261
%263 = add nsw i64 %262, 1
store i64 %263, i64* %261
%264 = load i8*, i8** %11
%265 = getelementptr inbounds i8, i8* %264, i32 1
store i8* %265, i8** %11
br label %266
266: ; preds = %255, %250
br label %240
267: ; preds = %248
%268 = load i64, i64* %14
%269 = load i64, i64* @EOF
%270 = icmp ne i64 %268, %269
br i1 %270, label %271, label %275
271: ; preds = %267
%272 = load i64, i64* %14
%273 = load i32*, i32** %9
%274 = call i32 @ungetc(i64 %272, i32* %273)
br label %275
275: ; preds = %271, %267
%276 = load i8*, i8** %11
store i8 0, i8* %276
br label %368
277: ; preds = %200
br label %278
278: ; preds = %289, %277
%279 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%280 = call i64 @strncmp(i8* %279, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i32 5)
%281 = icmp ne i64 %280, 0
br i1 %281, label %282, label %290
282: ; preds = %278
%283 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%284 = load i32*, i32** %9
%285 = call i8* @fgets(i8* %283, i32 1000, i32* %284)
%286 = icmp eq i8* %285, null
br i1 %286, label %287, label %289
287: ; preds = %282
%288 = call i32 @exit(i32 1)
unreachable
289: ; preds = %282
br label %278
290: ; preds = %278
store i64 0, i64* %12
%291 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 12
store i8* %291, i8** %11
br label %292
292: ; preds = %303, %290
%293 = load i8*, i8** %11
%294 = load i8, i8* %293
%295 = sext i8 %294 to i32
%296 = icmp ne i32 %295, 32
br i1 %296, label %297, label %308
297: ; preds = %292
%298 = load i8*, i8** %11
%299 = load i8, i8* %298
%300 = load i8*, i8** %6
%301 = load i64, i64* %12
%302 = getelementptr inbounds i8, i8* %300, i64 %301
store i8 %299, i8* %302
br label %303
303: ; preds = %297
%304 = load i8*, i8** %11
%305 = getelementptr inbounds i8, i8* %304, i32 1
store i8* %305, i8** %11
%306 = load i64, i64* %12
%307 = add nsw i64 %306, 1
store i64 %307, i64* %12
br label %292
308: ; preds = %292
%309 = load i8*, i8** %6
%310 = load i64, i64* %12
%311 = getelementptr inbounds i8, i8* %309, i64 %310
store i8 0, i8* %311
br label %312
312: ; preds = %323, %308
%313 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%314 = call i64 @strncmp(i8* %313, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 6)
%315 = icmp ne i64 %314, 0
br i1 %315, label %316, label %324
316: ; preds = %312
%317 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%318 = load i32*, i32** %9
%319 = call i8* @fgets(i8* %317, i32 1000, i32* %318)
%320 = icmp eq i8* %319, null
br i1 %320, label %321, label %323
321: ; preds = %316
%322 = call i32 @exit(i32 1)
unreachable
323: ; preds = %316
br label %312
324: ; preds = %312
%325 = load i8*, i8** %7
store i8* %325, i8** %11
%326 = load i64*, i64** %8
store i64 0, i64* %326
%327 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%328 = load i32*, i32** %9
%329 = call i8* @fgets(i8* %327, i32 1000, i32* %328)
store i8* %329, i8** %15
br label %330
330: ; preds = %362, %324
%331 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%332 = call i64 @strncmp(i8* %331, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 2)
%333 = icmp ne i64 %332, 0
br i1 %333, label %334, label %366
334: ; preds = %330
store i64 0, i64* %12
br label %335
335: ; preds = %359, %334
%336 = load i64, i64* %12
%337 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 %336
%338 = load i8, i8* %337
%339 = sext i8 %338 to i32
%340 = icmp ne i32 %339, 10
br i1 %340, label %341, label %362
341: ; preds = %335
%342 = load i64, i64* %12
%343 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 %342
%344 = load i8, i8* %343
%345 = call i64 @isalpha(i8 signext %344)
%346 = icmp ne i64 %345, 0
br i1 %346, label %347, label %358
347: ; preds = %341
%348 = load i64, i64* %12
%349 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 %348
%350 = load i8, i8* %349
%351 = call i8* @tolower(i8 signext %350)
%352 = ptrtoint i8* %351 to i8
%353 = load i8*, i8** %11
%354 = getelementptr inbounds i8, i8* %353, i32 1
store i8* %354, i8** %11
store i8 %352, i8* %353
%355 = load i64*, i64** %8
%356 = load i64, i64* %355
%357 = add nsw i64 %356, 1
store i64 %357, i64* %355
br label %358
358: ; preds = %347, %341
br label %359
359: ; preds = %358
%360 = load i64, i64* %12
%361 = add nsw i64 %360, 1
store i64 %361, i64* %12
br label %335
362: ; preds = %335
%363 = getelementptr inbounds [1000 x i8], [1000 x i8]* %10, i64 0, i64 0
%364 = load i32*, i32** %9
%365 = call i8* @fgets(i8* %363, i32 1000, i32* %364)
store i8* %365, i8** %15
br label %330
366: ; preds = %330
%367 = load i8*, i8** %11
store i8 0, i8* %367
br label %368
368: ; preds = %366, %275
br label %369
369: ; preds = %368, %199
br label %370
370: ; preds = %369
store i32 1, i32* %5
br label %371
371: ; preds = %370, %23
%372 = load i32, i32* %5
ret i32 %372
}

LLVM IR (-O2):
@EOF = global i64 0
@.str = [6 x i8] c"LOCUS\00"
@.str.1 = [7 x i8] c"ORIGIN\00"
@.str.2 = [3 x i8] c"//\00"
define i32 @fgetseq(i8* nocapture writeonly %0, i8* nocapture writeonly %1, i64* nocapture %2, i32* nocapture %3) {
%5 = alloca [1000 x i8]
%6 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 0
store i8 0, i8* %6
store i8 0, i8* %1
store i64 0, i64* %2
%7 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%8 = icmp eq i8* %7, null
br i1 %8, label %234, label %9
9: ; preds = %4
%10 = load i8, i8* %6
switch i8 %10, label %162 [
i8 59, label %11
i8 62, label %114
]
11: ; preds = %9
%12 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 1
%13 = load i8, i8* %12
%14 = icmp eq i8 %13, 32
br i1 %14, label %15, label %18
15: ; preds = %11
%16 = call i64 @getc(i32* %3)
%17 = icmp eq i64 %16, 59
br i1 %17, label %67, label %71
18: ; preds = %11, %22
%19 = phi i8 [ %26, %22 ], [ %13, %11 ]
%20 = phi i8* [ %23, %22 ], [ %12, %11 ]
%21 = phi i64 [ %25, %22 ], [ 0, %11 ]
switch i8 %19, label %22 [
i8 32, label %27
i8 10, label %27
]
22: ; preds = %18
%23 = getelementptr inbounds i8, i8* %20, i64 1
%24 = getelementptr inbounds i8, i8* %0, i64 %21
store i8 %19, i8* %24
%25 = add nuw nsw i64 %21, 1
%26 = load i8, i8* %23
br label %18
27: ; preds = %18, %18
%28 = getelementptr inbounds i8, i8* %0, i64 %21
store i8 0, i8* %28
%29 = call i64 @getc(i32* %3)
%30 = icmp eq i64 %29, 59
br i1 %30, label %31, label %35
31: ; preds = %27, %31
%32 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%33 = call i64 @getc(i32* %3)
%34 = icmp eq i64 %33, 59
br i1 %34, label %31, label %35
35: ; preds = %31, %27
%36 = phi i64 [ %29, %27 ], [ %33, %31 ]
%37 = call i32 @ungetc(i64 %36, i32* %3)
%38 = call i64 @getc(i32* %3)
%39 = icmp ne i64 %38, 59
%40 = load i64, i64* @EOF
%41 = icmp ne i64 %38, %40
%42 = select i1 %39, i1 %41, i1 false
br i1 %42, label %43, label %63
43: ; preds = %35, %56
%44 = phi i64 [ %58, %56 ], [ %38, %35 ]
%45 = phi i8* [ %57, %56 ], [ %1, %35 ]
%46 = trunc i64 %44 to i8
%47 = call i64 @isalpha(i8 signext %46)
%48 = icmp eq i64 %47, 0
br i1 %48, label %56, label %49
49: ; preds = %43
%50 = call i8* @tolower(i8 signext %46)
%51 = ptrtoint i8* %50 to i64
%52 = trunc i64 %51 to i8
store i8 %52, i8* %45
%53 = getelementptr inbounds i8, i8* %45, i64 1
%54 = load i64, i64* %2
%55 = add nsw i64 %54, 1
store i64 %55, i64* %2
br label %56
56: ; preds = %49, %43
%57 = phi i8* [ %53, %49 ], [ %45, %43 ]
%58 = call i64 @getc(i32* %3)
%59 = icmp ne i64 %58, 59
%60 = load i64, i64* @EOF
%61 = icmp ne i64 %58, %60
%62 = select i1 %59, i1 %61, i1 false
br i1 %62, label %43, label %63
63: ; preds = %56, %35
%64 = phi i8* [ %1, %35 ], [ %57, %56 ]
%65 = phi i64 [ %38, %35 ], [ %58, %56 ]
%66 = phi i1 [ %41, %35 ], [ %61, %56 ]
br i1 %66, label %228, label %232
67: ; preds = %15, %67
%68 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%69 = call i64 @getc(i32* %3)
%70 = icmp eq i64 %69, 59
br i1 %70, label %67, label %71
71: ; preds = %67, %15
%72 = phi i64 [ %16, %15 ], [ %69, %67 ]
%73 = call i32 @ungetc(i64 %72, i32* %3)
%74 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
br label %75
75: ; preds = %79, %71
%76 = phi i8* [ %6, %71 ], [ %80, %79 ]
%77 = phi i64 [ 0, %71 ], [ %82, %79 ]
%78 = load i8, i8* %76
switch i8 %78, label %79 [
i8 32, label %83
i8 10, label %83
]
79: ; preds = %75
%80 = getelementptr inbounds i8, i8* %76, i64 1
%81 = getelementptr inbounds i8, i8* %0, i64 %77
store i8 %78, i8* %81
%82 = add nuw nsw i64 %77, 1
br label %75
83: ; preds = %75, %75
%84 = getelementptr inbounds i8, i8* %0, i64 %77
store i8 0, i8* %84
%85 = call i64 @getc(i32* %3)
%86 = icmp ne i64 %85, 59
%87 = load i64, i64* @EOF
%88 = icmp ne i64 %85, %87
%89 = select i1 %86, i1 %88, i1 false
br i1 %89, label %90, label %110
90: ; preds = %83, %103
%91 = phi i64 [ %105, %103 ], [ %85, %83 ]
%92 = phi i8* [ %104, %103 ], [ %1, %83 ]
%93 = trunc i64 %91 to i8
%94 = call i64 @isalpha(i8 signext %93)
%95 = icmp eq i64 %94, 0
br i1 %95, label %103, label %96
96: ; preds = %90
%97 = call i8* @tolower(i8 signext %93)
%98 = ptrtoint i8* %97 to i64
%99 = trunc i64 %98 to i8
store i8 %99, i8* %92
%100 = getelementptr inbounds i8, i8* %92, i64 1
%101 = load i64, i64* %2
%102 = add nsw i64 %101, 1
store i64 %102, i64* %2
br label %103
103: ; preds = %96, %90
%104 = phi i8* [ %100, %96 ], [ %92, %90 ]
%105 = call i64 @getc(i32* %3)
%106 = icmp ne i64 %105, 59
%107 = load i64, i64* @EOF
%108 = icmp ne i64 %105, %107
%109 = select i1 %106, i1 %108, i1 false
br i1 %109, label %90, label %110
110: ; preds = %103, %83
%111 = phi i8* [ %1, %83 ], [ %104, %103 ]
%112 = phi i64 [ %85, %83 ], [ %105, %103 ]
%113 = phi i1 [ %88, %83 ], [ %108, %103 ]
br i1 %113, label %228, label %232
114: ; preds = %9, %114
%115 = phi i64 [ %119, %114 ], [ 1, %9 ]
%116 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 %115
%117 = load i8, i8* %116
%118 = icmp eq i8 %117, 32
%119 = add nuw nsw i64 %115, 1
br i1 %118, label %114, label %120
120: ; preds = %114
%121 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 %115
br label %122
122: ; preds = %120, %122
%123 = phi i64 [ %128, %122 ], [ 0, %120 ]
%124 = phi i8* [ %127, %122 ], [ %121, %120 ]
%125 = phi i8 [ %129, %122 ], [ %117, %120 ]
%126 = getelementptr inbounds i8, i8* %0, i64 %123
store i8 %125, i8* %126
%127 = getelementptr inbounds i8, i8* %124, i64 1
%128 = add nuw nsw i64 %123, 1
%129 = load i8, i8* %127
%130 = icmp eq i8 %129, 32
br i1 %130, label %131, label %122
131: ; preds = %122
%132 = getelementptr inbounds i8, i8* %0, i64 %128
store i8 0, i8* %132
%133 = call i64 @getc(i32* %3)
%134 = icmp ne i64 %133, 62
%135 = load i64, i64* @EOF
%136 = icmp ne i64 %133, %135
%137 = select i1 %134, i1 %136, i1 false
br i1 %137, label %138, label %158
138: ; preds = %131, %151
%139 = phi i64 [ %153, %151 ], [ %133, %131 ]
%140 = phi i8* [ %152, %151 ], [ %1, %131 ]
%141 = trunc i64 %139 to i8
%142 = call i64 @isalpha(i8 signext %141)
%143 = icmp eq i64 %142, 0
br i1 %143, label %151, label %144
144: ; preds = %138
%145 = call i8* @tolower(i8 signext %141)
%146 = ptrtoint i8* %145 to i64
%147 = trunc i64 %146 to i8
store i8 %147, i8* %140
%148 = load i64, i64* %2
%149 = add nsw i64 %148, 1
store i64 %149, i64* %2
%150 = getelementptr inbounds i8, i8* %140, i64 1
br label %151
151: ; preds = %144, %138
%152 = phi i8* [ %150, %144 ], [ %140, %138 ]
%153 = call i64 @getc(i32* %3)
%154 = icmp ne i64 %153, 62
%155 = load i64, i64* @EOF
%156 = icmp ne i64 %153, %155
%157 = select i1 %154, i1 %156, i1 false
br i1 %157, label %138, label %158
158: ; preds = %151, %131
%159 = phi i8* [ %1, %131 ], [ %152, %151 ]
%160 = phi i64 [ %133, %131 ], [ %153, %151 ]
%161 = phi i1 [ %136, %131 ], [ %156, %151 ]
br i1 %161, label %228, label %232
162: ; preds = %9, %165
%163 = call i64 @strncmp(i8* %6, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i32 5)
%164 = icmp eq i64 %163, 0
br i1 %164, label %170, label %165
165: ; preds = %162
%166 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%167 = icmp eq i8* %166, null
br i1 %167, label %168, label %162
168: ; preds = %165
%169 = call i32 @exit(i32 1)
unreachable
170: ; preds = %162
%171 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 12
%172 = load i8, i8* %171
%173 = icmp eq i8 %172, 32
br i1 %173, label %183, label %174
174: ; preds = %170, %174
%175 = phi i8 [ %181, %174 ], [ %172, %170 ]
%176 = phi i64 [ %180, %174 ], [ 0, %170 ]
%177 = phi i8* [ %179, %174 ], [ %171, %170 ]
%178 = getelementptr inbounds i8, i8* %0, i64 %176
store i8 %175, i8* %178
%179 = getelementptr inbounds i8, i8* %177, i64 1
%180 = add nuw nsw i64 %176, 1
%181 = load i8, i8* %179
%182 = icmp eq i8 %181, 32
br i1 %182, label %183, label %174
183: ; preds = %174, %170
%184 = phi i64 [ 0, %170 ], [ %180, %174 ]
%185 = getelementptr inbounds i8, i8* %0, i64 %184
store i8 0, i8* %185
br label %186
186: ; preds = %189, %183
%187 = call i64 @strncmp(i8* %6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 6)
%188 = icmp eq i64 %187, 0
br i1 %188, label %194, label %189
189: ; preds = %186
%190 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%191 = icmp eq i8* %190, null
br i1 %191, label %192, label %186
192: ; preds = %189
%193 = call i32 @exit(i32 1)
unreachable
194: ; preds = %186
store i64 0, i64* %2
%195 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%196 = call i64 @strncmp(i8* %6, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 2)
%197 = icmp eq i64 %196, 0
br i1 %197, label %232, label %198
198: ; preds = %194, %223
%199 = phi i8* [ %224, %223 ], [ %1, %194 ]
%200 = load i8, i8* %6
%201 = icmp eq i8 %200, 10
br i1 %201, label %223, label %202
202: ; preds = %198, %217
%203 = phi i8 [ %221, %217 ], [ %200, %198 ]
%204 = phi i8* [ %220, %217 ], [ %6, %198 ]
%205 = phi i64 [ %219, %217 ], [ 0, %198 ]
%206 = phi i8* [ %218, %217 ], [ %199, %198 ]
%207 = call i64 @isalpha(i8 signext %203)
%208 = icmp eq i64 %207, 0
br i1 %208, label %217, label %209
209: ; preds = %202
%210 = load i8, i8* %204
%211 = call i8* @tolower(i8 signext %210)
%212 = ptrtoint i8* %211 to i64
%213 = trunc i64 %212 to i8
%214 = getelementptr inbounds i8, i8* %206, i64 1
store i8 %213, i8* %206
%215 = load i64, i64* %2
%216 = add nsw i64 %215, 1
store i64 %216, i64* %2
br label %217
217: ; preds = %202, %209
%218 = phi i8* [ %214, %209 ], [ %206, %202 ]
%219 = add nuw nsw i64 %205, 1
%220 = getelementptr inbounds [1000 x i8], [1000 x i8]* %5, i64 0, i64 %219
%221 = load i8, i8* %220
%222 = icmp eq i8 %221, 10
br i1 %222, label %223, label %202
223: ; preds = %217, %198
%224 = phi i8* [ %199, %198 ], [ %218, %217 ]
%225 = call i8* @fgets(i8* %6, i32 1000, i32* %3)
%226 = call i64 @strncmp(i8* %6, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 2)
%227 = icmp eq i64 %226, 0
br i1 %227, label %232, label %198
228: ; preds = %158, %110, %63
%229 = phi i64 [ %65, %63 ], [ %112, %110 ], [ %160, %158 ]
%230 = phi i8* [ %64, %63 ], [ %111, %110 ], [ %159, %158 ]
%231 = call i32 @ungetc(i64 %229, i32* %3)
br label %232
232: ; preds = %223, %228, %194, %158, %110, %63
%233 = phi i8* [ %64, %63 ], [ %111, %110 ], [ %159, %158 ], [ %1, %194 ], [ %230, %228 ], [ %224, %223 ]
store i8 0, i8* %233
br label %234
234: ; preds = %232, %4
%235 = phi i32 [ 0, %4 ], [ 1, %232 ]
ret i32 %235
}