int __getline(char *buf, int len, int *flag) {
  char *src;
  char ch;
  char prev_ch;
  int line_len;
  src = buf;
  ch = *src++;
  switch (ch) {
  case ';':
    *flag = 0;
    break;
  case 0x0a:
  case 0x0d:
    *flag = 1;
    break;
  case '[':
    *flag = 2;
    break;
  default:
    *flag = 3;
    break;
  }
  if (*flag == 1) {
    ch = *src++;
    if (ch == 0x0a)
      return 2;
    else
      return 1;
  }
  ch = *src++;
  line_len = 1;
  while (line_len < len) {
    if (ch == 0x0a || ch == 0x0d)
      break;
    ch = *src++;
    line_len++;
    if (line_len >= 512) {
      *flag = -1;
      return 0;
    }
  }
  line_len++;
  prev_ch = ch;
  ch = *src++;
  if (prev_ch == 0x0d) {
    if (ch == 0x0a)
      line_len++;
  }
  return line_len;
}


x86 assembly (clang, -O0):
<__getline>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
mov    %eax,-0x34(%rbp)
sub    $0xa,%eax
je     1182 <__getline+0x82>
jmp    1140 <__getline+0x40>
mov    -0x34(%rbp),%eax
sub    $0xd,%eax
je     1182 <__getline+0x82>
jmp    1151 <__getline+0x51>
mov    -0x34(%rbp),%eax
sub    $0x3b,%eax
je     1173 <__getline+0x73>
jmp    1162 <__getline+0x62>
mov    -0x34(%rbp),%eax
sub    $0x5b,%eax
je     1191 <__getline+0x91>
jmp    11a0 <__getline+0xa0>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
jmp    11aa <__getline+0xaa>
mov    -0x20(%rbp),%rax
movl   $0x1,(%rax)
jmp    11aa <__getline+0xaa>
mov    -0x20(%rbp),%rax
movl   $0x2,(%rax)
jmp    11aa <__getline+0xaa>
mov    -0x20(%rbp),%rax
movl   $0x3,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x1,(%rax)
jne    11f0 <__getline+0xf0>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0xa,%eax
jne    11e4 <__getline+0xe4>
movl   $0x2,-0x4(%rbp)
jmp    12cc <__getline+0x1cc>
movl   $0x1,-0x4(%rbp)
jmp    12cc <__getline+0x1cc>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    127b <__getline+0x17b>
movsbl -0x29(%rbp),%eax
cmp    $0xa,%eax
je     1231 <__getline+0x131>
movsbl -0x29(%rbp),%eax
cmp    $0xd,%eax
jne    1236 <__getline+0x136>
jmp    127b <__getline+0x17b>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x200,-0x30(%rbp)
jl     1276 <__getline+0x176>
mov    -0x20(%rbp),%rax
movl   $0xffffffff,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    12cc <__getline+0x1cc>
jmp    120b <__getline+0x10b>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x29(%rbp),%al
mov    %al,-0x2a(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x2a(%rbp),%eax
cmp    $0xd,%eax
jne    12c6 <__getline+0x1c6>
movsbl -0x29(%rbp),%eax
cmp    $0xa,%eax
jne    12c1 <__getline+0x1c1>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12c6 <__getline+0x1c6>
mov    -0x30(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<__getline>:
push   %rbx
movsbl (%rdi),%eax
cmp    $0x3a,%eax
jg     1127 <__getline+0x27>
cmp    $0xa,%eax
je     1113 <__getline+0x13>
cmp    $0xd,%eax
jne    113c <__getline+0x3c>
movl   $0x1,(%rdx)
xor    %eax,%eax
cmpb   $0xa,0x1(%rdi)
sete   %al
add    $0x1,%eax
pop    %rbx
ret
cmp    $0x3b,%eax
je     1138 <__getline+0x38>
cmp    $0x5b,%eax
jne    113c <__getline+0x3c>
mov    $0x2,%eax
jmp    1141 <__getline+0x41>
xor    %eax,%eax
jmp    1141 <__getline+0x41>
mov    $0x3,%eax
mov    %eax,(%rdx)
lea    0x2(%rdi),%r8
cmp    $0x2,%esi
mov    $0x1,%r9d
cmovl  %r9d,%esi
mov    %esi,%r10d
neg    %r10d
xor    %eax,%eax
lea    (%r10,%rax,1),%ebx
movzbl 0x1(%rdi,%rax,1),%ecx
cmp    $0xffffffff,%ebx
je     1213 <__getline+0x113>
cmp    $0xa,%cl
je     11e4 <__getline+0xe4>
cmp    $0xd,%cl
je     11e4 <__getline+0xe4>
lea    (%r10,%rax,1),%ebx
movzbl 0x2(%rdi,%rax,1),%ecx
cmp    $0xfffffffe,%ebx
je     1218 <__getline+0x118>
cmp    $0xa,%cl
je     11f1 <__getline+0xf1>
cmp    $0xd,%cl
je     11f1 <__getline+0xf1>
lea    (%r10,%rax,1),%ebx
movzbl 0x3(%rdi,%rax,1),%ecx
cmp    $0xfffffffd,%ebx
je     1221 <__getline+0x121>
cmp    $0xa,%cl
je     1202 <__getline+0x102>
cmp    $0xd,%cl
je     1202 <__getline+0x102>
cmp    $0x1fc,%eax
je     122a <__getline+0x12a>
lea    (%r10,%rax,1),%rbx
movzbl 0x4(%rdi,%rax,1),%ecx
cmp    $0xfffffffc,%ebx
je     1234 <__getline+0x134>
lea    0x3(%r8),%r11
lea    0x3(%r9),%ebx
cmp    $0xa,%cl
je     123e <__getline+0x13e>
cmp    $0xd,%cl
je     123e <__getline+0x13e>
add    $0x4,%r8
add    $0x4,%r9d
add    $0x4,%rax
jmp    115c <__getline+0x5c>
lea    (%rdi,%rax,1),%r11
add    $0x2,%r11
mov    %r9d,%ebx
jmp    123e <__getline+0x13e>
add    $0x1,%r9d
lea    (%rdi,%rax,1),%r11
add    $0x3,%r11
mov    %r9d,%ebx
jmp    123e <__getline+0x13e>
add    $0x2,%r9d
lea    (%rdi,%rax,1),%r11
add    $0x4,%r11
mov    %r9d,%ebx
jmp    123e <__getline+0x13e>
mov    %r8,%r11
jmp    123c <__getline+0x13c>
add    $0x1,%r8
mov    %r8,%r11
jmp    123c <__getline+0x13c>
add    $0x2,%r8
mov    %r8,%r11
jmp    123c <__getline+0x13c>
movl   $0xffffffff,(%rdx)
xor    %eax,%eax
pop    %rbx
ret
lea    (%rdi,%rax,1),%r11
add    $0x5,%r11
mov    %esi,%ebx
mov    (%r11),%al
xor    $0xd,%cl
xor    $0xa,%al
xor    %edx,%edx
or     %cl,%al
sete   %dl
lea    (%rdx,%rbx,1),%eax
add    $0x1,%eax
pop    %rbx
ret

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

LLVM IR (-O2):
define i32 @__getline(i8* nocapture %0, i32 %1, i32* nocapture %2) {
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %0
%6 = sext i8 %5 to i32
switch i32 %6, label %8 [
i32 59, label %13
i32 10, label %9
i32 13, label %9
i32 91, label %7
]
7: ; preds = %3
br label %13
8: ; preds = %3
br label %13
9: ; preds = %3, %3
store i32 1, i32* %2
%10 = load i8, i8* %4
%11 = icmp eq i8 %10, 10
%12 = select i1 %11, i32 2, i32 1
br label %58
13: ; preds = %3, %8, %7
%14 = phi i32 [ 3, %8 ], [ 2, %7 ], [ 0, %3 ]
store i32 %14, i32* %2
%15 = getelementptr inbounds i8, i8* %0, i64 2
%16 = call i32 @llvm.smax.i32(i32 %1, i32 1)
br label %17
17: ; preds = %44, %13
%18 = phi i8* [ %15, %13 ], [ %45, %44 ]
%19 = phi i8* [ %4, %13 ], [ %37, %44 ]
%20 = phi i32 [ 1, %13 ], [ %46, %44 ]
%21 = load i8, i8* %19
%22 = icmp eq i32 %20, %16
br i1 %22, label %48, label %23
23: ; preds = %17
switch i8 %21, label %24 [
i8 13, label %48
i8 10, label %48
]
24: ; preds = %23
%25 = getelementptr inbounds i8, i8* %18, i64 1
%26 = add nuw nsw i32 %20, 1
%27 = load i8, i8* %18
%28 = icmp eq i32 %26, %16
br i1 %28, label %48, label %29
29: ; preds = %24
switch i8 %27, label %30 [
i8 13, label %48
i8 10, label %48
]
30: ; preds = %29
%31 = getelementptr inbounds i8, i8* %18, i64 2
%32 = add nuw nsw i32 %20, 2
%33 = load i8, i8* %25
%34 = icmp eq i32 %32, %16
br i1 %34, label %48, label %35
35: ; preds = %30
switch i8 %33, label %36 [
i8 13, label %48
i8 10, label %48
]
36: ; preds = %35
%37 = getelementptr inbounds i8, i8* %18, i64 3
%38 = add nuw nsw i32 %20, 3
%39 = icmp eq i32 %38, 512
br i1 %39, label %47, label %40
40: ; preds = %36
%41 = load i8, i8* %31
%42 = icmp eq i32 %38, %16
br i1 %42, label %48, label %43
43: ; preds = %40
switch i8 %41, label %44 [
i8 13, label %48
i8 10, label %48
]
44: ; preds = %43
%45 = getelementptr inbounds i8, i8* %18, i64 4
%46 = add nuw nsw i32 %20, 4
br label %17
47: ; preds = %36
store i32 -1, i32* %2
br label %58
48: ; preds = %43, %43, %40, %35, %35, %30, %29, %29, %24, %23, %23, %17
%49 = phi i8* [ %18, %23 ], [ %18, %23 ], [ %18, %17 ], [ %25, %24 ], [ %25, %29 ], [ %25, %29 ], [ %31, %30 ], [ %31, %35 ], [ %31, %35 ], [ %37, %40 ], [ %37, %43 ], [ %37, %43 ]
%50 = phi i8 [ %21, %23 ], [ %21, %23 ], [ %21, %17 ], [ %27, %24 ], [ %27, %29 ], [ %27, %29 ], [ %33, %30 ], [ %33, %35 ], [ %33, %35 ], [ %41, %40 ], [ %41, %43 ], [ %41, %43 ]
%51 = phi i32 [ %20, %23 ], [ %20, %23 ], [ %16, %17 ], [ %16, %24 ], [ %26, %29 ], [ %26, %29 ], [ %16, %30 ], [ %32, %35 ], [ %32, %35 ], [ %16, %40 ], [ %38, %43 ], [ %38, %43 ]
%52 = load i8, i8* %49
%53 = icmp eq i8 %50, 13
%54 = icmp eq i8 %52, 10
%55 = select i1 %53, i1 %54, i1 false
%56 = select i1 %55, i32 2, i32 1
%57 = add nuw nsw i32 %56, %51
br label %58
58: ; preds = %9, %48, %47
%59 = phi i32 [ %57, %48 ], [ 0, %47 ], [ %12, %9 ]
ret i32 %59
}