// File: t0mm4rx[P]piscine_cpp/day06/ex00/main.cpp
// Function: go(char*)
void	go(char* src)
{
	std::string	str;
	double		k;
	int			strStart(0);
	int			strSize(0);

	while (src[strStart] && std::isspace(src[strStart]))
		strStart++;
	while (src[strStart + strSize] && !std::isspace(src[strStart + strSize]))
		strSize++;
	str = std::string(src, strStart, strSize);
	if (str.length() == 1 && std::isprint(str[0]) && !std::isdigit(str[0]))
		k = str[0];
	else
	{
		try
		{
			k = std::stod(str);
		}
		catch (std::exception &e)
		{
			std::cout << "No conversion found!" << std::endl;
			std::cout << "char:   impossible" << std::endl;
			std::cout << "int:    impossible" << std::endl;
			std::cout << "float:  impossible" << std::endl;
			std::cout << "double: impossible" << std::endl;
			return ;
		}
	}
	std::cout << "char:   ";
	if (k < CHAR_MIN || k > CHAR_MAX || isnan(k))
		std::cout << "impossible" << std::endl;
	else if (std::isprint(k))
		std::cout << static_cast<unsigned char>(k) << std::endl;
	else
		std::cout << "non displayable" << std::endl;
	std::cout << "int:    ";
	if (k >= INT_MIN && k <= INT_MAX && !isnan(k) && !isinf(k))
		std::cout << static_cast<int>(k) << std::endl;
	else
		std::cout << "impossible " << std::endl;
	std::cout << "float:  ";
	if (isnan(k))
		std::cout << "nan";
	else if (isinf(k))
		std::cout << (k < 0 ? "-" : "") << "inf";
	else
		std::cout << static_cast<float>(k);
	std::cout << "f" << std::endl;
	std::cout << "double: ";
	if (isnan(k))
		std::cout << "nan" << std::endl;
	else if (isinf(k))
		std::cout << (k < 0 ? "-" : "") << "inf" << std::endl;
	else
		std::cout << k << std::endl;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rdi, -0x8(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x2140
movl $0x0, -0x34(%rbp)
movl $0x0, -0x38(%rbp)
movq -0x8(%rbp), %rcx
movslq -0x34(%rbp), %rdx
xorl %eax, %eax
cmpb $0x0, (%rcx,%rdx)
movb %al, -0x7d(%rbp)
je 0x23b3
movq -0x8(%rbp), %rax
movslq -0x34(%rbp), %rcx
movsbl (%rax,%rcx), %edi
callq 0x2040
cmpl $0x0, %eax
setne %al
movb %al, -0x7d(%rbp)
movb -0x7d(%rbp), %al
testb $0x1, %al
jne 0x23bc
jmp 0x23c7
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x2386
jmp 0x23c9
movq -0x8(%rbp), %rcx
movl -0x34(%rbp), %eax
addl -0x38(%rbp), %eax
movslq %eax, %rdx
xorl %eax, %eax
cmpb $0x0, (%rcx,%rdx)
movb %al, -0x7e(%rbp)
je 0x2402
movq -0x8(%rbp), %rax
movl -0x34(%rbp), %ecx
addl -0x38(%rbp), %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %edi
callq 0x2040
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x7e(%rbp)
movb -0x7e(%rbp), %al
testb $0x1, %al
jne 0x240b
jmp 0x2416
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0x23c9
movslq -0x34(%rbp), %rax
movq %rax, -0x98(%rbp)
movslq -0x38(%rbp), %rax
movq %rax, -0x90(%rbp)
leaq -0x59(%rbp), %rdi
movq %rdi, -0x88(%rbp)
callq 0x21f0
movq -0x98(%rbp), %rdx
movq -0x90(%rbp), %rcx
movq -0x88(%rbp), %r8
leaq -0x58(%rbp), %rdi
leaq -0x8(%rbp), %rsi
callq 0x2b60
jmp 0x2460
leaq -0x28(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x2130
leaq -0x58(%rbp), %rdi
callq 0x20c0
leaq -0x59(%rbp), %rdi
callq 0x2120
leaq -0x28(%rbp), %rdi
callq 0x2170
cmpq $0x1, %rax
jne 0x2543
xorl %eax, %eax
movl %eax, %esi
leaq -0x28(%rbp), %rdi
callq 0x2210
movq %rax, -0xa0(%rbp)
jmp 0x24a8
movq -0xa0(%rbp), %rax
movsbl (%rax), %edi
callq 0x21e0
cmpl $0x0, %eax
je 0x2543
xorl %eax, %eax
movl %eax, %esi
leaq -0x28(%rbp), %rdi
callq 0x2210
movq %rax, -0xa8(%rbp)
jmp 0x24d6
movq -0xa8(%rbp), %rax
movsbl (%rax), %edi
callq 0x20f0
cmpl $0x0, %eax
jne 0x2543
xorl %eax, %eax
movl %eax, %esi
leaq -0x28(%rbp), %rdi
callq 0x2210
movq %rax, -0xb0(%rbp)
jmp 0x2500
movq -0xb0(%rbp), %rax
movsbl (%rax), %eax
cvtsi2sd %eax, %xmm0
movsd %xmm0, -0x30(%rbp)
jmp 0x26b7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0x59(%rbp), %rdi
callq 0x2120
jmp 0x2ac8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x2ac8
xorl %eax, %eax
movl %eax, %esi
leaq -0x28(%rbp), %rdi
callq 0x2be0
movsd %xmm0, -0xb8(%rbp)
jmp 0x255a
movsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
jmp 0x26b5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
movl -0x6c(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x2ac8
movq -0x68(%rbp), %rdi
callq 0x2070
movq %rax, -0x78(%rbp)
movq 0x3a3c(%rip), %rdi      # 0x5fd8
leaq 0x1a85(%rip), %rsi      # 0x4028
callq 0x2100
movq %rax, -0xc0(%rbp)
jmp 0x25b1
movq -0xc0(%rbp), %rdi
movq 0x3a01(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x25c6
movq 0x3a0b(%rip), %rdi      # 0x5fd8
leaq 0x1a69(%rip), %rsi      # 0x403d
callq 0x2100
movq %rax, -0xc8(%rbp)
jmp 0x25e2
movq -0xc8(%rbp), %rdi
movq 0x39d0(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x25f7
movq 0x39da(%rip), %rdi      # 0x5fd8
leaq 0x1a4b(%rip), %rsi      # 0x4050
callq 0x2100
movq %rax, -0xd0(%rbp)
jmp 0x2613
movq -0xd0(%rbp), %rdi
movq 0x399f(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2628
movq 0x39a9(%rip), %rdi      # 0x5fd8
leaq 0x1a2d(%rip), %rsi      # 0x4063
callq 0x2100
movq %rax, -0xd8(%rbp)
jmp 0x2644
movq -0xd8(%rbp), %rdi
movq 0x396e(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2659
movq 0x3978(%rip), %rdi      # 0x5fd8
leaq 0x1a0f(%rip), %rsi      # 0x4076
callq 0x2100
movq %rax, -0xe0(%rbp)
jmp 0x2675
movq -0xe0(%rbp), %rdi
movq 0x393d(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x268a
movl $0x1, -0x7c(%rbp)
callq 0x21b0
jmp 0x26ab
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
callq 0x21b0
jmp 0x26b0
jmp 0x2ab6
jmp 0x2ac8
jmp 0x26b7
movq 0x391a(%rip), %rdi      # 0x5fd8
leaq 0x19c4(%rip), %rsi      # 0x4089
callq 0x2100
jmp 0x26cc
movsd 0x1934(%rip), %xmm0     # 0x4008
ucomisd -0x30(%rbp), %xmm0
ja 0x270c
movsd -0x30(%rbp), %xmm0
movsd 0x1928(%rip), %xmm1     # 0x4010
ucomisd %xmm1, %xmm0
ja 0x270c
movsd -0x30(%rbp), %xmm0
callq 0x2c30
movb %al, -0xe1(%rbp)
jmp 0x2700
movb -0xe1(%rbp), %al
testb $0x1, %al
jne 0x270c
jmp 0x273f
movq 0x38c5(%rip), %rdi      # 0x5fd8
leaq 0x193e(%rip), %rsi      # 0x4058
callq 0x2100
movq %rax, -0xf0(%rbp)
jmp 0x2728
movq -0xf0(%rbp), %rdi
movq 0x388a(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x273d
jmp 0x27b7
cvttsd2si -0x30(%rbp), %edi
callq 0x21e0
cmpl $0x0, %eax
je 0x2782
cvttsd2si -0x30(%rbp), %eax
movzbl %al, %esi
movq 0x387b(%rip), %rdi      # 0x5fd8
callq 0x2190
movq %rax, -0xf8(%rbp)
jmp 0x276b
movq -0xf8(%rbp), %rdi
movq 0x3847(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2780
jmp 0x27b5
movq 0x384f(%rip), %rdi      # 0x5fd8
leaq 0x1902(%rip), %rsi      # 0x4092
callq 0x2100
movq %rax, -0x100(%rbp)
jmp 0x279e
movq -0x100(%rbp), %rdi
movq 0x3814(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x27b3
jmp 0x27b5
jmp 0x27b7
movq 0x381a(%rip), %rdi      # 0x5fd8
leaq 0x18dd(%rip), %rsi      # 0x40a2
callq 0x2100
jmp 0x27cc
movsd -0x30(%rbp), %xmm0
movsd 0x183f(%rip), %xmm1     # 0x4018
ucomisd %xmm1, %xmm0
jb 0x285b
movsd 0x1839(%rip), %xmm0     # 0x4020
ucomisd -0x30(%rbp), %xmm0
jb 0x285b
movsd -0x30(%rbp), %xmm0
callq 0x2c30
movb %al, -0x101(%rbp)
jmp 0x2800
movb -0x101(%rbp), %al
testb $0x1, %al
jne 0x285b
jmp 0x280c
movsd -0x30(%rbp), %xmm0
callq 0x2c50
movb %al, -0x102(%rbp)
jmp 0x281e
movb -0x102(%rbp), %al
testb $0x1, %al
jne 0x285b
jmp 0x282a
cvttsd2si -0x30(%rbp), %esi
movq 0x37a2(%rip), %rdi      # 0x5fd8
callq 0x21c0
movq %rax, -0x110(%rbp)
jmp 0x2844
movq -0x110(%rbp), %rdi
movq 0x376e(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2859
jmp 0x288e
movq 0x3776(%rip), %rdi      # 0x5fd8
leaq 0x1842(%rip), %rsi      # 0x40ab
callq 0x2100
movq %rax, -0x118(%rbp)
jmp 0x2877
movq -0x118(%rbp), %rdi
movq 0x373b(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x288c
jmp 0x288e
movq 0x3743(%rip), %rdi      # 0x5fd8
leaq 0x181b(%rip), %rsi      # 0x40b7
callq 0x2100
jmp 0x28a3
movsd -0x30(%rbp), %xmm0
callq 0x2c30
movb %al, -0x119(%rbp)
jmp 0x28b5
movb -0x119(%rbp), %al
testb $0x1, %al
jne 0x28c1
jmp 0x28db
movq 0x3710(%rip), %rdi      # 0x5fd8
leaq 0x17f1(%rip), %rsi      # 0x40c0
callq 0x2100
jmp 0x28d6
jmp 0x295e
movsd -0x30(%rbp), %xmm0
callq 0x2c50
movb %al, -0x11a(%rbp)
jmp 0x28ed
movb -0x11a(%rbp), %al
testb $0x1, %al
jne 0x28f9
jmp 0x2943
movsd -0x30(%rbp), %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
leaq 0x17b8(%rip), %rax      # 0x40c4
leaq 0x1797(%rip), %rsi      # 0x40aa
cmovaq %rax, %rsi
movq 0x36ba(%rip), %rdi      # 0x5fd8
callq 0x2100
movq %rax, -0x128(%rbp)
jmp 0x292c
movq -0x128(%rbp), %rdi
leaq 0x178c(%rip), %rsi      # 0x40c6
callq 0x2100
jmp 0x2941
jmp 0x295c
movsd -0x30(%rbp), %xmm0
cvtsd2ss %xmm0, %xmm0
movq 0x3685(%rip), %rdi      # 0x5fd8
callq 0x20d0
jmp 0x295a
jmp 0x295c
jmp 0x295e
movq 0x3673(%rip), %rdi      # 0x5fd8
leaq 0x175c(%rip), %rsi      # 0x40c8
callq 0x2100
movq %rax, -0x130(%rbp)
jmp 0x297a
movq -0x130(%rbp), %rdi
movq 0x3638(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x298f
movq 0x3642(%rip), %rdi      # 0x5fd8
leaq 0x172d(%rip), %rsi      # 0x40ca
callq 0x2100
jmp 0x29a4
movsd -0x30(%rbp), %xmm0
callq 0x2c30
movb %al, -0x131(%rbp)
jmp 0x29b6
movb -0x131(%rbp), %al
testb $0x1, %al
jne 0x29c2
jmp 0x29f8
movq 0x360f(%rip), %rdi      # 0x5fd8
leaq 0x16f0(%rip), %rsi      # 0x40c0
callq 0x2100
movq %rax, -0x140(%rbp)
jmp 0x29de
movq -0x140(%rbp), %rdi
movq 0x35d4(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x29f3
jmp 0x2aaf
movsd -0x30(%rbp), %xmm0
callq 0x2c50
movb %al, -0x141(%rbp)
jmp 0x2a0a
movb -0x141(%rbp), %al
testb $0x1, %al
jne 0x2a16
jmp 0x2a7c
movsd -0x30(%rbp), %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
leaq 0x169b(%rip), %rax      # 0x40c4
leaq 0x167a(%rip), %rsi      # 0x40aa
cmovaq %rax, %rsi
movq 0x359d(%rip), %rdi      # 0x5fd8
callq 0x2100
movq %rax, -0x150(%rbp)
jmp 0x2a49
movq -0x150(%rbp), %rdi
leaq 0x166f(%rip), %rsi      # 0x40c6
callq 0x2100
movq %rax, -0x158(%rbp)
jmp 0x2a65
movq -0x158(%rbp), %rdi
movq 0x354d(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2a7a
jmp 0x2aad
movsd -0x30(%rbp), %xmm0
movq 0x3550(%rip), %rdi      # 0x5fd8
callq 0x2200
movq %rax, -0x160(%rbp)
jmp 0x2a96
movq -0x160(%rbp), %rdi
movq 0x351c(%rip), %rsi      # 0x5fc0
callq 0x2110
jmp 0x2aab
jmp 0x2aad
jmp 0x2aaf
movl $0x0, -0x7c(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x20c0
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
leaq -0x28(%rbp), %rdi
callq 0x20c0
movq -0x68(%rbp), %rdi
callq 0x21d0
movq %rax, %rdi
callq 0x2c20
nopw %cs:(%rax,%rax)