// File: /workspace/github_c_makefile_star2_O0/carlitosmarin[P]Sistema-Ficheros-SOII/./src/ficheros.c
// Function: mi_read_f
int mi_read_f (unsigned int inodo, void *buf, unsigned int offset, unsigned int nbytes) {
	struct inodo in;
	in = leer_inodo(inodo);
	if((in.permisos & 4) != 4) return -1; //Error NO_PERMISOS_LECTURA

	// La función no puede leer más allá del tamaño en bytes lógicos del inodo
	if (offset + nbytes >= in.tamBytesLogicos)
		nbytes = in.tamBytesLogicos - offset; //Leemos sólo los bytes que podemos desde el offset hasta el final de fichero
	if (offset > in.tamBytesLogicos || in.tamBytesLogicos == 0){
		return 0; // No podemos leer nada
	}
	if(nbytes == 0) return 0; //No leemos nada

	unsigned char bufBloque[tamBloque]; //Leer el disco
	memset(bufBloque,0,tamBloque);

	int bloqueI = offset/tamBloque, bloqueF = (offset+nbytes-1)/tamBloque, bfisico, bytes = 0;

	int	desp1 = offset%tamBloque; //Desplazamiento en el bloque
	int desp2 = (offset+nbytes-1) % tamBloque;
	int error = 0; //Saber el error de traducir bloque

	if(bloqueI == bloqueF) { //Si son el mismo el bloque inicial y el final
		if((error = traducir_bloque_inodo(inodo,bloqueI,&bfisico,0)) < 0 && error != -2) return bytes;
		else if (error == -2) memset(bufBloque,0,tamBloque);
		else bread(bfisico, bufBloque);
		memcpy (buf, bufBloque+desp1, desp2-desp1+1);
		bytes += desp2-desp1+1;	//Aumentamos el contador los bytes que hemos leido
	} else {
	//3 fases
	//Primer bloque
	if((error = traducir_bloque_inodo(inodo,bloqueI,&bfisico,0)) < 0 && error != -2) return bytes;
	else if (error == -2) memset(bufBloque,0,tamBloque); //Error SOLO CONSULTA DE LA ENTRADA
	else bread(bfisico, bufBloque);
	memcpy (buf, bufBloque+desp1, tamBloque-desp1);
	bytes += tamBloque-desp1;

	//Intermedios
	int bucle;
	for(bucle = bloqueI+1; bucle < bloqueF; bucle++) {
		if((error = traducir_bloque_inodo(inodo,bucle,&bfisico,0)) < 0 && error!= -2) return bytes;
		else if (error == -2) memset(bufBloque,0,tamBloque);
		else bread(bfisico, bufBloque);
		memcpy(buf+(tamBloque-desp1)+(bucle-bloqueI-1)*tamBloque, bufBloque, tamBloque);
		bytes += tamBloque;
	}

	//Ultimo bloque
	if((error = traducir_bloque_inodo(inodo,bloqueF,&bfisico,0)) < 0 && error!= -2) return bytes;
	else if (error == -2) memset(bufBloque,0,tamBloque);
	else bread(bfisico, bufBloque);
	memcpy (buf+(nbytes-desp2-1), bufBloque, desp2+1);
	bytes += desp2+1;
	}
	//Actualizaremos la metainformacion del inodo
	in = leer_inodo(inodo); //Por si el traducir_bloque_Inodo ha reservado inodos
	in.atime = time(NULL);
	if(escribir_inodo(in, inodo) < 0) return -6; //Escribimos el inodo modificado Error ESCRIBIR_INODO

	return bytes;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x650, %rsp            # imm = 0x650
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movl %ecx, -0x18(%rbp)
movl -0x8(%rbp), %esi
leaq -0x118(%rbp), %rdi
callq 0x1f20
leaq -0x98(%rbp), %rdi
leaq -0x118(%rbp), %rsi
movl $0x80, %edx
callq 0x1120
movzbl -0x97(%rbp), %eax
andl $0x4, %eax
cmpl $0x4, %eax
je 0x3d5a
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x41b3
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
cmpl -0x74(%rbp), %eax
jb 0x3d6e
movl -0x74(%rbp), %eax
subl -0x14(%rbp), %eax
movl %eax, -0x18(%rbp)
movl -0x14(%rbp), %eax
cmpl -0x74(%rbp), %eax
ja 0x3d7c
cmpl $0x0, -0x74(%rbp)
jne 0x3d88
movl $0x0, -0x4(%rbp)
jmp 0x41b3
cmpl $0x0, -0x18(%rbp)
jne 0x3d9a
movl $0x0, -0x4(%rbp)
jmp 0x41b3
leaq -0x520(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
movl -0x14(%rbp), %eax
shrl $0xa, %eax
movl %eax, -0x524(%rbp)
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
subl $0x1, %eax
shrl $0xa, %eax
movl %eax, -0x528(%rbp)
movl $0x0, -0x530(%rbp)
movl -0x14(%rbp), %eax
andl $0x3ff, %eax            # imm = 0x3FF
movl %eax, -0x534(%rbp)
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
subl $0x1, %eax
andl $0x3ff, %eax            # imm = 0x3FF
movl %eax, -0x538(%rbp)
movl $0x0, -0x53c(%rbp)
movl -0x524(%rbp), %eax
cmpl -0x528(%rbp), %eax
jne 0x3eca
movl -0x8(%rbp), %edi
movl -0x524(%rbp), %esi
leaq -0x52c(%rbp), %rdx
xorl %ecx, %ecx
callq 0x3100
movl %eax, -0x53c(%rbp)
cmpl $0x0, %eax
jge 0x3e4c
cmpl $-0x2, -0x53c(%rbp)
je 0x3e4c
movl -0x530(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x41b3
cmpl $-0x2, -0x53c(%rbp)
jne 0x3e6a
leaq -0x520(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
jmp 0x3e7c
movl -0x52c(%rbp), %edi
leaq -0x520(%rbp), %rsi
callq 0x1380
jmp 0x3e7e
movq -0x10(%rbp), %rdi
leaq -0x520(%rbp), %rsi
movslq -0x534(%rbp), %rax
addq %rax, %rsi
movl -0x538(%rbp), %eax
subl -0x534(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdx
callq 0x1120
movl -0x538(%rbp), %eax
subl -0x534(%rbp), %eax
addl $0x1, %eax
addl -0x530(%rbp), %eax
movl %eax, -0x530(%rbp)
jmp 0x410e
movl -0x8(%rbp), %edi
movl -0x524(%rbp), %esi
leaq -0x52c(%rbp), %rdx
xorl %ecx, %ecx
callq 0x3100
movl %eax, -0x53c(%rbp)
cmpl $0x0, %eax
jge 0x3f03
cmpl $-0x2, -0x53c(%rbp)
je 0x3f03
movl -0x530(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x41b3
cmpl $-0x2, -0x53c(%rbp)
jne 0x3f21
leaq -0x520(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
jmp 0x3f33
movl -0x52c(%rbp), %edi
leaq -0x520(%rbp), %rsi
callq 0x1380
jmp 0x3f35
movq -0x10(%rbp), %rdi
leaq -0x520(%rbp), %rsi
movslq -0x534(%rbp), %rax
addq %rax, %rsi
movl $0x400, %eax            # imm = 0x400
subl -0x534(%rbp), %eax
movslq %eax, %rdx
callq 0x1120
movl $0x400, %eax            # imm = 0x400
subl -0x534(%rbp), %eax
addl -0x530(%rbp), %eax
movl %eax, -0x530(%rbp)
movl -0x524(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x540(%rbp)
movl -0x540(%rbp), %eax
cmpl -0x528(%rbp), %eax
jge 0x4061
movl -0x8(%rbp), %edi
movl -0x540(%rbp), %esi
leaq -0x52c(%rbp), %rdx
xorl %ecx, %ecx
callq 0x3100
movl %eax, -0x53c(%rbp)
cmpl $0x0, %eax
jge 0x3fce
cmpl $-0x2, -0x53c(%rbp)
je 0x3fce
movl -0x530(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x41b3
cmpl $-0x2, -0x53c(%rbp)
jne 0x3fec
leaq -0x520(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
jmp 0x3ffe
movl -0x52c(%rbp), %edi
leaq -0x520(%rbp), %rsi
callq 0x1380
jmp 0x4000
movq -0x10(%rbp), %rdi
movl $0x400, %eax            # imm = 0x400
subl -0x534(%rbp), %eax
cltq
addq %rax, %rdi
movl -0x540(%rbp), %eax
subl -0x524(%rbp), %eax
subl $0x1, %eax
shll $0xa, %eax
cltq
addq %rax, %rdi
leaq -0x520(%rbp), %rsi
movl $0x400, %edx            # imm = 0x400
callq 0x1120
movl -0x530(%rbp), %eax
addl $0x400, %eax            # imm = 0x400
movl %eax, -0x530(%rbp)
movl -0x540(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x540(%rbp)
jmp 0x3f83
movl -0x8(%rbp), %edi
movl -0x528(%rbp), %esi
leaq -0x52c(%rbp), %rdx
xorl %ecx, %ecx
callq 0x3100
movl %eax, -0x53c(%rbp)
cmpl $0x0, %eax
jge 0x409a
cmpl $-0x2, -0x53c(%rbp)
je 0x409a
movl -0x530(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x41b3
cmpl $-0x2, -0x53c(%rbp)
jne 0x40b8
leaq -0x520(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
jmp 0x40ca
movl -0x52c(%rbp), %edi
leaq -0x520(%rbp), %rsi
callq 0x1380
jmp 0x40cc
movq -0x10(%rbp), %rdi
movl -0x18(%rbp), %eax
subl -0x538(%rbp), %eax
subl $0x1, %eax
movl %eax, %eax
addq %rax, %rdi
leaq -0x520(%rbp), %rsi
movl -0x538(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdx
callq 0x1120
movl -0x538(%rbp), %eax
addl $0x1, %eax
addl -0x530(%rbp), %eax
movl %eax, -0x530(%rbp)
movl -0x8(%rbp), %esi
leaq -0x5c0(%rbp), %rdi
callq 0x1f20
leaq -0x98(%rbp), %rdi
leaq -0x5c0(%rbp), %rsi
movl $0x80, %edx
callq 0x1120
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x90(%rbp)
movl -0x8(%rbp), %edi
movups -0x28(%rbp), %xmm0
movq %rsp, %rax
movq %rax, -0x5c8(%rbp)
movups %xmm0, 0x70(%rax)
movups -0x38(%rbp), %xmm0
movups %xmm0, 0x60(%rax)
movups -0x48(%rbp), %xmm0
movups %xmm0, 0x50(%rax)
movups -0x58(%rbp), %xmm0
movups %xmm0, 0x40(%rax)
movups -0x98(%rbp), %xmm0
movups -0x88(%rbp), %xmm1
movups -0x78(%rbp), %xmm2
movups -0x68(%rbp), %xmm3
movups %xmm3, 0x30(%rax)
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x1e40
cmpl $0x0, %eax
jge 0x41aa
movl $0xfffffffa, -0x4(%rbp) # imm = 0xFFFFFFFA
jmp 0x41b3
movl -0x530(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x650, %rsp            # imm = 0x650
popq %rbp
retq
nop