#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 */
int /*<<< orphan*/ fgets(char *, int, int /*<<< orphan*/ *);
scalar_t__ isspace(char);
char *strchr(char *, char);
int /*<<< orphan*/ strcpy(char *, char *);
scalar_t__ strncmp(char *, char *, int);
void get_line(FILE *in, char *line, int maxline, int strip_sentnum,
              int strip_tagonly) {
  char *start;
  char *end;
  if (!fgets(line, maxline, in))
    return;
  line[maxline - 1] = '\0';
  start = line;
  while (*start && (unsigned)*start < 0x80 && isspace(*start))
    start++;
  if (start != line)
    strcpy(line, start);
  end = strchr(line, '\0');
  while (end > line && (((unsigned char *)end)[-1] <= ' '))
    *--end = '\0';
  if (strip_tagonly && line[0] == '<' && strchr(line, '>') + 1 == end) {
    *line = '\0';
  } else if (strip_sentnum && strncmp(line, "<s id=", 6) == 0) {
    char *start = strchr(line + 6, '>');
    if (start)
      strcpy(line, start + 1);
  }
  return;
}


x86 assembly (clang, -O0):
<get_line>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
mov    -0x8(%rbp),%rdx
call   1070 <fgets@plt>
cmp    $0x0,%eax
jne    1188 <get_line+0x38>
jmp    1327 <get_line+0x1d7>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x39(%rbp)
je     11e4 <get_line+0x94>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x80,%ecx
mov    %al,-0x39(%rbp)
jae    11e4 <get_line+0x94>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1060 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    11f4 <get_line+0xa4>
jmp    1205 <get_line+0xb5>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11a1 <get_line+0x51>
mov    -0x28(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     1220 <get_line+0xd0>
mov    -0x10(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1040 <strcpy@plt>
mov    -0x10(%rbp),%rdi
xor    %esi,%esi
call   1050 <strchr@plt>
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x3a(%rbp)
jbe    1253 <get_line+0x103>
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
cmp    $0x20,%eax
setle  %al
mov    %al,-0x3a(%rbp)
mov    -0x3a(%rbp),%al
test   $0x1,%al
jne    1263 <get_line+0x113>
jmp    127b <get_line+0x12b>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x0,-0x1(%rax)
jmp    122f <get_line+0xdf>
cmpl   $0x0,-0x1c(%rbp)
je     12bd <get_line+0x16d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3c,%eax
jne    12bd <get_line+0x16d>
mov    -0x10(%rbp),%rdi
mov    $0x3e,%esi
call   1050 <strchr@plt>
add    $0x1,%rax
cmp    -0x30(%rbp),%rax
jne    12bd <get_line+0x16d>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
jmp    1322 <get_line+0x1d2>
cmpl   $0x0,-0x18(%rbp)
je     131d <get_line+0x1cd>
mov    -0x10(%rbp),%rdi
lea    0xd2e(%rip),%rsi
mov    $0x6,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    131d <get_line+0x1cd>
mov    -0x10(%rbp),%rdi
add    $0x6,%rdi
mov    $0x3e,%esi
call   1050 <strchr@plt>
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     1318 <get_line+0x1c8>
mov    -0x10(%rbp),%rdi
mov    -0x38(%rbp),%rsi
add    $0x1,%rsi
call   1040 <strcpy@plt>
jmp    131d <get_line+0x1cd>
jmp    1322 <get_line+0x1d2>
jmp    1327 <get_line+0x1d7>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_line>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %r8d,%r15d
mov    %ecx,%r14d
mov    %edx,%ebx
mov    %rsi,%rbp
mov    %rdi,%rdx
mov    %rsi,%rdi
mov    %ebx,%esi
call   1080 <fgets@plt>
test   %eax,%eax
je     1265 <get_line+0x105>
movslq %ebx,%rax
movb   $0x0,-0x1(%rax,%rbp,1)
mov    0x0(%rbp),%al
test   %al,%al
jle    11c9 <get_line+0x69>
mov    %rbp,%rbx
nopl   0x0(%rax)
movsbl %al,%edi
call   1070 <isspace@plt>
test   %rax,%rax
je     11b9 <get_line+0x59>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jg     11a0 <get_line+0x40>
cmp    %rbp,%rbx
je     11c9 <get_line+0x69>
mov    %rbp,%rdi
mov    %rbx,%rsi
call   1040 <strcpy@plt>
mov    %rbp,%rdi
call   1050 <strlen@plt>
mov    %rax,%rbx
add    %rbp,%rbx
cmp    %rbp,%rbx
jbe    11f6 <get_line+0x96>
nopl   0x0(%rax)
cmpb   $0x20,-0x1(%rbx)
ja     11f6 <get_line+0x96>
movb   $0x0,-0x1(%rbx)
add    $0xffffffffffffffff,%rbx
cmp    %rbp,%rbx
ja     11e0 <get_line+0x80>
mov    %rbp,%rbx
test   %r15d,%r15d
je     1217 <get_line+0xb7>
cmpb   $0x3c,0x0(%rbp)
jne    1217 <get_line+0xb7>
mov    %rbp,%rdi
mov    $0x3e,%esi
call   1060 <strchr@plt>
add    $0x1,%rax
cmp    %rbx,%rax
je     1261 <get_line+0x101>
test   %r14d,%r14d
je     1265 <get_line+0x105>
lea    0xddd(%rip),%rsi
mov    %rbp,%rdi
mov    $0x6,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
jne    1265 <get_line+0x105>
lea    0x6(%rbp),%rdi
mov    $0x3e,%esi
call   1060 <strchr@plt>
test   %rax,%rax
je     1265 <get_line+0x105>
add    $0x1,%rax
mov    %rbp,%rdi
mov    %rax,%rsi
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <strcpy@plt>
movb   $0x0,0x0(%rbp)
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [7 x i8] c"<s id=\00"
define void @get_line(i32* %0, i8* %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32*
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i8*
store i32* %0, i32** %6
store i8* %1, i8** %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%14 = load i8*, i8** %7
%15 = load i32, i32* %8
%16 = load i32*, i32** %6
%17 = call i32 @fgets(i8* %14, i32 %15, i32* %16)
%18 = icmp ne i32 %17, 0
br i1 %18, label %20, label %19
19: ; preds = %5
br label %111
20: ; preds = %5
%21 = load i8*, i8** %7
%22 = load i32, i32* %8
%23 = sub nsw i32 %22, 1
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %21, i64 %24
store i8 0, i8* %25
%26 = load i8*, i8** %7
store i8* %26, i8** %11
br label %27
27: ; preds = %44, %20
%28 = load i8*, i8** %11
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %42
32: ; preds = %27
%33 = load i8*, i8** %11
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = icmp ult i32 %35, 128
br i1 %36, label %37, label %42
37: ; preds = %32
%38 = load i8*, i8** %11
%39 = load i8, i8* %38
%40 = call i64 @isspace(i8 signext %39)
%41 = icmp ne i64 %40, 0
br label %42
42: ; preds = %37, %32, %27
%43 = phi i1 [ false, %32 ], [ false, %27 ], [ %41, %37 ]
br i1 %43, label %44, label %47
44: ; preds = %42
%45 = load i8*, i8** %11
%46 = getelementptr inbounds i8, i8* %45, i32 1
store i8* %46, i8** %11
br label %27
47: ; preds = %42
%48 = load i8*, i8** %11
%49 = load i8*, i8** %7
%50 = icmp ne i8* %48, %49
br i1 %50, label %51, label %55
51: ; preds = %47
%52 = load i8*, i8** %7
%53 = load i8*, i8** %11
%54 = call i32 @strcpy(i8* %52, i8* %53)
br label %55
55: ; preds = %51, %47
%56 = load i8*, i8** %7
%57 = call i8* @strchr(i8* %56, i8 signext 0)
store i8* %57, i8** %12
br label %58
58: ; preds = %70, %55
%59 = load i8*, i8** %12
%60 = load i8*, i8** %7
%61 = icmp ugt i8* %59, %60
br i1 %61, label %62, label %68
62: ; preds = %58
%63 = load i8*, i8** %12
%64 = getelementptr inbounds i8, i8* %63, i64 -1
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = icmp sle i32 %66, 32
br label %68
68: ; preds = %62, %58
%69 = phi i1 [ false, %58 ], [ %67, %62 ]
br i1 %69, label %70, label %73
70: ; preds = %68
%71 = load i8*, i8** %12
%72 = getelementptr inbounds i8, i8* %71, i32 -1
store i8* %72, i8** %12
store i8 0, i8* %72
br label %58
73: ; preds = %68
%74 = load i32, i32* %10
%75 = icmp ne i32 %74, 0
br i1 %75, label %76, label %90
76: ; preds = %73
%77 = load i8*, i8** %7
%78 = getelementptr inbounds i8, i8* %77, i64 0
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %80, 60
br i1 %81, label %82, label %90
82: ; preds = %76
%83 = load i8*, i8** %7
%84 = call i8* @strchr(i8* %83, i8 signext 62)
%85 = getelementptr inbounds i8, i8* %84, i64 1
%86 = load i8*, i8** %12
%87 = icmp eq i8* %85, %86
br i1 %87, label %88, label %90
88: ; preds = %82
%89 = load i8*, i8** %7
store i8 0, i8* %89
br label %110
90: ; preds = %82, %76, %73
%91 = load i32, i32* %9
%92 = icmp ne i32 %91, 0
br i1 %92, label %93, label %109
93: ; preds = %90
%94 = load i8*, i8** %7
%95 = call i64 @strncmp(i8* %94, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), i32 6)
%96 = icmp eq i64 %95, 0
br i1 %96, label %97, label %109
97: ; preds = %93
%98 = load i8*, i8** %7
%99 = getelementptr inbounds i8, i8* %98, i64 6
%100 = call i8* @strchr(i8* %99, i8 signext 62)
store i8* %100, i8** %13
%101 = load i8*, i8** %13
%102 = icmp ne i8* %101, null
br i1 %102, label %103, label %108
103: ; preds = %97
%104 = load i8*, i8** %7
%105 = load i8*, i8** %13
%106 = getelementptr inbounds i8, i8* %105, i64 1
%107 = call i32 @strcpy(i8* %104, i8* %106)
br label %108
108: ; preds = %103, %97
br label %109
109: ; preds = %108, %93, %90
br label %110
110: ; preds = %109, %88
br label %111
111: ; preds = %110, %19
ret void
}

LLVM IR (-O2):
@.str = [7 x i8] c"<s id=\00"
define void @get_line(i32* nocapture %0, i8* %1, i32 %2, i32 %3, i32 %4) {
%6 = tail call i32 @fgets(i8* %1, i32 %2, i32* %0)
%7 = icmp eq i32 %6, 0
br i1 %7, label %62, label %8
8: ; preds = %5
%9 = add nsw i32 %2, -1
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds i8, i8* %1, i64 %10
store i8 0, i8* %11
%12 = load i8, i8* %1
%13 = icmp sgt i8 %12, 0
br i1 %13, label %14, label %28
14: ; preds = %8, %19
%15 = phi i8 [ %21, %19 ], [ %12, %8 ]
%16 = phi i8* [ %20, %19 ], [ %1, %8 ]
%17 = tail call i64 @isspace(i8 signext %15)
%18 = icmp eq i64 %17, 0
br i1 %18, label %23, label %19
19: ; preds = %14
%20 = getelementptr inbounds i8, i8* %16, i64 1
%21 = load i8, i8* %20
%22 = icmp sgt i8 %21, 0
br i1 %22, label %14, label %23
23: ; preds = %14, %19
%24 = phi i8* [ %16, %14 ], [ %20, %19 ]
%25 = icmp eq i8* %24, %1
br i1 %25, label %28, label %26
26: ; preds = %23
%27 = tail call i32 @strcpy(i8* %1, i8* %24)
br label %28
28: ; preds = %8, %26, %23
%29 = tail call i64 @strlen(i8* dereferenceable(1) %1)
%30 = getelementptr i8, i8* %1, i64 %29
%31 = icmp ugt i8* %30, %1
br i1 %31, label %32, label %39
32: ; preds = %28, %37
%33 = phi i8* [ %34, %37 ], [ %30, %28 ]
%34 = getelementptr inbounds i8, i8* %33, i64 -1
%35 = load i8, i8* %34
%36 = icmp ult i8 %35, 33
br i1 %36, label %37, label %39
37: ; preds = %32
store i8 0, i8* %34
%38 = icmp ugt i8* %34, %1
br i1 %38, label %32, label %39
39: ; preds = %32, %37, %28
%40 = phi i8* [ %30, %28 ], [ %1, %37 ], [ %33, %32 ]
%41 = icmp eq i32 %4, 0
br i1 %41, label %50, label %42
42: ; preds = %39
%43 = load i8, i8* %1
%44 = icmp eq i8 %43, 60
br i1 %44, label %45, label %50
45: ; preds = %42
%46 = tail call i8* @strchr(i8* %1, i8 signext 62)
%47 = getelementptr inbounds i8, i8* %46, i64 1
%48 = icmp eq i8* %47, %40
br i1 %48, label %49, label %50
49: ; preds = %45
store i8 0, i8* %1
br label %62
50: ; preds = %45, %42, %39
%51 = icmp eq i32 %3, 0
br i1 %51, label %62, label %52
52: ; preds = %50
%53 = tail call i64 @strncmp(i8* %1, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), i32 6)
%54 = icmp eq i64 %53, 0
br i1 %54, label %55, label %62
55: ; preds = %52
%56 = getelementptr inbounds i8, i8* %1, i64 6
%57 = tail call i8* @strchr(i8* %56, i8 signext 62)
%58 = icmp eq i8* %57, null
br i1 %58, label %62, label %59
59: ; preds = %55
%60 = getelementptr inbounds i8, i8* %57, i64 1
%61 = tail call i32 @strcpy(i8* %1, i8* %60)
br label %62
62: ; preds = %49, %52, %50, %59, %55, %5
ret void
}