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

/* Variables and functions */
char *kill_line_ending_backslash(char *);
char *normalize_string(char const *, int, int, char *, int);
scalar_t__ strcmp(char const *, char *);
int strlen(char const *);
scalar_t__ strncmp(char const *, char *, int);
char *strndup(char const *, int);
int toml_rtos(const char *src, char **ret) {
  if (!src)
    return -1;
  if (*src != '\'' && *src != '"')
    return -1;
  *ret = 0;
  int srclen = strlen(src);
  if (*src == '\'') {
    if (0 == strncmp(src, "'''", 3)) {
      const char *sp = src + 3;
      const char *sq = src + srclen - 3;
      if (!(sp <= sq && 0 == strcmp(sq, "'''")))
        return -1;
      if (*sp == '\n')
        sp++;
      else if (sp[0] == '\r' && sp[1] == '\n')
        sp += 2;
      *ret = kill_line_ending_backslash(strndup(sp, sq - sp));
    } else {
      const char *sp = src + 1;
      const char *sq = src + srclen - 1;
      if (!(sp <= sq && *sq == '\''))
        return -1;
      *ret = strndup(sp, sq - sp);
    }
    return *ret ? 0 : -1;
  }
  const char *sp;
  const char *sq;
  if (0 == strncmp(src, "\"\"\"", 3)) {
    sp = src + 3;
    sq = src + srclen - 3;
    if (!(sp <= sq && 0 == strcmp(sq, "\"\"\"")))
      return -1;
    if (*sp == '\n')
      sp++;
    else if (sp[0] == '\r' && sp[1] == '\n')
      sp += 2;
  } else {
    sp = src + 1;
    sq = src + srclen - 1;
    if (!(sp <= sq && *sq == '"'))
      return -1;
  }
  char dummy_errbuf[1];
  *ret = normalize_string(sp, sq - sp, 1, dummy_errbuf, sizeof(dummy_errbuf));
  return *ret ? 0 : -1;
}


