// File: mbourand[P]webserv/srcs/Utils/CGI.cpp
// Function: CGI::find_first_file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, ConfigContext const&)
std::string		CGI::find_first_file(const std::string &, const ConfigContext& config)
{
	struct stat	file_stats;
	size_t		start = 0;
	size_t		end = 0;

	std::string config_root = config.getParam("root").front();
	std::string url_after_root = m_realPath.substr(m_realPath.rfind(config_root) + config_root.size());
	std::string url_until_root = m_realPath.substr(0, m_realPath.rfind(config_root) + config_root.size());
	std::string extension;
	if (url_until_root.empty())
		url_until_root = "/";

	end = url_after_root.find('/', end);

	while (end != std::string::npos)
	{
		if (lstat((url_until_root + url_after_root.substr(start, end)).c_str(), &file_stats) < 0)
			break;
		if (url_after_root.rfind('.') != std::string::npos)
			extension = url_after_root.substr(url_after_root.find('.'));
		if ((!extension.empty() && config.getCGIExtensions().find(extension) != config.getCGIExtensions().end() && S_ISREG(file_stats.st_mode)) || S_ISREG(file_stats.st_mode))
			return (url_after_root.substr(start, end));
		else if (S_ISDIR(file_stats.st_mode))
		{
			if ((end = url_after_root.find('/', end + 1)) == std::string::npos)
				end = url_after_root.length();
		}
		else
			break;
	}
	return ("");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x290, %rsp            # imm = 0x290
movq %rdi, -0x218(%rbp)
movq %rdi, %rax
movq %rax, -0x210(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x208(%rbp)
movq $0x0, -0xb8(%rbp)
movq $0x0, -0xc0(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x200(%rbp)
leaq -0x101(%rbp), %rdi
movq %rdi, -0x1f8(%rbp)
callq 0x9b10
movq -0x1f8(%rbp), %rdx
leaq 0x4a24f(%rip), %rsi     # 0x6a838
leaq -0x100(%rbp), %rdi
callq 0xa780
jmp 0x205f7
movq -0x200(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x4c710
movq %rax, -0x220(%rbp)
jmp 0x20613
movq -0x220(%rbp), %rdi
callq 0x14310
movq %rax, %rsi
leaq -0xe0(%rbp), %rdi
callq 0x92c0
jmp 0x20630
leaq -0x100(%rbp), %rdi
callq 0x9c98
leaq -0x101(%rbp), %rdi
callq 0x9700
movq -0x208(%rbp), %rdi
addq $0xc0, %rdi
movq %rdi, -0x230(%rbp)
leaq -0xe0(%rbp), %rsi
movq %rsi, -0x240(%rbp)
movq $-0x1, %rdx
movq %rdx, -0x228(%rbp)
callq 0x94f0
movq -0x240(%rbp), %rdi
movq %rax, -0x238(%rbp)
callq 0x9480
movq -0x238(%rbp), %rdx
movq -0x230(%rbp), %rsi
movq -0x228(%rbp), %rcx
addq %rax, %rdx
leaq -0x138(%rbp), %rdi
callq 0x96b0
jmp 0x206b7
movq -0x208(%rbp), %rdi
addq $0xc0, %rdi
movq %rdi, -0x248(%rbp)
leaq -0xe0(%rbp), %rsi
movq %rsi, -0x258(%rbp)
movq $-0x1, %rdx
callq 0x94f0
movq -0x258(%rbp), %rdi
movq %rax, -0x250(%rbp)
callq 0x9480
movq -0x250(%rbp), %rcx
movq -0x248(%rbp), %rsi
addq %rax, %rcx
xorl %eax, %eax
movl %eax, %edx
leaq -0x158(%rbp), %rdi
callq 0x96b0
jmp 0x2071c
leaq -0x178(%rbp), %rdi
callq 0x98c0
leaq -0x158(%rbp), %rdi
callq 0x9a50
testb $0x1, %al
jne 0x2073d
jmp 0x207df
leaq 0x4a314(%rip), %rsi     # 0x6aa58
leaq -0x158(%rbp), %rdi
callq 0x98a0
jmp 0x20752
jmp 0x207df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
jmp 0x20789
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
leaq -0x100(%rbp), %rdi
callq 0x9c98
leaq -0x101(%rbp), %rdi
callq 0x9700
jmp 0x20b60
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
jmp 0x20b54
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
jmp 0x20b48
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
jmp 0x20b30
movq -0xc0(%rbp), %rdx
leaq -0x138(%rbp), %rdi
movl $0x2f, %esi
callq 0x9860
movq %rax, -0xc0(%rbp)
cmpq $-0x1, -0xc0(%rbp)
je 0x20a89
movq -0xb8(%rbp), %rdx
movq -0xc0(%rbp), %rcx
leaq -0x1b8(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x96b0
jmp 0x2082f
leaq -0x198(%rbp), %rdi
leaq -0x158(%rbp), %rsi
leaq -0x1b8(%rbp), %rdx
callq 0x21d20
jmp 0x2084b
leaq -0x198(%rbp), %rdi
callq 0x92b0
movq %rax, %rdi
leaq -0xb0(%rbp), %rsi
callq 0x9c10
movl %eax, -0x25c(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x9c98
leaq -0x1b8(%rbp), %rdi
callq 0x9c98
movl -0x25c(%rbp), %eax
cmpl $0x0, %eax
jge 0x208b7
jmp 0x20a89
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x9c98
jmp 0x20b30
leaq -0x138(%rbp), %rdi
movl $0x2e, %esi
movq $-0x1, %rdx
callq 0x9c40
cmpq $-0x1, %rax
je 0x2092f
xorl %eax, %eax
movl %eax, %edx
leaq -0x138(%rbp), %rdi
movq %rdi, -0x268(%rbp)
movl $0x2e, %esi
callq 0x9860
movq -0x268(%rbp), %rsi
movq %rax, %rdx
leaq -0x1d8(%rbp), %rdi
movq $-0x1, %rcx
callq 0x96b0
jmp 0x20910
leaq -0x178(%rbp), %rdi
leaq -0x1d8(%rbp), %rsi
callq 0x97e0
leaq -0x1d8(%rbp), %rdi
callq 0x9c98
leaq -0x178(%rbp), %rdi
callq 0x9a50
testb $0x1, %al
jne 0x209d9
movq -0x20(%rbp), %rdi
callq 0x4c630
movq %rax, -0x270(%rbp)
jmp 0x20955
movq -0x270(%rbp), %rdi
leaq -0x178(%rbp), %rsi
callq 0x14370
movq %rax, -0x278(%rbp)
jmp 0x20971
movq -0x278(%rbp), %rax
movq %rax, -0x1e0(%rbp)
movq -0x20(%rbp), %rdi
callq 0x4c630
movq %rax, -0x280(%rbp)
jmp 0x20991
movq -0x280(%rbp), %rdi
callq 0x143a0
movq %rax, -0x1e8(%rbp)
leaq -0x1e0(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0x14340
testb $0x1, %al
jne 0x209bd
jmp 0x209d9
movl -0x98(%rbp), %ecx
andl $0xf000, %ecx           # imm = 0xF000
movb $0x1, %al
cmpl $0x8000, %ecx           # imm = 0x8000
movb %al, -0x281(%rbp)
je 0x209f2
movl -0x98(%rbp), %eax
andl $0xf000, %eax           # imm = 0xF000
cmpl $0x8000, %eax           # imm = 0x8000
sete %al
movb %al, -0x281(%rbp)
movb -0x281(%rbp), %al
testb $0x1, %al
jne 0x209fe
jmp 0x20a30
movq -0x218(%rbp), %rdi
movq -0xb8(%rbp), %rdx
movq -0xc0(%rbp), %rcx
leaq -0x138(%rbp), %rsi
callq 0x96b0
jmp 0x20a21
movl $0x1, -0x1ec(%rbp)
jmp 0x20af0
movl -0x98(%rbp), %eax
andl $0xf000, %eax           # imm = 0xF000
cmpl $0x4000, %eax           # imm = 0x4000
jne 0x20a80
movq -0xc0(%rbp), %rdx
addq $0x1, %rdx
leaq -0x138(%rbp), %rdi
movl $0x2f, %esi
callq 0x9860
movq %rax, -0xc0(%rbp)
cmpq $-0x1, %rax
jne 0x20a7e
leaq -0x138(%rbp), %rdi
callq 0x9960
movq %rax, -0xc0(%rbp)
jmp 0x20a82
jmp 0x20a89
jmp 0x20a84
jmp 0x207fe
leaq -0x1ed(%rbp), %rdi
movq %rdi, -0x290(%rbp)
callq 0x9b10
movq -0x218(%rbp), %rdi
movq -0x290(%rbp), %rdx
leaq 0x4a2bf(%rip), %rsi     # 0x6ad70
callq 0xa780
jmp 0x20ab8
leaq -0x1ed(%rbp), %rdi
callq 0x9700
movl $0x1, -0x1ec(%rbp)
jmp 0x20af0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x110(%rbp)
movl %eax, -0x114(%rbp)
leaq -0x1ed(%rbp), %rdi
callq 0x9700
jmp 0x20b30
leaq -0x178(%rbp), %rdi
callq 0x9c98
leaq -0x158(%rbp), %rdi
callq 0x9c98
leaq -0x138(%rbp), %rdi
callq 0x9c98
leaq -0xe0(%rbp), %rdi
callq 0x9c98
movq -0x210(%rbp), %rax
addq $0x290, %rsp            # imm = 0x290
popq %rbp
retq
leaq -0x178(%rbp), %rdi
callq 0x9c98
leaq -0x158(%rbp), %rdi
callq 0x9c98
leaq -0x138(%rbp), %rdi
callq 0x9c98
leaq -0xe0(%rbp), %rdi
callq 0x9c98
movq -0x110(%rbp), %rdi
callq 0x9af0
nopl (%rax)