// File: tokuhirom[P]nanouri/t/01_parse.c
// Function: main
int main () {
    const char * scheme;
    size_t scheme_len;
    const char * host;
    size_t host_len;
    int port;
    const char *path_query;
    int path_query_len;

#define TEST(uri, expect_scheme, expect_host, expect_port, expect_path_query) \
    do { \
        note(uri); \
        int ret = nanouri_parse_uri(uri, strlen(uri), &scheme, &scheme_len, &host, &host_len, &port, &path_query, &path_query_len); \
        ok(ret == 0, "retval"); \
        ok(strncmp(expect_scheme, scheme, scheme_len) == 0, "scheme"); \
        ok(strlen(expect_scheme) == scheme_len, "scheme_len"); \
        ok(strncmp(expect_host, host, host_len) == 0, "host"); \
        ok(strlen(expect_host) == host_len, "host_len"); \
        ok(port == expect_port, "port"); \
        ok(strncmp(expect_path_query, path_query, path_query_len) == 0, "path_query"); \
        ok(strlen(expect_path_query) == path_query_len, "path_query"); \
    } while (0)

#define TEST_ERROR(uri, expect_ret) \
    do { \
        note(uri); \
        int ret = nanouri_parse_uri(uri, strlen(uri), &scheme, &scheme_len, &host, &host_len, &port, &path_query, &path_query_len); \
        ok(ret == expect_ret, "retval"); \
    } while (0)

    TEST("http://mixi.jp:9090/foo=?bar=baz", "http", "mixi.jp", 9090, "/foo=?bar=baz");
    TEST("http://d.hatena.ne.jp", "http", "d.hatena.ne.jp", 0, "");
    TEST("http://d.hatena.ne.jp:80", "http", "d.hatena.ne.jp", 80, "");
    TEST("http://d.hatena.ne.jp/", "http", "d.hatena.ne.jp", 0, "/");
    TEST("http://livedoor.com/", "http", "livedoor.com", 0, "/");
    TEST("http://127.0.0.1:9090", "http", "127.0.0.1", 9090, "");
    TEST_ERROR("http", -2);
    TEST_ERROR("http:-", -1);

    done_testing();

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movl $0x0, -0x4(%rbp)
leaq 0xcdb(%rip), %rdi       # 0x2024
callq 0x1270
leaq 0xccf(%rip), %rdi       # 0x2024
movl $0x20, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x40(%rbp)
cmpl $0x0, -0x40(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xca6(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0xc99(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc87(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc71(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0xc68(%rip), %rdi       # 0x2063
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc59(%rip), %rsi       # 0x206b
callq 0x1190
movl $0x7, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc41(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x2382, -0x2c(%rbp)    # imm = 0x2382
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc2f(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0xbd9(%rip), %rdi       # 0x2037
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xc09(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
movl $0xd, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xbe9(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x149c
leaq 0xbe6(%rip), %rdi       # 0x2089
callq 0x1270
leaq 0xbda(%rip), %rdi       # 0x2089
movl $0x15, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x44(%rbp)
cmpl $0x0, -0x44(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xb4c(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0xb3f(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xb2d(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xb17(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0xb3b(%rip), %rdi       # 0x2090
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xaff(%rip), %rsi       # 0x206b
callq 0x1190
movl $0xe, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xae7(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x0, -0x2c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xad8(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0xa6e(%rip), %rdi       # 0x2023
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xab2(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
xorl %eax, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0xa95(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x15f0
leaq 0xaa8(%rip), %rdi       # 0x209f
callq 0x1270
leaq 0xa9c(%rip), %rdi       # 0x209f
movl $0x18, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x48(%rbp)
cmpl $0x0, -0x48(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x9f8(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0x9eb(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x9d9(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x9c3(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x9e7(%rip), %rdi       # 0x2090
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x9ab(%rip), %rsi       # 0x206b
callq 0x1190
movl $0xe, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x993(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x50, -0x2c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x984(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0x91a(%rip), %rdi       # 0x2023
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x95e(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
xorl %eax, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x941(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x1744
leaq 0x96d(%rip), %rdi       # 0x20b8
callq 0x1270
leaq 0x961(%rip), %rdi       # 0x20b8
movl $0x16, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x4c(%rbp)
cmpl $0x0, -0x4c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x8a4(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0x897(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x885(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x86f(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x893(%rip), %rdi       # 0x2090
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x857(%rip), %rsi       # 0x206b
callq 0x1190
movl $0xe, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x83f(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x0, -0x2c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x830(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0x885(%rip), %rdi       # 0x20e2
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x80a(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
movl $0x1, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x7ea(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x189b
leaq 0x82d(%rip), %rdi       # 0x20cf
callq 0x1270
leaq 0x821(%rip), %rdi       # 0x20cf
movl $0x14, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x50(%rbp)
cmpl $0x0, -0x50(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x74d(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0x740(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x72e(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x718(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x790(%rip), %rdi       # 0x20e4
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x700(%rip), %rsi       # 0x206b
callq 0x1190
movl $0xc, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x6e8(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x0, -0x2c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x6d9(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0x72e(%rip), %rdi       # 0x20e2
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x6b3(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
movl $0x1, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x693(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x19f2
leaq 0x6f8(%rip), %rdi       # 0x20f1
callq 0x1270
leaq 0x6ec(%rip), %rdi       # 0x20f1
movl $0x15, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x54(%rbp)
cmpl $0x0, -0x54(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x5f6(%rip), %rsi       # 0x2045
callq 0x1190
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq 0x5e9(%rip), %rdi       # 0x204c
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x5d7(%rip), %rsi       # 0x2051
callq 0x1190
movl $0x4, %eax
cmpq -0x18(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x5c1(%rip), %rsi       # 0x2058
callq 0x1190
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x65c(%rip), %rdi       # 0x2107
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x5a9(%rip), %rsi       # 0x206b
callq 0x1190
movl $0x9, %eax
cmpq -0x28(%rbp), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x591(%rip), %rsi       # 0x2070
callq 0x1190
cmpl $0x2382, -0x2c(%rbp)    # imm = 0x2382
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x57f(%rip), %rsi       # 0x2079
callq 0x1190
movq -0x38(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
leaq 0x515(%rip), %rdi       # 0x2023
callq 0x1030
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x559(%rip), %rsi       # 0x207e
callq 0x1190
movslq -0x3c(%rbp), %rcx
xorl %eax, %eax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x53c(%rip), %rsi       # 0x207e
callq 0x1190
jmp 0x1b49
leaq 0x4fc(%rip), %rdi       # 0x204c
callq 0x1270
leaq 0x4f0(%rip), %rdi       # 0x204c
movl $0x4, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x58(%rbp)
cmpl $-0x2, -0x58(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x49f(%rip), %rsi       # 0x2045
callq 0x1190
jmp 0x1bad
leaq 0x55d(%rip), %rdi       # 0x2111
callq 0x1270
leaq 0x551(%rip), %rdi       # 0x2111
movl $0x6, %esi
leaq -0x10(%rbp), %rdx
leaq -0x18(%rbp), %rcx
leaq -0x20(%rbp), %r8
leaq -0x28(%rbp), %r9
leaq -0x2c(%rbp), %r11
leaq -0x38(%rbp), %r10
leaq -0x3c(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x1ca0
movl %eax, -0x5c(%rbp)
cmpl $-0x1, -0x5c(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x43b(%rip), %rsi       # 0x2045
callq 0x1190
callq 0x1310
xorl %eax, %eax
addq $0x80, %rsp
popq %rbp
retq
nop