#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 */
char *strchr(char *, char);
int strlen(char *);
char *strrchr(char *, char);
char *trim(char *);
int parse_sql_url(char *_url, char **_user, char **_pass, char **_host,
                  char **_port, char **_db) {
  char *slash, *dcolon, *at, *db_slash;
  *_user = '\0';
  *_pass = '\0';
  *_host = '\0';
  *_port = '\0';
  *_db = '\0';
  _url = trim(_url);
  if (strlen(_url) < 6)
    return -1;
  if (*_url == '\0')
    return -2;
  slash = strchr(_url, '/');
  if (!slash)
    return -3;
  if ((*(++slash)) != '/') {
    return -4;
  }
  slash++;
  at = strchr(slash, '@');
  db_slash = strrchr(slash, '/');
  if (db_slash <= at)
    db_slash = NULL;
  if (db_slash) {
    *db_slash++ = '\0';
    *_db = trim(db_slash);
  }
  if (!at) {
    dcolon = strchr(slash, ':');
    if (dcolon) {
      *dcolon++ = '\0';
      *_port = trim(dcolon);
    }
    *_host = trim(slash);
  } else {
    dcolon = strchr(slash, ':');
    *at++ = '\0';
    if (dcolon) {
      *dcolon++ = '\0';
      if (dcolon < at) {
        *_pass = trim(dcolon);
        dcolon = strchr(at, ':');
        if (dcolon) {
          *dcolon++ = '\0';
          *_port = trim(dcolon);
        }
      } else {
        *_port = trim(dcolon);
      }
    }
    *_host = trim(at);
    *_user = trim(slash);
  }
  return 0;
}


