#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 */
struct jelio_buf {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ free(char *);
char jelio_buffer_getc(struct jelio_buf *);
char *malloc(size_t);
int i_nstrdup_conv(void *value, int n, void *inbuf) {
  struct jelio_buf *jb = inbuf;
  char **sval = value;
  int i;
  char *p, buf[8];
  size_t len = 0;
  buf[0] = jelio_buffer_getc(jb);
  buf[1] = jelio_buffer_getc(jb);
  buf[2] = jelio_buffer_getc(jb);
  buf[3] = jelio_buffer_getc(jb);
  if (buf[3] != ':') {
    buf[4] = jelio_buffer_getc(jb);
    buf[5] = jelio_buffer_getc(jb);
    buf[6] = jelio_buffer_getc(jb);
    buf[7] = jelio_buffer_getc(jb);
    if (buf[7] != ':')
      return -1;
    buf[7] = 0;
  } else
    buf[3] = 0;
  for (p = buf; *p; p++) {
    len *= 10;
    len += *p - '0';
  }
  *sval = malloc(len + 2);
  if (!*sval)
    return -1;
  for (i = 0; i <= len; i++)
    *(*sval + i) = jelio_buffer_getc(jb);
  if (*(*sval + len) != ',') {
    free(*sval);
    *sval = NULL;
    return -1;
  }
  *(*sval + len) = 0;
  return len;
}


x86 assembly (clang, -O0):
<i_nstrdup_conv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
movq   $0x0,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x48(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x47(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x46(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x45(%rbp)
movsbl -0x45(%rbp),%eax
cmp    $0x3a,%eax
je     11ea <i_nstrdup_conv+0xba>
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x44(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x43(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x42(%rbp)
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,-0x41(%rbp)
movsbl -0x41(%rbp),%eax
cmp    $0x3a,%eax
je     11e1 <i_nstrdup_conv+0xb1>
movl   $0xffffffff,-0x4(%rbp)
jmp    12ef <i_nstrdup_conv+0x1bf>
movb   $0x0,-0x41(%rbp)
jmp    11ee <i_nstrdup_conv+0xbe>
movb   $0x0,-0x45(%rbp)
lea    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmpb   $0x0,(%rax)
je     1231 <i_nstrdup_conv+0x101>
imul   $0xa,-0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cltq
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    11f6 <i_nstrdup_conv+0xc6>
mov    -0x50(%rbp),%rdi
add    $0x2,%rdi
call   1050 <malloc@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
cmpq   $0x0,(%rax)
jne    1262 <i_nstrdup_conv+0x132>
movl   $0xffffffff,-0x4(%rbp)
jmp    12ef <i_nstrdup_conv+0x1bf>
movl   $0x0,-0x34(%rbp)
movslq -0x34(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     129e <i_nstrdup_conv+0x16e>
mov    -0x28(%rbp),%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,%dl
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movslq -0x34(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1269 <i_nstrdup_conv+0x139>
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
mov    -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2c,%eax
je     12d9 <i_nstrdup_conv+0x1a9>
mov    -0x30(%rbp),%rax
mov    (%rax),%rdi
call   1030 <free@plt>
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    12ef <i_nstrdup_conv+0x1bf>
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
mov    -0x50(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x50(%rbp),%rax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<i_nstrdup_conv>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdx,%r15
mov    %rdi,%r14
mov    %rdx,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %eax,%ebx
mov    %al,(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x1(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x2(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x3(%rsp)
cmp    $0x3a,%al
jne    117d <i_nstrdup_conv+0x4d>
lea    0x3(%rsp),%rax
jmp    11bc <i_nstrdup_conv+0x8c>
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x4(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x5(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    %al,0x6(%rsp)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    $0xffffffff,%r12d
cmp    $0x3a,%al
jne    1255 <i_nstrdup_conv+0x125>
lea    0x7(%rsp),%rax
movb   $0x0,(%rax)
test   %bl,%bl
je     11f4 <i_nstrdup_conv+0xc4>
lea    0x1(%rsp),%rax
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
lea    0x0(,%rbp,4),%rcx
add    %rbp,%rcx
movsbq %bl,%rdx
lea    (%rdx,%rcx,2),%rbp
add    $0xffffffffffffffd0,%rbp
movzbl (%rax),%ebx
add    $0x1,%rax
test   %bl,%bl
jne    11d0 <i_nstrdup_conv+0xa0>
jmp    11f6 <i_nstrdup_conv+0xc6>
xor    %ebp,%ebp
lea    0x2(%rbp),%rdi
call   1050 <malloc@plt>
mov    %rax,(%r14)
mov    $0xffffffff,%r12d
test   %rax,%rax
je     1255 <i_nstrdup_conv+0x125>
lea    0x1(%rbp),%r13
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r15,%rdi
call   1040 <jelio_buffer_getc@plt>
mov    (%r14),%rcx
mov    %al,(%rcx,%rbx,1)
add    $0x1,%rbx
cmp    %rbx,%r13
jne    1220 <i_nstrdup_conv+0xf0>
mov    (%r14),%rdi
cmpb   $0x2c,(%rdi,%rbp,1)
jne    1249 <i_nstrdup_conv+0x119>
movb   $0x0,(%rdi,%rbp,1)
mov    %ebp,%r12d
jmp    1255 <i_nstrdup_conv+0x125>
call   1030 <free@plt>
movq   $0x0,(%r14)
mov    %r12d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
%struct.jelio_buf = type { i32 }
define i32 @i_nstrdup_conv(i8* nocapture %0, i32 %1, i8* %2) {
%4 = alloca [8 x i8]
%5 = bitcast i8* %2 to %struct.jelio_buf*
%6 = bitcast i8* %0 to i8**
%7 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 0
%8 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
store i8 %8, i8* %7
%9 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%10 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 1
store i8 %9, i8* %10
%11 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%12 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 2
store i8 %11, i8* %12
%13 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%14 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 3
store i8 %13, i8* %14
%15 = icmp eq i8 %13, 58
br i1 %15, label %26, label %16
16: ; preds = %3
%17 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%18 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 4
store i8 %17, i8* %18
%19 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%20 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 5
store i8 %19, i8* %20
%21 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%22 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 6
store i8 %21, i8* %22
%23 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%24 = getelementptr inbounds [8 x i8], [8 x i8]* %4, i64 0, i64 7
%25 = icmp eq i8 %23, 58
br i1 %25, label %26, label %61
26: ; preds = %3, %16
%27 = phi i8* [ %24, %16 ], [ %14, %3 ]
store i8 0, i8* %27
%28 = icmp eq i8 %8, 0
br i1 %28, label %40, label %29
29: ; preds = %26, %29
%30 = phi i8 [ %38, %29 ], [ %8, %26 ]
%31 = phi i64 [ %36, %29 ], [ 0, %26 ]
%32 = phi i8* [ %37, %29 ], [ %7, %26 ]
%33 = mul i64 %31, 10
%34 = sext i8 %30 to i64
%35 = add i64 %33, -48
%36 = add i64 %35, %34
%37 = getelementptr inbounds i8, i8* %32, i64 1
%38 = load i8, i8* %37
%39 = icmp eq i8 %38, 0
br i1 %39, label %40, label %29
40: ; preds = %29, %26
%41 = phi i64 [ 0, %26 ], [ %36, %29 ]
%42 = add i64 %41, 2
%43 = tail call i8* @malloc(i64 %42)
store i8* %43, i8** %6
%44 = icmp eq i8* %43, null
br i1 %44, label %61, label %45
45: ; preds = %40, %45
%46 = phi i64 [ %50, %45 ], [ 0, %40 ]
%47 = tail call signext i8 @jelio_buffer_getc(%struct.jelio_buf* %5)
%48 = load i8*, i8** %6
%49 = getelementptr inbounds i8, i8* %48, i64 %46
store i8 %47, i8* %49
%50 = add nuw i64 %46, 1
%51 = icmp eq i64 %46, %41
br i1 %51, label %52, label %45
52: ; preds = %45
%53 = load i8*, i8** %6
%54 = getelementptr inbounds i8, i8* %53, i64 %41
%55 = load i8, i8* %54
%56 = icmp eq i8 %55, 44
br i1 %56, label %59, label %57
57: ; preds = %52
%58 = tail call i32 @free(i8* %53)
store i8* null, i8** %6
br label %61
59: ; preds = %52
store i8 0, i8* %54
%60 = trunc i64 %41 to i32
br label %61
61: ; preds = %40, %16, %59, %57
%62 = phi i32 [ -1, %57 ], [ %60, %59 ], [ -1, %16 ], [ -1, %40 ]
ret i32 %62
}