#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 uria_parse_host_port(const char *base, const char **hostb, size_t *hostl,
                         int *port, const char **newb) {
  size_t i;
  const char *hostb__, *portb__, *newb__;
  size_t hostl__;
  int port__;
  i = 0;
  if (base[0] == '[') {
    for (;; i++) {
      if (base[i] == ']') {
        i++;
        break;
      }
      if (!base[i]) {
        return -1;
      }
    }
  }
  for (;; i++) {
    if (base[i] == '/' || base[i] == '?' || base[i] == '#' || base[i] == ':' ||
        base[i] == '\0') {
      if (i > 0) {
        hostb__ = base;
        hostl__ = i;
        portb__ = hostb__ + hostl__;
        newb__ = hostb__ + hostl__;
        break;
      } else {
        return -1;
      }
    }
  }
  if (hostb__[0] == '[') {
    if (hostb__[hostl__ - 1] != ']' || hostl__ < 3) {
      return -1;
    } else {
      ++hostb__;
      hostl__ -= 2;
    }
  }
  port__ = 0;
  if (portb__[0] == ':') {
    for (i = 1; portb__[i] >= '0' && portb__[i] <= '9'; i++) {
      port__ = 10 * port__ - '0' + portb__[i];
    }
    newb__ += i;
  }
  *port = port__;
  *hostb = hostb__;
  *hostl = hostl__;
  *newb = newb__;
  return 0;
}