x86 assembly (clang, -O0):
<parse_sql_url>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x28(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x38(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x10(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x6,%eax
jge    11c2 <parse_sql_url+0x82>
movl   $0xffffffff,-0x4(%rbp)
jmp    13f8 <parse_sql_url+0x2b8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11de <parse_sql_url+0x9e>
movl   $0xfffffffe,-0x4(%rbp)
jmp    13f8 <parse_sql_url+0x2b8>
mov    -0x10(%rbp),%rdi
mov    $0x2f,%esi
call   1040 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    1207 <parse_sql_url+0xc7>
movl   $0xfffffffd,-0x4(%rbp)
jmp    13f8 <parse_sql_url+0x2b8>
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x40(%rbp)
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
je     122f <parse_sql_url+0xef>
movl   $0xfffffffc,-0x4(%rbp)
jmp    13f8 <parse_sql_url+0x2b8>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rdi
mov    $0x40,%esi
call   1040 <strchr@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
mov    $0x2f,%esi
call   1050 <strrchr@plt>
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     1275 <parse_sql_url+0x135>
movq   $0x0,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
je     12a5 <parse_sql_url+0x165>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
movb   $0x0,(%rax)
mov    -0x58(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x38(%rbp),%rax
mov    %rcx,(%rax)
cmpq   $0x0,-0x50(%rbp)
jne    130a <parse_sql_url+0x1ca>
mov    -0x40(%rbp),%rdi
mov    $0x3a,%esi
call   1040 <strchr@plt>
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
je     12f2 <parse_sql_url+0x1b2>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x0,(%rax)
mov    -0x48(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x40(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
jmp    13f1 <parse_sql_url+0x2b1>
mov    -0x40(%rbp),%rdi
mov    $0x3a,%esi
call   1040 <strchr@plt>
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x50(%rbp)
movb   $0x0,(%rax)
cmpq   $0x0,-0x48(%rbp)
je     13cb <parse_sql_url+0x28b>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x0,(%rax)
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
jae    13b3 <parse_sql_url+0x273>
mov    -0x48(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x50(%rbp),%rdi
mov    $0x3a,%esi
call   1040 <strchr@plt>
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
je     13ae <parse_sql_url+0x26e>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x0,(%rax)
mov    -0x48(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
jmp    13c6 <parse_sql_url+0x286>
mov    -0x48(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
jmp    13cb <parse_sql_url+0x28b>
mov    -0x50(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x40(%rbp),%rdi
call   1060 <trim@plt>
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_sql_url>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9,%rbp
mov    %r8,%r14
mov    %rcx,%r13
mov    %rdx,%r12
mov    %rsi,%r15
movq   $0x0,(%rsi)
movq   $0x0,(%rdx)
movq   $0x0,(%rcx)
movq   $0x0,(%r8)
movq   $0x0,(%r9)
call   1060 <trim@plt>
mov    %rax,%rbx
mov    %rax,%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    $0xffffffff,%eax
cmp    $0x6,%ecx
jl     12cc <parse_sql_url+0x18c>
cmpb   $0x0,(%rbx)
je     1289 <parse_sql_url+0x149>
mov    %rbx,%rdi
mov    $0x2f,%esi
call   1040 <strchr@plt>
test   %rax,%rax
je     1290 <parse_sql_url+0x150>
mov    %rax,%rbx
mov    $0xfffffffc,%eax
cmpb   $0x2f,0x1(%rbx)
jne    12cc <parse_sql_url+0x18c>
add    $0x2,%rbx
mov    %rbx,%rdi
mov    $0x40,%esi
call   1040 <strchr@plt>
mov    %rbx,%rdi
mov    %rax,%rbx
mov    %rdi,0x10(%rsp)
mov    $0x2f,%esi
call   1050 <strrchr@plt>
mov    %rbx,0x8(%rsp)
cmp    %rbx,%rax
jbe    1214 <parse_sql_url+0xd4>
mov    %rax,%rdi
add    $0x1,%rdi
movb   $0x0,(%rax)
call   1060 <trim@plt>
mov    %rax,0x0(%rbp)
mov    0x10(%rsp),%rbx
mov    %rbx,%rdi
mov    $0x3a,%esi
call   1040 <strchr@plt>
mov    %rax,%rbp
mov    0x8(%rsp),%rax
test   %rax,%rax
je     1297 <parse_sql_url+0x157>
lea    0x1(%rax),%rdi
movb   $0x0,(%rax)
test   %rbp,%rbp
je     1284 <parse_sql_url+0x144>
mov    %rdi,(%rsp)
lea    0x1(%rbp),%rdi
movb   $0x0,0x0(%rbp)
call   1060 <trim@plt>
cmp    0x8(%rsp),%rbp
jae    127d <parse_sql_url+0x13d>
mov    %rax,(%r12)
mov    (%rsp),%rdi
mov    $0x3a,%esi
call   1040 <strchr@plt>
test   %rax,%rax
je     12ac <parse_sql_url+0x16c>
mov    %rax,%rdi
add    $0x1,%rdi
movb   $0x0,(%rax)
call   1060 <trim@plt>
mov    (%rsp),%rdi
mov    %rax,(%r14)
mov    %r13,%r14
jmp    12b3 <parse_sql_url+0x173>
mov    $0xfffffffe,%eax
jmp    12cc <parse_sql_url+0x18c>
mov    $0xfffffffd,%eax
jmp    12cc <parse_sql_url+0x18c>
test   %rbp,%rbp
je     12be <parse_sql_url+0x17e>
mov    %rbp,%rdi
add    $0x1,%rdi
movb   $0x0,0x0(%rbp)
mov    %r13,%r15
jmp    12b3 <parse_sql_url+0x173>
mov    %r13,%r14
mov    (%rsp),%rdi
call   1060 <trim@plt>
mov    %rax,(%r14)
mov    %r15,%r13
mov    %rbx,%rdi
call   1060 <trim@plt>
mov    %rax,0x0(%r13)
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @parse_sql_url(i8* %0, i8** nocapture writeonly %1, i8** nocapture writeonly %2, i8** nocapture writeonly %3, i8** nocapture writeonly %4, i8** nocapture writeonly %5) {
store i8* null, i8** %1
store i8* null, i8** %2
store i8* null, i8** %3
store i8* null, i8** %4
store i8* null, i8** %5
%7 = tail call i8* @trim(i8* %0)
%8 = tail call i32 @strlen(i8* %7)
%9 = icmp slt i32 %8, 6
br i1 %9, label %58, label %10
10: ; preds = %6
%11 = load i8, i8* %7
%12 = icmp eq i8 %11, 0
br i1 %12, label %58, label %13
13: ; preds = %10
%14 = tail call i8* @strchr(i8* %7, i8 signext 47)
%15 = icmp eq i8* %14, null
br i1 %15, label %58, label %16
16: ; preds = %13
%17 = getelementptr inbounds i8, i8* %14, i64 1
%18 = load i8, i8* %17
%19 = icmp eq i8 %18, 47
br i1 %19, label %20, label %58
20: ; preds = %16
%21 = getelementptr inbounds i8, i8* %14, i64 2
%22 = tail call i8* @strchr(i8* %21, i8 signext 64)
%23 = tail call i8* @strrchr(i8* %21, i8 signext 47)
%24 = icmp ugt i8* %23, %22
br i1 %24, label %25, label %28
25: ; preds = %20
%26 = getelementptr inbounds i8, i8* %23, i64 1
store i8 0, i8* %23
%27 = tail call i8* @trim(i8* %26)
store i8* %27, i8** %5
br label %28
28: ; preds = %25, %20
%29 = icmp eq i8* %22, null
%30 = tail call i8* @strchr(i8* %21, i8 signext 58)
br i1 %29, label %31, label %35
31: ; preds = %28
%32 = icmp eq i8* %30, null
br i1 %32, label %55, label %33
33: ; preds = %31
%34 = getelementptr inbounds i8, i8* %30, i64 1
store i8 0, i8* %30
br label %50
35: ; preds = %28
%36 = getelementptr inbounds i8, i8* %22, i64 1
store i8 0, i8* %22
%37 = icmp eq i8* %30, null
br i1 %37, label %50, label %38
38: ; preds = %35
%39 = getelementptr inbounds i8, i8* %30, i64 1
store i8 0, i8* %30
%40 = icmp ult i8* %30, %22
%41 = tail call i8* @trim(i8* %39)
br i1 %40, label %42, label %48
42: ; preds = %38
store i8* %41, i8** %2
%43 = tail call i8* @strchr(i8* %36, i8 signext 58)
%44 = icmp eq i8* %43, null
br i1 %44, label %50, label %45
45: ; preds = %42
%46 = getelementptr inbounds i8, i8* %43, i64 1
store i8 0, i8* %43
%47 = tail call i8* @trim(i8* %46)
br label %48
48: ; preds = %38, %45
%49 = phi i8* [ %47, %45 ], [ %41, %38 ]
store i8* %49, i8** %4
br label %50
50: ; preds = %35, %42, %48, %33
%51 = phi i8* [ %34, %33 ], [ %36, %48 ], [ %36, %42 ], [ %36, %35 ]
%52 = phi i8** [ %4, %33 ], [ %3, %48 ], [ %3, %42 ], [ %3, %35 ]
%53 = phi i8** [ %3, %33 ], [ %1, %48 ], [ %1, %42 ], [ %1, %35 ]
%54 = tail call i8* @trim(i8* %51)
store i8* %54, i8** %52
br label %55
55: ; preds = %50, %31
%56 = phi i8** [ %3, %31 ], [ %53, %50 ]
%57 = tail call i8* @trim(i8* %21)
store i8* %57, i8** %56
br label %58
58: ; preds = %55, %16, %13, %10, %6
%59 = phi i32 [ -1, %6 ], [ -2, %10 ], [ -3, %13 ], [ -4, %16 ], [ 0, %55 ]
ret i32 %59
}