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

/* Variables and functions */
scalar_t__ errno;
int strtoll(char *, char **, int /*<<< orphan*/);
int toml_rtoi(const char *src, int64_t *ret_) {
  if (!src)
    return -1;
  char buf[100];
  char *p = buf;
  char *q = p + sizeof(buf);
  const char *s = src;
  int64_t dummy;
  int64_t *ret = ret_ ? ret_ : &dummy;
  if (*s == '+')
    *p++ = *s++;
  else if (*s == '-')
    *p++ = *s++;
  if ('0' == s[0]) {
    if (s[1])
      return -1;
    return *ret = 0, 0;
  }
  while (*s && p < q) {
    int ch = *s++;
    if (ch == '_')
      ;
    else
      *p++ = ch;
  }
  if (*s || p == q)
    return -1;
  *p = 0;
  char *endp;
  errno = 0;
  *ret = strtoll(buf, &endp, 0);
  return (errno || *endp) ? -1 : 0;
}


x86 assembly (clang, -O0):
<toml_rtoi>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    113a <toml_rtoi+0x2a>
movl   $0xffffffff,-0x4(%rbp)
jmp    13c2 <toml_rtoi+0x2b2>
lea    -0x80(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x88(%rbp),%rax
add    $0x64,%rax
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x98(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     117d <toml_rtoi+0x6d>
mov    -0x18(%rbp),%rax
mov    %rax,-0xc0(%rbp)
jmp    1190 <toml_rtoi+0x80>
lea    -0x9c(%rbp),%rax
mov    %rax,-0xc0(%rbp)
jmp    1190 <toml_rtoi+0x80>
mov    -0xc0(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11e4 <toml_rtoi+0xd4>
mov    -0x98(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x98(%rbp)
mov    (%rax),%cl
mov    -0x88(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x88(%rbp)
mov    %cl,(%rax)
jmp    122a <toml_rtoi+0x11a>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1225 <toml_rtoi+0x115>
mov    -0x98(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x98(%rbp)
mov    (%rax),%cl
mov    -0x88(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x88(%rbp)
mov    %cl,(%rax)
jmp    122a <toml_rtoi+0x11a>
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jne    1277 <toml_rtoi+0x167>
mov    -0x98(%rbp),%rax
cmpb   $0x0,0x1(%rax)
je     125e <toml_rtoi+0x14e>
movl   $0xffffffff,-0x4(%rbp)
jmp    13c2 <toml_rtoi+0x2b2>
mov    -0xa8(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    13c2 <toml_rtoi+0x2b2>
jmp    127c <toml_rtoi+0x16c>
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xc1(%rbp)
je     12ae <toml_rtoi+0x19e>
mov    -0x88(%rbp),%rax
cmp    -0x90(%rbp),%rax
setb   %al
mov    %al,-0xc1(%rbp)
mov    -0xc1(%rbp),%al
test   $0x1,%al
jne    12c1 <toml_rtoi+0x1b1>
jmp    1315 <toml_rtoi+0x205>
mov    -0x98(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x98(%rbp)
movsbl (%rax),%eax
mov    %eax,-0xac(%rbp)
cmpl   $0x5f,-0xac(%rbp)
jne    12f1 <toml_rtoi+0x1e1>
jmp    1310 <toml_rtoi+0x200>
mov    -0xac(%rbp),%eax
mov    %al,%cl
mov    -0x88(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x88(%rbp)
mov    %cl,(%rax)
jmp    127c <toml_rtoi+0x16c>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    133c <toml_rtoi+0x22c>
mov    -0x88(%rbp),%rax
cmp    -0x90(%rbp),%rax
jne    1348 <toml_rtoi+0x238>
movl   $0xffffffff,-0x4(%rbp)
jmp    13c2 <toml_rtoi+0x2b2>
mov    -0x88(%rbp),%rax
movb   $0x0,(%rax)
mov    0x2c87(%rip),%rax
movq   $0x0,(%rax)
lea    -0x80(%rbp),%rdi
lea    -0xb8(%rbp),%rsi
xor    %edx,%edx
call   1030 <strtoll@plt>
mov    %eax,%ecx
mov    -0xa8(%rbp),%rax
mov    %ecx,(%rax)
mov    $0x1,%al
mov    0x2c5a(%rip),%rcx
cmpq   $0x0,(%rcx)
mov    %al,-0xc2(%rbp)
jne    13ac <toml_rtoi+0x29c>
mov    -0xb8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0xc2(%rbp)
mov    -0xc2(%rbp),%dl
xor    %eax,%eax
mov    $0xffffffff,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<toml_rtoi>:
test   %rdi,%rdi
je     1144 <toml_rtoi+0x34>
push   %r14
push   %rbx
sub    $0x78,%rsp
test   %rsi,%rsi
lea    0xc(%rsp),%rbx
cmovne %rsi,%rbx
mov    (%rdi),%al
cmp    $0x2d,%al
je     1132 <toml_rtoi+0x22>
cmp    $0x2b,%al
jne    114a <toml_rtoi+0x3a>
lea    0x11(%rsp),%rcx
mov    %al,0x10(%rsp)
mov    0x1(%rdi),%al
add    $0x1,%rdi
jmp    114f <toml_rtoi+0x3f>
mov    $0xffffffff,%eax
ret
lea    0x10(%rsp),%rcx
lea    0x74(%rsp),%rdx
test   %al,%al
je     1171 <toml_rtoi+0x61>
cmp    $0x30,%al
jne    1175 <toml_rtoi+0x65>
mov    $0xffffffff,%eax
cmpb   $0x0,0x1(%rdi)
jne    11e4 <toml_rtoi+0xd4>
movl   $0x0,(%rbx)
xor    %eax,%eax
jmp    11e4 <toml_rtoi+0xd4>
xor    %esi,%esi
jmp    119e <toml_rtoi+0x8e>
add    $0x1,%rdi
nopl   0x0(%rax)
cmp    $0x5f,%al
je     118a <toml_rtoi+0x7a>
mov    %al,(%rcx)
add    $0x1,%rcx
movzbl (%rdi),%eax
test   %al,%al
setne  %sil
je     119e <toml_rtoi+0x8e>
add    $0x1,%rdi
cmp    %rdx,%rcx
jb     1180 <toml_rtoi+0x70>
mov    $0xffffffff,%eax
test   %sil,%sil
jne    11e4 <toml_rtoi+0xd4>
cmp    %rdx,%rcx
je     11e4 <toml_rtoi+0xd4>
movb   $0x0,(%rcx)
mov    0x2e29(%rip),%r14
movq   $0x0,(%r14)
lea    0x10(%rsp),%rdi
mov    %rsp,%rsi
xor    %edx,%edx
call   1030 <strtoll@plt>
mov    %eax,(%rbx)
mov    $0xffffffff,%eax
cmpq   $0x0,(%r14)
jne    11e4 <toml_rtoi+0xd4>
mov    (%rsp),%rax
xor    %ecx,%ecx
cmp    (%rax),%cl
sbb    %eax,%eax
add    $0x78,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@errno = global i64 0
define i32 @toml_rtoi(i8* %0, i32* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32*
%6 = alloca [100 x i8]
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i32*
%12 = alloca i32
%13 = alloca i8*
store i8* %0, i8** %4
store i32* %1, i32** %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 %117
17: ; preds = %2
%18 = getelementptr inbounds [100 x i8], [100 x i8]* %6, i64 0, i64 0
store i8* %18, i8** %7
%19 = load i8*, i8** %7
%20 = getelementptr inbounds i8, i8* %19, i64 100
store i8* %20, i8** %8
%21 = load i8*, i8** %4
store i8* %21, i8** %9
%22 = load i32*, i32** %5
%23 = icmp ne i32* %22, null
br i1 %23, label %24, label %26
24: ; preds = %17
%25 = load i32*, i32** %5
br label %27
26: ; preds = %17
br label %27
27: ; preds = %26, %24
%28 = phi i32* [ %25, %24 ], [ %10, %26 ]
store i32* %28, i32** %11
%29 = load i8*, i8** %9
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 43
br i1 %32, label %33, label %39
33: ; preds = %27
%34 = load i8*, i8** %9
%35 = getelementptr inbounds i8, i8* %34, i32 1
store i8* %35, i8** %9
%36 = load i8, i8* %34
%37 = load i8*, i8** %7
%38 = getelementptr inbounds i8, i8* %37, i32 1
store i8* %38, i8** %7
store i8 %36, i8* %37
br label %51
39: ; preds = %27
%40 = load i8*, i8** %9
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 45
br i1 %43, label %44, label %50
44: ; preds = %39
%45 = load i8*, i8** %9
%46 = getelementptr inbounds i8, i8* %45, i32 1
store i8* %46, i8** %9
%47 = load i8, i8* %45
%48 = load i8*, i8** %7
%49 = getelementptr inbounds i8, i8* %48, i32 1
store i8* %49, i8** %7
store i8 %47, i8* %48
br label %50
50: ; preds = %44, %39
br label %51
51: ; preds = %50, %33
%52 = load i8*, i8** %9
%53 = getelementptr inbounds i8, i8* %52, i64 0
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp eq i32 48, %55
br i1 %56, label %57, label %65
57: ; preds = %51
%58 = load i8*, i8** %9
%59 = getelementptr inbounds i8, i8* %58, i64 1
%60 = load i8, i8* %59
%61 = icmp ne i8 %60, 0
br i1 %61, label %62, label %63
62: ; preds = %57
store i32 -1, i32* %3
br label %117
63: ; preds = %57
%64 = load i32*, i32** %11
store i32 0, i32* %64
store i32 0, i32* %3
br label %117
65: ; preds = %51
br label %66
66: ; preds = %90, %65
%67 = load i8*, i8** %9
%68 = load i8, i8* %67
%69 = sext i8 %68 to i32
%70 = icmp ne i32 %69, 0
br i1 %70, label %71, label %75
71: ; preds = %66
%72 = load i8*, i8** %7
%73 = load i8*, i8** %8
%74 = icmp ult i8* %72, %73
br label %75
75: ; preds = %71, %66
%76 = phi i1 [ false, %66 ], [ %74, %71 ]
br i1 %76, label %77, label %91
77: ; preds = %75
%78 = load i8*, i8** %9
%79 = getelementptr inbounds i8, i8* %78, i32 1
store i8* %79, i8** %9
%80 = load i8, i8* %78
%81 = sext i8 %80 to i32
store i32 %81, i32* %12
%82 = load i32, i32* %12
%83 = icmp eq i32 %82, 95
br i1 %83, label %84, label %85
84: ; preds = %77
br label %90
85: ; preds = %77
%86 = load i32, i32* %12
%87 = trunc i32 %86 to i8
%88 = load i8*, i8** %7
%89 = getelementptr inbounds i8, i8* %88, i32 1
store i8* %89, i8** %7
store i8 %87, i8* %88
br label %90
90: ; preds = %85, %84
br label %66
91: ; preds = %75
%92 = load i8*, i8** %9
%93 = load i8, i8* %92
%94 = sext i8 %93 to i32
%95 = icmp ne i32 %94, 0
br i1 %95, label %100, label %96
96: ; preds = %91
%97 = load i8*, i8** %7
%98 = load i8*, i8** %8
%99 = icmp eq i8* %97, %98
br i1 %99, label %100, label %101
100: ; preds = %96, %91
store i32 -1, i32* %3
br label %117
101: ; preds = %96
%102 = load i8*, i8** %7
store i8 0, i8* %102
store i64 0, i64* @errno
%103 = getelementptr inbounds [100 x i8], [100 x i8]* %6, i64 0, i64 0
%104 = call i32 @strtoll(i8* %103, i8** %13, i32 0)
%105 = load i32*, i32** %11
store i32 %104, i32* %105
%106 = load i64, i64* @errno
%107 = icmp ne i64 %106, 0
br i1 %107, label %113, label %108
108: ; preds = %101
%109 = load i8*, i8** %13
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp ne i32 %111, 0
br label %113
113: ; preds = %108, %101
%114 = phi i1 [ true, %101 ], [ %112, %108 ]
%115 = zext i1 %114 to i64
%116 = select i1 %114, i32 -1, i32 0
store i32 %116, i32* %3
br label %117
117: ; preds = %113, %100, %63, %62, %16
%118 = load i32, i32* %3
ret i32 %118
}

LLVM IR (-O2):
@errno = global i64 0
define i32 @toml_rtoi(i8* %0, i32* writeonly %1) {
%3 = alloca [100 x i8]
%4 = alloca i32
%5 = alloca i8*
%6 = icmp eq i8* %0, null
br i1 %6, label %60, label %7
7: ; preds = %2
%8 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 0
%9 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 100
%10 = bitcast i32* %4 to i8*
%11 = icmp eq i32* %1, null
%12 = select i1 %11, i32* %4, i32* %1
%13 = load i8, i8* %0
switch i8 %13, label %18 [
i8 43, label %14
i8 45, label %14
]
14: ; preds = %7, %7
%15 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 1
%16 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %13, i8* %8
%17 = load i8, i8* %16
br label %18
18: ; preds = %14, %7
%19 = phi i8 [ %17, %14 ], [ %13, %7 ]
%20 = phi i8* [ %16, %14 ], [ %0, %7 ]
%21 = phi i8* [ %15, %14 ], [ %8, %7 ]
switch i8 %19, label %27 [
i8 48, label %22
i8 0, label %41
]
22: ; preds = %18
%23 = getelementptr inbounds i8, i8* %20, i64 1
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 0
br i1 %25, label %26, label %58
26: ; preds = %22
store i32 0, i32* %12
br label %58
27: ; preds = %18, %35
%28 = phi i8 [ %37, %35 ], [ %19, %18 ]
%29 = phi i8* [ %36, %35 ], [ %21, %18 ]
%30 = phi i8* [ %31, %35 ], [ %20, %18 ]
%31 = getelementptr inbounds i8, i8* %30, i64 1
%32 = icmp eq i8 %28, 95
br i1 %32, label %35, label %33
33: ; preds = %27
%34 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %28, i8* %29
br label %35
35: ; preds = %27, %33
%36 = phi i8* [ %29, %27 ], [ %34, %33 ]
%37 = load i8, i8* %31
%38 = icmp ne i8 %37, 0
%39 = icmp ult i8* %36, %9
%40 = select i1 %38, i1 %39, i1 false
br i1 %40, label %27, label %41
41: ; preds = %35, %18
%42 = phi i8* [ %21, %18 ], [ %36, %35 ]
%43 = phi i1 [ false, %18 ], [ %38, %35 ]
%44 = icmp eq i8* %42, %9
%45 = select i1 %43, i1 true, i1 %44
br i1 %45, label %58, label %46
46: ; preds = %41
store i8 0, i8* %42
%47 = bitcast i8** %5 to i8*
store i64 0, i64* @errno
%48 = call i32 @strtoll(i8* %8, i8** %5, i32 0)
store i32 %48, i32* %12
%49 = load i64, i64* @errno
%50 = icmp eq i64 %49, 0
br i1 %50, label %51, label %56
51: ; preds = %46
%52 = load i8*, i8** %5
%53 = load i8, i8* %52
%54 = icmp ne i8 %53, 0
%55 = sext i1 %54 to i32
br label %56
56: ; preds = %51, %46
%57 = phi i32 [ -1, %46 ], [ %55, %51 ]
br label %58
58: ; preds = %41, %22, %56, %26
%59 = phi i32 [ 0, %26 ], [ %57, %56 ], [ -1, %22 ], [ -1, %41 ]
br label %60
60: ; preds = %2, %58
%61 = phi i32 [ %59, %58 ], [ -1, %2 ]
ret i32 %61
}