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

	int bloqueI = offset/tamBloque, bloqueF = (offset+nbytes-1)/tamBloque, bfisico, bytes = 0;
	unsigned char bufBloque[tamBloque];
	int desp1 = offset%tamBloque; //Desplazamiento en el bloque
	int desp2 = (offset+nbytes-1) % tamBloque;

	if(bloqueI == bloqueF) { //Si son el mismo el bloque inicial y el final
		if(traducir_bloque_inodo(inodo,bloqueI,&bfisico,1) < 0) return -2; //Obtenemos el bloque físico Error TBI
		if(bread(bfisico, bufBloque) < 0) return -3; //Leemos el bloque correspondiente Error BREAD
		memcpy (bufBloque+desp1, buf, desp2-desp1+1);
		if(bwrite(bfisico, bufBloque) < 0) return -4; // Escribimos el bloque en memoria Error BWRITE
		bytes += desp2-desp1+1;	// Aumentamos el contador los bytes que hemos escrito
	} else {
	//3 fases
	//Primer bloque
	if(traducir_bloque_inodo(inodo,bloqueI,&bfisico,1) < 0) return -2; //Error TBI
	if(bread(bfisico, bufBloque) < 0) return -3; //Leemos el bloque correspondiente Error BREAD
	memcpy (bufBloque+desp1, buf, tamBloque-desp1);
	if(bwrite(bfisico, bufBloque) < 0) return -4; // Escribimos el bloque en memoria Error BWRITE
	bytes += tamBloque-desp1;

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

	//Ultimo bloque
	if(traducir_bloque_inodo(inodo,bloqueF,&bfisico,1) < 0) return -2; //Error TBI
	if(bread(bfisico, bufBloque) < 0) return -3; //Leemos el bloque correspondiente Error BREAD
	memcpy(bufBloque,buf+(nbytes-desp2-1),desp2+1);
	if(bwrite(bfisico, bufBloque) < 0) return -4; // Escribimos el bloque en memoria Error BWRITE
	bytes += desp2+1;
	}
	//Actualizaremos la metainformacion del inodo
	in = leer_inodo(inodo);
	if(in.tamBytesLogicos<offset+bytes && bytes != 0) in.tamBytesLogicos = offset+bytes;
	in.mtime = time(NULL);
	in.ctime = time(NULL);
	if(escribir_inodo(in, inodo) < 0) return -5; //Escribimos el inodo modificado Error ESCRIBIR_INODO
	return bytes;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x5d0, %rsp            # imm = 0x5D0
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movl %ecx, -0x18(%rbp)
movl -0x8(%rbp), %esi
leaq -0x98(%rbp), %rdi
callq 0x1f20
movzbl -0x97(%rbp), %eax
andl $0x2, %eax
cmpl $0x2, %eax
je 0x38e2
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x3cef
movl -0x14(%rbp), %eax
shrl $0xa, %eax
movl %eax, -0x9c(%rbp)
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
subl $0x1, %eax
shrl $0xa, %eax
movl %eax, -0xa0(%rbp)
movl $0x0, -0xa8(%rbp)
movl -0x14(%rbp), %eax
andl $0x3ff, %eax            # imm = 0x3FF
movl %eax, -0x4b4(%rbp)
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
subl $0x1, %eax
andl $0x3ff, %eax            # imm = 0x3FF
movl %eax, -0x4b8(%rbp)
movl -0x9c(%rbp), %eax
cmpl -0xa0(%rbp), %eax
jne 0x39fb
movl -0x8(%rbp), %edi
movl -0x9c(%rbp), %esi
leaq -0xa4(%rbp), %rdx
movl $0x1, %ecx
callq 0x3100
cmpl $0x0, %eax
jge 0x3969
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x3cef
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x398c
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x3cef
leaq -0x4b0(%rbp), %rdi
movslq -0x4b4(%rbp), %rax
addq %rax, %rdi
movq -0x10(%rbp), %rsi
movl -0x4b8(%rbp), %eax
subl -0x4b4(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdx
callq 0x1120
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x39db
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x3cef
movl -0x4b8(%rbp), %eax
subl -0x4b4(%rbp), %eax
addl $0x1, %eax
addl -0xa8(%rbp), %eax
movl %eax, -0xa8(%rbp)
jmp 0x3c18
movl -0x8(%rbp), %edi
movl -0x9c(%rbp), %esi
leaq -0xa4(%rbp), %rdx
movl $0x1, %ecx
callq 0x3100
cmpl $0x0, %eax
jge 0x3a26
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x3cef
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x3a49
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x3cef
leaq -0x4b0(%rbp), %rdi
movslq -0x4b4(%rbp), %rax
addq %rax, %rdi
movq -0x10(%rbp), %rsi
movl $0x400, %eax            # imm = 0x400
subl -0x4b4(%rbp), %eax
movslq %eax, %rdx
callq 0x1120
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x3a94
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x3cef
movl $0x400, %eax            # imm = 0x400
subl -0x4b4(%rbp), %eax
addl -0xa8(%rbp), %eax
movl %eax, -0xa8(%rbp)
movl -0x9c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4bc(%rbp)
movl -0x4bc(%rbp), %eax
cmpl -0xa0(%rbp), %eax
jge 0x3b65
leaq -0x4b0(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl $0x400, %eax            # imm = 0x400
subl -0x4b4(%rbp), %eax
cltq
addq %rax, %rsi
movl -0x4bc(%rbp), %eax
subl -0x9c(%rbp), %eax
subl $0x1, %eax
shll $0xa, %eax
cltq
addq %rax, %rsi
movl $0x400, %edx            # imm = 0x400
callq 0x1120
movl -0x8(%rbp), %edi
movl -0x4bc(%rbp), %esi
leaq -0xa4(%rbp), %rdx
movl $0x1, %ecx
callq 0x3100
cmpl $0x0, %eax
jge 0x3b33
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x3cef
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1320
addl -0xa8(%rbp), %eax
movl %eax, -0xa8(%rbp)
movl -0x4bc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4bc(%rbp)
jmp 0x3aba
movl -0x8(%rbp), %edi
movl -0xa0(%rbp), %esi
leaq -0xa4(%rbp), %rdx
movl $0x1, %ecx
callq 0x3100
cmpl $0x0, %eax
jge 0x3b90
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x3cef
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x3bb3
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x3cef
leaq -0x4b0(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl -0x18(%rbp), %eax
subl -0x4b8(%rbp), %eax
subl $0x1, %eax
movl %eax, %eax
addq %rax, %rsi
movl -0x4b8(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdx
callq 0x1120
movl -0xa4(%rbp), %edi
leaq -0x4b0(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x3c03
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x3cef
movl -0x4b8(%rbp), %eax
addl $0x1, %eax
addl -0xa8(%rbp), %eax
movl %eax, -0xa8(%rbp)
movl -0x8(%rbp), %esi
leaq -0x540(%rbp), %rdi
callq 0x1f20
leaq -0x98(%rbp), %rdi
leaq -0x540(%rbp), %rsi
movl $0x80, %edx
callq 0x1120
movl -0x74(%rbp), %eax
movl -0x14(%rbp), %ecx
addl -0xa8(%rbp), %ecx
cmpl %ecx, %eax
jae 0x3c64
cmpl $0x0, -0xa8(%rbp)
je 0x3c64
movl -0x14(%rbp), %eax
addl -0xa8(%rbp), %eax
movl %eax, -0x74(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x88(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x80(%rbp)
movl -0x8(%rbp), %edi
movups -0x28(%rbp), %xmm0
movq %rsp, %rax
movq %rax, -0x548(%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 0x3ce6
movl $0xfffffffb, -0x4(%rbp) # imm = 0xFFFFFFFB
jmp 0x3cef
movl -0xa8(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x5d0, %rsp            # imm = 0x5D0
popq %rbp
retq
nopl (%rax,%rax)