x86 assembly (clang, -O0):
<uria_parse_host_port>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
jne    1194 <uria_parse_host_port+0x94>
jmp    1135 <uria_parse_host_port+0x35>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
jne    115b <uria_parse_host_port+0x5b>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    118f <uria_parse_host_port+0x8f>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1179 <uria_parse_host_port+0x79>
movl   $0xffffffff,-0x4(%rbp)
jmp    137d <uria_parse_host_port+0x27d>
jmp    117e <uria_parse_host_port+0x7e>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1135 <uria_parse_host_port+0x35>
jmp    1194 <uria_parse_host_port+0x94>
jmp    1199 <uria_parse_host_port+0x99>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
je     1202 <uria_parse_host_port+0x102>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3f,%eax
je     1202 <uria_parse_host_port+0x102>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x23,%eax
je     1202 <uria_parse_host_port+0x102>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3a,%eax
je     1202 <uria_parse_host_port+0x102>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    1246 <uria_parse_host_port+0x146>
cmpq   $0x0,-0x38(%rbp)
jbe    123a <uria_parse_host_port+0x13a>
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x40(%rbp),%rax
add    -0x58(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
add    -0x58(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    125c <uria_parse_host_port+0x15c>
movl   $0xffffffff,-0x4(%rbp)
jmp    137d <uria_parse_host_port+0x27d>
jmp    124b <uria_parse_host_port+0x14b>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1199 <uria_parse_host_port+0x99>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
jne    12b9 <uria_parse_host_port+0x1b9>
mov    -0x40(%rbp),%rax
mov    -0x58(%rbp),%rcx
sub    $0x1,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
jne    1290 <uria_parse_host_port+0x190>
cmpq   $0x3,-0x58(%rbp)
jae    129c <uria_parse_host_port+0x19c>
movl   $0xffffffff,-0x4(%rbp)
jmp    137d <uria_parse_host_port+0x27d>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x58(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x58(%rbp)
jmp    12b9 <uria_parse_host_port+0x1b9>
movl   $0x0,-0x5c(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
jne    134c <uria_parse_host_port+0x24c>
movq   $0x1,-0x38(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x5d(%rbp)
jl     1307 <uria_parse_host_port+0x207>
mov    -0x48(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x5d(%rbp)
mov    -0x5d(%rbp),%al
test   $0x1,%al
jne    1317 <uria_parse_host_port+0x217>
jmp    1340 <uria_parse_host_port+0x240>
imul   $0xa,-0x5c(%rbp),%eax
sub    $0x30,%eax
mov    -0x48(%rbp),%rcx
mov    -0x38(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    12d8 <uria_parse_host_port+0x1d8>
mov    -0x38(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x5c(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x40(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x58(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x50(%rbp),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<uria_parse_host_port>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    (%rdi),%bpl
cmp    $0x5b,%bpl
jne    113b <uria_parse_host_port+0x3b>
mov    $0x1,%r9d
mov    $0x5b,%al
test   %al,%al
je     1131 <uria_parse_host_port+0x31>
nopl   0x0(%rax,%rax,1)
cmp    $0x5d,%al
je     113e <uria_parse_host_port+0x3e>
movzbl (%rdi,%r9,1),%eax
add    $0x1,%r9
test   %al,%al
jne    1120 <uria_parse_host_port+0x20>
mov    $0xffffffff,%eax
jmp    11fe <uria_parse_host_port+0xfe>
xor    %r9d,%r9d
movabs $0x8400800800000001,%rax
jmp    1154 <uria_parse_host_port+0x54>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r9
movzbl (%rdi,%r9,1),%ebx
cmp    $0x3f,%rbx
ja     1150 <uria_parse_host_port+0x50>
bt     %rbx,%rax
jae    1150 <uria_parse_host_port+0x50>
mov    $0xffffffff,%eax
test   %r9,%r9
je     11fe <uria_parse_host_port+0xfe>
mov    %rdi,%r10
mov    %r9,%r11
cmp    $0x5b,%bpl
jne    1195 <uria_parse_host_port+0x95>
cmpb   $0x5d,-0x1(%r9,%rdi,1)
jne    11fe <uria_parse_host_port+0xfe>
cmp    $0x3,%r9
jb     11fe <uria_parse_host_port+0xfe>
lea    0x1(%rdi),%r10
lea    -0x2(%r9),%r11
lea    (%rdi,%r9,1),%r14
xor    %eax,%eax
cmp    $0x3a,%bl
jne    11e2 <uria_parse_host_port+0xe2>
mov    0x1(%r14),%bpl
lea    -0x30(%rbp),%ebx
cmp    $0x9,%bl
ja     11e7 <uria_parse_host_port+0xe7>
add    %rdi,%r9
add    $0x2,%r9
mov    $0x1,%ebx
xor    %r15d,%r15d
nopl   0x0(%rax,%rax,1)
movzbl %bpl,%ebp
lea    (%r15,%r15,4),%edi
lea    -0x30(%rbp,%rdi,2),%r15d
movzbl -0x1(%r9,%rbx,1),%ebp
add    $0x1,%rbx
lea    -0x30(%rbp),%edi
cmp    $0xa,%dil
jb     11c0 <uria_parse_host_port+0xc0>
jmp    11ef <uria_parse_host_port+0xef>
xor    %r15d,%r15d
jmp    11f2 <uria_parse_host_port+0xf2>
xor    %r15d,%r15d
mov    $0x1,%ebx
add    %rbx,%r14
mov    %r15d,(%rcx)
mov    %r10,(%rsi)
mov    %r11,(%rdx)
mov    %r14,(%r8)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @uria_parse_host_port(i8* %0, i8** %1, i64* %2, i32* %3, i8** %4) {
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8**
%9 = alloca i64*
%10 = alloca i32*
%11 = alloca i8**
%12 = alloca i64
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i64
%17 = alloca i32
store i8* %0, i8** %7
store i8** %1, i8*** %8
store i64* %2, i64** %9
store i32* %3, i32** %10
store i8** %4, i8*** %11
store i64 0, i64* %12
%18 = load i8*, i8** %7
%19 = getelementptr inbounds i8, i8* %18, i64 0
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
%22 = icmp eq i32 %21, 91
br i1 %22, label %23, label %46
23: ; preds = %5
br label %24
24: ; preds = %42, %23
%25 = load i8*, i8** %7
%26 = load i64, i64* %12
%27 = getelementptr inbounds i8, i8* %25, i64 %26
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 93
br i1 %30, label %31, label %34
31: ; preds = %24
%32 = load i64, i64* %12
%33 = add i64 %32, 1
store i64 %33, i64* %12
br label %45
34: ; preds = %24
%35 = load i8*, i8** %7
%36 = load i64, i64* %12
%37 = getelementptr inbounds i8, i8* %35, i64 %36
%38 = load i8, i8* %37
%39 = icmp ne i8 %38, 0
br i1 %39, label %41, label %40
40: ; preds = %34
store i32 -1, i32* %6
br label %172
41: ; preds = %34
br label %42
42: ; preds = %41
%43 = load i64, i64* %12
%44 = add i64 %43, 1
store i64 %44, i64* %12
br label %24
45: ; preds = %31
br label %46
46: ; preds = %45, %5
br label %47
47: ; preds = %96, %46
%48 = load i8*, i8** %7
%49 = load i64, i64* %12
%50 = getelementptr inbounds i8, i8* %48, i64 %49
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp eq i32 %52, 47
br i1 %53, label %82, label %54
54: ; preds = %47
%55 = load i8*, i8** %7
%56 = load i64, i64* %12
%57 = getelementptr inbounds i8, i8* %55, i64 %56
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 63
br i1 %60, label %82, label %61
61: ; preds = %54
%62 = load i8*, i8** %7
%63 = load i64, i64* %12
%64 = getelementptr inbounds i8, i8* %62, i64 %63
%65 = load i8, i8* %64
%66 = sext i8 %65 to i32
%67 = icmp eq i32 %66, 35
br i1 %67, label %82, label %68
68: ; preds = %61
%69 = load i8*, i8** %7
%70 = load i64, i64* %12
%71 = getelementptr inbounds i8, i8* %69, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 58
br i1 %74, label %82, label %75
75: ; preds = %68
%76 = load i8*, i8** %7
%77 = load i64, i64* %12
%78 = getelementptr inbounds i8, i8* %76, i64 %77
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %80, 0
br i1 %81, label %82, label %95
82: ; preds = %75, %68, %61, %54, %47
%83 = load i64, i64* %12
%84 = icmp ugt i64 %83, 0
br i1 %84, label %85, label %94
85: ; preds = %82
%86 = load i8*, i8** %7
store i8* %86, i8** %13
%87 = load i64, i64* %12
store i64 %87, i64* %16
%88 = load i8*, i8** %13
%89 = load i64, i64* %16
%90 = getelementptr inbounds i8, i8* %88, i64 %89
store i8* %90, i8** %14
%91 = load i8*, i8** %13
%92 = load i64, i64* %16
%93 = getelementptr inbounds i8, i8* %91, i64 %92
store i8* %93, i8** %15
br label %99
94: ; preds = %82
store i32 -1, i32* %6
br label %172
95: ; preds = %75
br label %96
96: ; preds = %95
%97 = load i64, i64* %12
%98 = add i64 %97, 1
store i64 %98, i64* %12
br label %47
99: ; preds = %85
%100 = load i8*, i8** %13
%101 = getelementptr inbounds i8, i8* %100, i64 0
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp eq i32 %103, 91
br i1 %104, label %105, label %123
105: ; preds = %99
%106 = load i8*, i8** %13
%107 = load i64, i64* %16
%108 = sub i64 %107, 1
%109 = getelementptr inbounds i8, i8* %106, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp ne i32 %111, 93
br i1 %112, label %116, label %113
113: ; preds = %105
%114 = load i64, i64* %16
%115 = icmp ult i64 %114, 3
br i1 %115, label %116, label %117
116: ; preds = %113, %105
store i32 -1, i32* %6
br label %172
117: ; preds = %113
%118 = load i8*, i8** %13
%119 = getelementptr inbounds i8, i8* %118, i32 1
store i8* %119, i8** %13
%120 = load i64, i64* %16
%121 = sub i64 %120, 2
store i64 %121, i64* %16
br label %122
122: ; preds = %117
br label %123
123: ; preds = %122, %99
store i32 0, i32* %17
%124 = load i8*, i8** %14
%125 = getelementptr inbounds i8, i8* %124, i64 0
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp eq i32 %127, 58
br i1 %128, label %129, label %163
129: ; preds = %123
store i64 1, i64* %12
br label %130
130: ; preds = %156, %129
%131 = load i8*, i8** %14
%132 = load i64, i64* %12
%133 = getelementptr inbounds i8, i8* %131, i64 %132
%134 = load i8, i8* %133
%135 = sext i8 %134 to i32
%136 = icmp sge i32 %135, 48
br i1 %136, label %137, label %144
137: ; preds = %130
%138 = load i8*, i8** %14
%139 = load i64, i64* %12
%140 = getelementptr inbounds i8, i8* %138, i64 %139
%141 = load i8, i8* %140
%142 = sext i8 %141 to i32
%143 = icmp sle i32 %142, 57
br label %144
144: ; preds = %137, %130
%145 = phi i1 [ false, %130 ], [ %143, %137 ]
br i1 %145, label %146, label %159
146: ; preds = %144
%147 = load i32, i32* %17
%148 = mul nsw i32 10, %147
%149 = sub nsw i32 %148, 48
%150 = load i8*, i8** %14
%151 = load i64, i64* %12
%152 = getelementptr inbounds i8, i8* %150, i64 %151
%153 = load i8, i8* %152
%154 = sext i8 %153 to i32
%155 = add nsw i32 %149, %154
store i32 %155, i32* %17
br label %156
156: ; preds = %146
%157 = load i64, i64* %12
%158 = add i64 %157, 1
store i64 %158, i64* %12
br label %130
159: ; preds = %144
%160 = load i64, i64* %12
%161 = load i8*, i8** %15
%162 = getelementptr inbounds i8, i8* %161, i64 %160
store i8* %162, i8** %15
br label %163
163: ; preds = %159, %123
%164 = load i32, i32* %17
%165 = load i32*, i32** %10
store i32 %164, i32* %165
%166 = load i8*, i8** %13
%167 = load i8**, i8*** %8
store i8* %166, i8** %167
%168 = load i64, i64* %16
%169 = load i64*, i64** %9
store i64 %168, i64* %169
%170 = load i8*, i8** %15
%171 = load i8**, i8*** %11
store i8* %170, i8** %171
store i32 0, i32* %6
br label %172
172: ; preds = %163, %116, %94, %40
%173 = load i32, i32* %6
ret i32 %173
}

LLVM IR (-O2):
define i32 @uria_parse_host_port(i8* %0, i8** nocapture writeonly %1, i64* nocapture writeonly %2, i32* nocapture writeonly %3, i8** nocapture writeonly %4) {
%6 = load i8, i8* %0
%7 = icmp eq i8 %6, 91
br i1 %7, label %10, label %8
8: ; preds = %10, %5
%9 = phi i64 [ 0, %5 ], [ %12, %10 ]
br label %17
10: ; preds = %5, %13
%11 = phi i8 [ %15, %13 ], [ 91, %5 ]
%12 = phi i64 [ %16, %13 ], [ 1, %5 ]
switch i8 %11, label %13 [
i8 93, label %8
i8 0, label %66
]
13: ; preds = %10
%14 = getelementptr inbounds i8, i8* %0, i64 %12
%15 = load i8, i8* %14
%16 = add i64 %12, 1
br label %10
17: ; preds = %8, %25
%18 = phi i64 [ %26, %25 ], [ %9, %8 ]
%19 = getelementptr inbounds i8, i8* %0, i64 %18
%20 = load i8, i8* %19
switch i8 %20, label %25 [
i8 47, label %21
i8 63, label %21
i8 35, label %21
i8 58, label %21
i8 0, label %21
]
21: ; preds = %17, %17, %17, %17, %17
%22 = getelementptr inbounds i8, i8* %0, i64 %18
%23 = icmp eq i64 %18, 0
br i1 %23, label %66, label %24
24: ; preds = %21
br i1 %7, label %27, label %37
25: ; preds = %17
%26 = add i64 %18, 1
br label %17
27: ; preds = %24
%28 = add i64 %18, -1
%29 = getelementptr inbounds i8, i8* %0, i64 %28
%30 = load i8, i8* %29
%31 = icmp ne i8 %30, 93
%32 = icmp ult i64 %18, 3
%33 = select i1 %31, i1 true, i1 %32
br i1 %33, label %66, label %34
34: ; preds = %27
%35 = getelementptr inbounds i8, i8* %0, i64 1
%36 = add i64 %18, -2
br label %37
37: ; preds = %34, %24
%38 = phi i8* [ %35, %34 ], [ %0, %24 ]
%39 = phi i64 [ %36, %34 ], [ %18, %24 ]
%40 = icmp eq i8 %20, 58
br i1 %40, label %41, label %63
41: ; preds = %37
%42 = getelementptr inbounds i8, i8* %22, i64 1
%43 = load i8, i8* %42
%44 = add i8 %43, -48
%45 = icmp ult i8 %44, 10
br i1 %45, label %46, label %59
46: ; preds = %41, %46
%47 = phi i8 [ %56, %46 ], [ %43, %41 ]
%48 = phi i32 [ %53, %46 ], [ 0, %41 ]
%49 = phi i64 [ %54, %46 ], [ 1, %41 ]
%50 = zext i8 %47 to i32
%51 = mul nsw i32 %48, 10
%52 = add nsw i32 %51, -48
%53 = add nsw i32 %52, %50
%54 = add i64 %49, 1
%55 = getelementptr inbounds i8, i8* %22, i64 %54
%56 = load i8, i8* %55
%57 = add i8 %56, -48
%58 = icmp ult i8 %57, 10
br i1 %58, label %46, label %59
59: ; preds = %46, %41
%60 = phi i64 [ 1, %41 ], [ %54, %46 ]
%61 = phi i32 [ 0, %41 ], [ %53, %46 ]
%62 = getelementptr inbounds i8, i8* %22, i64 %60
br label %63
63: ; preds = %59, %37
%64 = phi i8* [ %22, %37 ], [ %62, %59 ]
%65 = phi i32 [ 0, %37 ], [ %61, %59 ]
store i32 %65, i32* %3
store i8* %38, i8** %1
store i64 %39, i64* %2
store i8* %64, i8** %4
br label %66
66: ; preds = %10, %27, %21, %63
%67 = phi i32 [ 0, %63 ], [ -1, %21 ], [ -1, %27 ], [ -1, %10 ]
ret i32 %67
}