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

/* Variables and functions */
int pq_str2array(char **array, char *buffer, const int ncols,
                 const char *delim) {
  int coln;
  char *tmp;
  char newline;
  coln = 0;
  tmp = buffer;
  newline = '\n';
  array[coln] = tmp;
  while (*tmp && newline != *tmp) {
    if (*delim == *tmp) {
      *tmp = '\0';
      coln++;
      tmp++;
      if (coln == ncols) {
        return -1;
      }
      array[coln] = tmp;
    } else {
      tmp++;
    }
  }
  *tmp = '\0';
  while (coln < ncols - 1) {
    coln++;
    array[coln] = NULL;
  }
  return 0;
}


x86 assembly (clang, -O0):
<pq_str2array>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
movb   $0xa,-0x39(%rbp)
mov    -0x38(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3a(%rbp)
je     115e <pq_str2array+0x5e>
movsbl -0x39(%rbp),%eax
mov    -0x38(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x3a(%rbp)
mov    -0x3a(%rbp),%al
test   $0x1,%al
jne    116e <pq_str2array+0x6e>
jmp    11de <pq_str2array+0xde>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
mov    -0x38(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    11cd <pq_str2array+0xcd>
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jne    11b8 <pq_str2array+0xb8>
movl   $0xffffffff,-0x4(%rbp)
jmp    121b <pq_str2array+0x11b>
mov    -0x38(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    11d9 <pq_str2array+0xd9>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1136 <pq_str2array+0x36>
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1214 <pq_str2array+0x114>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    11e5 <pq_str2array+0xe5>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pq_str2array>:
push   %rbx
mov    %rsi,(%rdi)
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rsi
movzbl -0x1(%rsi),%ebx
test   %bl,%bl
je     1148 <pq_str2array+0x38>
cmp    $0xa,%bl
je     1148 <pq_str2array+0x38>
cmp    %bl,(%rcx)
jne    1120 <pq_str2array+0x10>
movb   $0x0,-0x1(%rsi)
add    $0x1,%eax
cmp    %edx,%eax
je     1179 <pq_str2array+0x69>
mov    %eax,%ebx
mov    %rsi,(%rdi,%rbx,8)
jmp    1120 <pq_str2array+0x10>
movb   $0x0,-0x1(%rsi)
lea    -0x1(%rdx),%ecx
xor    %ebx,%ebx
cmp    %ecx,%eax
jge    1175 <pq_str2array+0x65>
mov    %eax,%ecx
lea    (%rdi,%rcx,8),%rdi
add    $0x8,%rdi
sub    %eax,%edx
add    $0xfffffffe,%edx
lea    0x8(,%rdx,8),%rdx
xor    %ebx,%ebx
xor    %esi,%esi
call   1030 <memset@plt>
mov    %ebx,%eax
pop    %rbx
ret
mov    $0xffffffff,%ebx
jmp    1175 <pq_str2array+0x65>

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

LLVM IR (-O2):
define i32 @pq_str2array(i8** nocapture writeonly %0, i8* %1, i32 %2, i8* nocapture %3) {
store i8* %1, i8** %0
br label %5
5: ; preds = %18, %4
%6 = phi i32 [ %15, %18 ], [ 0, %4 ]
%7 = phi i8* [ %16, %18 ], [ %1, %4 ]
br label %8
8: ; preds = %5, %21
%9 = phi i8* [ %22, %21 ], [ %7, %5 ]
%10 = load i8, i8* %9
switch i8 %10, label %11 [
i8 0, label %23
i8 10, label %23
]
11: ; preds = %8
%12 = load i8, i8* %3
%13 = icmp eq i8 %12, %10
br i1 %13, label %14, label %21
14: ; preds = %11
store i8 0, i8* %9
%15 = add nuw nsw i32 %6, 1
%16 = getelementptr inbounds i8, i8* %9, i64 1
%17 = icmp eq i32 %15, %2
br i1 %17, label %36, label %18
18: ; preds = %14
%19 = zext i32 %15 to i64
%20 = getelementptr inbounds i8*, i8** %0, i64 %19
store i8* %16, i8** %20
br label %5
21: ; preds = %11
%22 = getelementptr inbounds i8, i8* %9, i64 1
br label %8
23: ; preds = %8, %8
store i8 0, i8* %9
%24 = add nsw i32 %2, -1
%25 = icmp slt i32 %6, %24
br i1 %25, label %26, label %36
26: ; preds = %23
%27 = add nuw i32 %6, 1
%28 = zext i32 %27 to i64
%29 = getelementptr i8*, i8** %0, i64 %28
%30 = bitcast i8** %29 to i8*
%31 = add i32 %2, -2
%32 = sub i32 %31, %6
%33 = zext i32 %32 to i64
%34 = shl nuw nsw i64 %33, 3
%35 = add nuw nsw i64 %34, 8
br label %36
36: ; preds = %14, %26, %23
%37 = phi i32 [ 0, %23 ], [ 0, %26 ], [ -1, %14 ]
ret i32 %37
}