x86 assembly (clang, -O0):
<toml_rtos>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1187 <toml_rtos+0x27>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
je     11b3 <toml_rtos+0x53>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
je     11b3 <toml_rtos+0x53>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x10(%rbp),%rdi
call   1050 <strlen@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
jne    135a <toml_rtos+0x1fa>
mov    -0x10(%rbp),%rdi
lea    0xe1b(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    %rcx,%rax
jne    12d4 <toml_rtos+0x174>
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
add    $0xfffffffffffffffd,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
ja     1248 <toml_rtos+0xe8>
mov    -0x30(%rbp),%rdi
lea    0xdcb(%rip),%rsi
call   1070 <strcmp@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    %rcx,%rax
je     1254 <toml_rtos+0xf4>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    1275 <toml_rtos+0x115>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    12a7 <toml_rtos+0x147>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
jne    12a2 <toml_rtos+0x142>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xa,%eax
jne    12a2 <toml_rtos+0x142>
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
jmp    12a7 <toml_rtos+0x147>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
call   1060 <strndup@plt>
mov    %rax,%rdi
call   1080 <kill_line_ending_backslash@plt>
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    133d <toml_rtos+0x1dd>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x40(%rbp),%rax
ja     1311 <toml_rtos+0x1b1>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
je     131d <toml_rtos+0x1bd>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x38(%rbp),%rdi
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
call   1060 <strndup@plt>
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%rdx
mov    $0xffffffff,%eax
xor    %ecx,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x10(%rbp),%rdi
lea    0xc9f(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    %rcx,%rax
jne    142c <toml_rtos+0x2cc>
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
add    $0xfffffffffffffffd,%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     13c8 <toml_rtos+0x268>
mov    -0x50(%rbp),%rdi
lea    0xc4f(%rip),%rsi
call   1070 <strcmp@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    %rcx,%rax
je     13d4 <toml_rtos+0x274>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    13f5 <toml_rtos+0x295>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1427 <toml_rtos+0x2c7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
jne    1422 <toml_rtos+0x2c2>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xa,%eax
jne    1422 <toml_rtos+0x2c2>
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    1427 <toml_rtos+0x2c7>
jmp    147a <toml_rtos+0x31a>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     1469 <toml_rtos+0x309>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
je     1475 <toml_rtos+0x315>
movl   $0xffffffff,-0x4(%rbp)
jmp    14bf <toml_rtos+0x35f>
jmp    147a <toml_rtos+0x31a>
mov    -0x48(%rbp),%rdi
mov    -0x50(%rbp),%rax
mov    -0x48(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
lea    -0x51(%rbp),%rcx
mov    $0x1,%r8d
mov    %r8d,%edx
call   1040 <normalize_string@plt>
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%rdx
mov    $0xffffffff,%eax
xor    %ecx,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<toml_rtos>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    $0xffffffff,%ebp
test   %rdi,%rdi
je     12f8 <toml_rtos+0x198>
mov    %rsi,%r14
mov    %rdi,%rbx
mov    (%rdi),%al
cmp    $0x27,%al
je     1189 <toml_rtos+0x29>
cmp    $0x22,%al
jne    12f8 <toml_rtos+0x198>
movq   $0x0,(%r14)
mov    %rbx,%rdi
call   1050 <strlen@plt>
mov    %eax,%r15d
cmpb   $0x27,(%rbx)
jne    11ed <toml_rtos+0x8d>
lea    0xe59(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1250 <toml_rtos+0xf0>
cmp    $0x2,%r15d
jl     12f8 <toml_rtos+0x198>
mov    %r15d,%eax
cmpb   $0x27,-0x1(%rax,%rbx,1)
jne    12f8 <toml_rtos+0x198>
add    $0x1,%rbx
add    $0xfffffffe,%r15d
mov    %rbx,%rdi
mov    %r15d,%esi
call   1060 <strndup@plt>
jmp    12ef <toml_rtos+0x18f>
lea    0xe10(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1290 <toml_rtos+0x130>
cmp    $0x2,%r15d
jl     12f8 <toml_rtos+0x198>
movslq %r15d,%rax
lea    (%rax,%rbx,1),%r15
add    $0xffffffffffffffff,%r15
cmpb   $0x22,(%r15)
jne    12f8 <toml_rtos+0x198>
add    $0x1,%rbx
mov    %rbx,%rdi
sub    %edi,%r15d
lea    0x7(%rsp),%rcx
mov    %r15d,%esi
mov    $0x1,%edx
mov    $0x1,%r8d
call   1040 <normalize_string@plt>
jmp    12ef <toml_rtos+0x18f>
cmp    $0x6,%r15d
jl     12f8 <toml_rtos+0x198>
movslq %r15d,%rax
lea    (%rax,%rbx,1),%r15
add    $0xfffffffffffffffd,%r15
lea    0xd94(%rip),%rsi
mov    %r15,%rdi
call   1070 <strcmp@plt>
test   %rax,%rax
jne    12f8 <toml_rtos+0x198>
lea    0x3(%rbx),%rdi
mov    (%rdi),%al
cmp    $0xd,%al
je     12d0 <toml_rtos+0x170>
cmp    $0xa,%al
jne    12dc <toml_rtos+0x17c>
add    $0x4,%rbx
mov    %rbx,%rdi
jmp    12dc <toml_rtos+0x17c>
cmp    $0x6,%r15d
jl     12f8 <toml_rtos+0x198>
movslq %r15d,%rax
lea    (%rax,%rbx,1),%r15
add    $0xfffffffffffffffd,%r15
lea    0xd5c(%rip),%rsi
mov    %r15,%rdi
call   1070 <strcmp@plt>
test   %rax,%rax
jne    12f8 <toml_rtos+0x198>
lea    0x3(%rbx),%rdi
mov    (%rdi),%al
cmp    $0xd,%al
je     1305 <toml_rtos+0x1a5>
cmp    $0xa,%al
jne    1230 <toml_rtos+0xd0>
add    $0x4,%rbx
jmp    122d <toml_rtos+0xcd>
lea    0x5(%rbx),%rax
cmpb   $0xa,0x4(%rbx)
cmove  %rax,%rdi
sub    %edi,%r15d
mov    %r15d,%esi
call   1060 <strndup@plt>
mov    %rax,%rdi
call   1080 <kill_line_ending_backslash@plt>
mov    %rax,(%r14)
cmp    $0x1,%rax
sbb    %ebp,%ebp
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x5(%rbx),%rax
cmpb   $0xa,0x4(%rbx)
cmove  %rax,%rdi
jmp    1230 <toml_rtos+0xd0>

LLVM IR (-O0):
@.str = [4 x i8] c"'''\00"
@.str.1 = [4 x i8] c"\22\22\22\00"
define i32 @toml_rtos(i8* %0, i8** %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8**
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca [1 x i8]
store i8* %0, i8** %4
store i8** %1, i8*** %5
%14 = load i8*, i8** %4
%15 = icmp ne i8* %14, null
br i1 %15, label %17, label %16
16: ; preds = %2
store i32 -1, i32* %3
br label %203
17: ; preds = %2
%18 = load i8*, i8** %4
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp ne i32 %20, 39
br i1 %21, label %22, label %28
22: ; preds = %17
%23 = load i8*, i8** %4
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp ne i32 %25, 34
br i1 %26, label %27, label %28
27: ; preds = %22
store i32 -1, i32* %3
br label %203
28: ; preds = %22, %17
%29 = load i8**, i8*** %5
store i8* null, i8** %29
%30 = load i8*, i8** %4
%31 = call i32 @strlen(i8* %30)
store i32 %31, i32* %6
%32 = load i8*, i8** %4
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 39
br i1 %35, label %36, label %124
36: ; preds = %28
%37 = load i8*, i8** %4
%38 = call i64 @strncmp(i8* %37, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 3)
%39 = icmp eq i64 0, %38
br i1 %39, label %40, label %91
40: ; preds = %36
%41 = load i8*, i8** %4
%42 = getelementptr inbounds i8, i8* %41, i64 3
store i8* %42, i8** %7
%43 = load i8*, i8** %4
%44 = load i32, i32* %6
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %43, i64 %45
%47 = getelementptr inbounds i8, i8* %46, i64 -3
store i8* %47, i8** %8
%48 = load i8*, i8** %7
%49 = load i8*, i8** %8
%50 = icmp ule i8* %48, %49
br i1 %50, label %51, label %55
51: ; preds = %40
%52 = load i8*, i8** %8
%53 = call i64 @strcmp(i8* %52, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
%54 = icmp eq i64 0, %53
br i1 %54, label %56, label %55
55: ; preds = %51, %40
store i32 -1, i32* %3
br label %203
56: ; preds = %51
%57 = load i8*, i8** %7
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 10
br i1 %60, label %61, label %64
61: ; preds = %56
%62 = load i8*, i8** %7
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %7
br label %80
64: ; preds = %56
%65 = load i8*, i8** %7
%66 = getelementptr inbounds i8, i8* %65, i64 0
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = icmp eq i32 %68, 13
br i1 %69, label %70, label %79
70: ; preds = %64
%71 = load i8*, i8** %7
%72 = getelementptr inbounds i8, i8* %71, i64 1
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
%75 = icmp eq i32 %74, 10
br i1 %75, label %76, label %79
76: ; preds = %70
%77 = load i8*, i8** %7
%78 = getelementptr inbounds i8, i8* %77, i64 2
store i8* %78, i8** %7
br label %79
79: ; preds = %76, %70, %64
br label %80
80: ; preds = %79, %61
%81 = load i8*, i8** %7
%82 = load i8*, i8** %8
%83 = load i8*, i8** %7
%84 = ptrtoint i8* %82 to i64
%85 = ptrtoint i8* %83 to i64
%86 = sub i64 %84, %85
%87 = trunc i64 %86 to i32
%88 = call i8* @strndup(i8* %81, i32 %87)
%89 = call i8* @kill_line_ending_backslash(i8* %88)
%90 = load i8**, i8*** %5
store i8* %89, i8** %90
br label %118
91: ; preds = %36
%92 = load i8*, i8** %4
%93 = getelementptr inbounds i8, i8* %92, i64 1
store i8* %93, i8** %9
%94 = load i8*, i8** %4
%95 = load i32, i32* %6
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8, i8* %94, i64 %96
%98 = getelementptr inbounds i8, i8* %97, i64 -1
store i8* %98, i8** %10
%99 = load i8*, i8** %9
%100 = load i8*, i8** %10
%101 = icmp ule i8* %99, %100
br i1 %101, label %102, label %107
102: ; preds = %91
%103 = load i8*, i8** %10
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = icmp eq i32 %105, 39
br i1 %106, label %108, label %107
107: ; preds = %102, %91
store i32 -1, i32* %3
br label %203
108: ; preds = %102
%109 = load i8*, i8** %9
%110 = load i8*, i8** %10
%111 = load i8*, i8** %9
%112 = ptrtoint i8* %110 to i64
%113 = ptrtoint i8* %111 to i64
%114 = sub i64 %112, %113
%115 = trunc i64 %114 to i32
%116 = call i8* @strndup(i8* %109, i32 %115)
%117 = load i8**, i8*** %5
store i8* %116, i8** %117
br label %118
118: ; preds = %108, %80
%119 = load i8**, i8*** %5
%120 = load i8*, i8** %119
%121 = icmp ne i8* %120, null
%122 = zext i1 %121 to i64
%123 = select i1 %121, i32 0, i32 -1
store i32 %123, i32* %3
br label %203
124: ; preds = %28
%125 = load i8*, i8** %4
%126 = call i64 @strncmp(i8* %125, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), i32 3)
%127 = icmp eq i64 0, %126
br i1 %127, label %128, label %169
128: ; preds = %124
%129 = load i8*, i8** %4
%130 = getelementptr inbounds i8, i8* %129, i64 3
store i8* %130, i8** %11
%131 = load i8*, i8** %4
%132 = load i32, i32* %6
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i8, i8* %131, i64 %133
%135 = getelementptr inbounds i8, i8* %134, i64 -3
store i8* %135, i8** %12
%136 = load i8*, i8** %11
%137 = load i8*, i8** %12
%138 = icmp ule i8* %136, %137
br i1 %138, label %139, label %143
139: ; preds = %128
%140 = load i8*, i8** %12
%141 = call i64 @strcmp(i8* %140, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
%142 = icmp eq i64 0, %141
br i1 %142, label %144, label %143
143: ; preds = %139, %128
store i32 -1, i32* %3
br label %203
144: ; preds = %139
%145 = load i8*, i8** %11
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp eq i32 %147, 10
br i1 %148, label %149, label %152
149: ; preds = %144
%150 = load i8*, i8** %11
%151 = getelementptr inbounds i8, i8* %150, i32 1
store i8* %151, i8** %11
br label %168
152: ; preds = %144
%153 = load i8*, i8** %11
%154 = getelementptr inbounds i8, i8* %153, i64 0
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp eq i32 %156, 13
br i1 %157, label %158, label %167
158: ; preds = %152
%159 = load i8*, i8** %11
%160 = getelementptr inbounds i8, i8* %159, i64 1
%161 = load i8, i8* %160
%162 = sext i8 %161 to i32
%163 = icmp eq i32 %162, 10
br i1 %163, label %164, label %167
164: ; preds = %158
%165 = load i8*, i8** %11
%166 = getelementptr inbounds i8, i8* %165, i64 2
store i8* %166, i8** %11
br label %167
167: ; preds = %164, %158, %152
br label %168
168: ; preds = %167, %149
br label %187
169: ; preds = %124
%170 = load i8*, i8** %4
%171 = getelementptr inbounds i8, i8* %170, i64 1
store i8* %171, i8** %11
%172 = load i8*, i8** %4
%173 = load i32, i32* %6
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds i8, i8* %172, i64 %174
%176 = getelementptr inbounds i8, i8* %175, i64 -1
store i8* %176, i8** %12
%177 = load i8*, i8** %11
%178 = load i8*, i8** %12
%179 = icmp ule i8* %177, %178
br i1 %179, label %180, label %185
180: ; preds = %169
%181 = load i8*, i8** %12
%182 = load i8, i8* %181
%183 = sext i8 %182 to i32
%184 = icmp eq i32 %183, 34
br i1 %184, label %186, label %185
185: ; preds = %180, %169
store i32 -1, i32* %3
br label %203
186: ; preds = %180
br label %187
187: ; preds = %186, %168
%188 = load i8*, i8** %11
%189 = load i8*, i8** %12
%190 = load i8*, i8** %11
%191 = ptrtoint i8* %189 to i64
%192 = ptrtoint i8* %190 to i64
%193 = sub i64 %191, %192
%194 = trunc i64 %193 to i32
%195 = getelementptr inbounds [1 x i8], [1 x i8]* %13, i64 0, i64 0
%196 = call i8* @normalize_string(i8* %188, i32 %194, i32 1, i8* %195, i32 1)
%197 = load i8**, i8*** %5
store i8* %196, i8** %197
%198 = load i8**, i8*** %5
%199 = load i8*, i8** %198
%200 = icmp ne i8* %199, null
%201 = zext i1 %200 to i64
%202 = select i1 %200, i32 0, i32 -1
store i32 %202, i32* %3
br label %203
203: ; preds = %187, %185, %143, %118, %107, %55, %27, %16
%204 = load i32, i32* %3
ret i32 %204
}

LLVM IR (-O2):
@.str = [4 x i8] c"'''\00"
@.str.1 = [4 x i8] c"\22\22\22\00"
define i32 @toml_rtos(i8* %0, i8** nocapture %1) {
%3 = alloca [1 x i8]
%4 = icmp eq i8* %0, null
br i1 %4, label %99, label %5
5: ; preds = %2
%6 = load i8, i8* %0
switch i8 %6, label %99 [
i8 39, label %7
i8 34, label %7
]
7: ; preds = %5, %5
store i8* null, i8** %1
%8 = tail call i32 @strlen(i8* %0)
%9 = load i8, i8* %0
%10 = icmp eq i8 %9, 39
br i1 %10, label %11, label %57
11: ; preds = %7
%12 = tail call i64 @strncmp(i8* %0, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 3)
%13 = icmp eq i64 %12, 0
br i1 %13, label %14, label %41
14: ; preds = %11
%15 = getelementptr inbounds i8, i8* %0, i64 3
%16 = sext i32 %8 to i64
%17 = add nsw i64 %16, -3
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = icmp slt i32 %8, 6
br i1 %19, label %99, label %20
20: ; preds = %14
%21 = tail call i64 @strcmp(i8* %18, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
%22 = icmp eq i64 %21, 0
br i1 %22, label %23, label %99
23: ; preds = %20
%24 = load i8, i8* %15
switch i8 %24, label %33 [
i8 10, label %25
i8 13, label %27
]
25: ; preds = %23
%26 = getelementptr inbounds i8, i8* %0, i64 4
br label %33
27: ; preds = %23
%28 = getelementptr inbounds i8, i8* %0, i64 4
%29 = load i8, i8* %28
%30 = icmp eq i8 %29, 10
%31 = getelementptr inbounds i8, i8* %0, i64 5
%32 = select i1 %30, i8* %31, i8* %15
br label %33
33: ; preds = %27, %23, %25
%34 = phi i8* [ %26, %25 ], [ %15, %23 ], [ %32, %27 ]
%35 = ptrtoint i8* %18 to i64
%36 = ptrtoint i8* %34 to i64
%37 = sub i64 %35, %36
%38 = trunc i64 %37 to i32
%39 = tail call i8* @strndup(i8* %34, i32 %38)
%40 = tail call i8* @kill_line_ending_backslash(i8* %39)
br label %53
41: ; preds = %11
%42 = getelementptr inbounds i8, i8* %0, i64 1
%43 = icmp slt i32 %8, 2
br i1 %43, label %99, label %44
44: ; preds = %41
%45 = zext i32 %8 to i64
%46 = add nsw i64 %45, -1
%47 = getelementptr inbounds i8, i8* %0, i64 %46
%48 = load i8, i8* %47
%49 = icmp eq i8 %48, 39
br i1 %49, label %50, label %99
50: ; preds = %44
%51 = add nsw i32 %8, -2
%52 = tail call i8* @strndup(i8* %42, i32 %51)
br label %53
53: ; preds = %50, %33
%54 = phi i8* [ %52, %50 ], [ %40, %33 ]
store i8* %54, i8** %1
%55 = icmp eq i8* %54, null
%56 = sext i1 %55 to i32
br label %99
57: ; preds = %7
%58 = tail call i64 @strncmp(i8* %0, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), i32 3)
%59 = icmp eq i64 %58, 0
br i1 %59, label %60, label %79
60: ; preds = %57
%61 = getelementptr inbounds i8, i8* %0, i64 3
%62 = sext i32 %8 to i64
%63 = add nsw i64 %62, -3
%64 = getelementptr inbounds i8, i8* %0, i64 %63
%65 = icmp slt i32 %8, 6
br i1 %65, label %99, label %66
66: ; preds = %60
%67 = tail call i64 @strcmp(i8* %64, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
%68 = icmp eq i64 %67, 0
br i1 %68, label %69, label %99
69: ; preds = %66
%70 = load i8, i8* %61
switch i8 %70, label %88 [
i8 10, label %71
i8 13, label %73
]
71: ; preds = %69
%72 = getelementptr inbounds i8, i8* %0, i64 4
br label %88
73: ; preds = %69
%74 = getelementptr inbounds i8, i8* %0, i64 4
%75 = load i8, i8* %74
%76 = icmp eq i8 %75, 10
%77 = getelementptr inbounds i8, i8* %0, i64 5
%78 = select i1 %76, i8* %77, i8* %61
br label %88
79: ; preds = %57
%80 = sext i32 %8 to i64
%81 = add nsw i64 %80, -1
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = icmp slt i32 %8, 2
br i1 %83, label %99, label %84
84: ; preds = %79
%85 = getelementptr inbounds i8, i8* %0, i64 1
%86 = load i8, i8* %82
%87 = icmp eq i8 %86, 34
br i1 %87, label %88, label %99
88: ; preds = %73, %69, %84, %71
%89 = phi i8* [ %72, %71 ], [ %85, %84 ], [ %61, %69 ], [ %78, %73 ]
%90 = phi i8* [ %64, %71 ], [ %82, %84 ], [ %64, %69 ], [ %64, %73 ]
%91 = getelementptr inbounds [1 x i8], [1 x i8]* %3, i64 0, i64 0
%92 = ptrtoint i8* %90 to i64
%93 = ptrtoint i8* %89 to i64
%94 = sub i64 %92, %93
%95 = trunc i64 %94 to i32
%96 = call i8* @normalize_string(i8* %89, i32 %95, i32 1, i8* %91, i32 1)
store i8* %96, i8** %1
%97 = icmp eq i8* %96, null
%98 = sext i1 %97 to i32
br label %99
99: ; preds = %53, %14, %20, %41, %44, %79, %84, %60, %66, %88, %5, %2
%100 = phi i32 [ -1, %2 ], [ -1, %5 ], [ %56, %53 ], [ -1, %14 ], [ -1, %20 ], [ -1, %41 ], [ -1, %44 ], [ %98, %88 ], [ -1, %66 ], [ -1, %60 ], [ -1, %84 ], [ -1, %79 ]
ret i32 %100
}