// File: /workspace/github_c_makefile_star2_O0/carlitosmarin[P]Sistema-Ficheros-SOII/./src/ficheros_basico.c
// Function: traducir_bloque_inodo
int traducir_bloque_inodo (unsigned int inodo, unsigned int blogico, unsigned int *bfisico, char reservar) {
	//Almenos dos tipos de error, ERROR solo consulta (-2)
	struct inodo in;
	in = leer_inodo(inodo);
	
	//Tipos de punteros
	int npdirectos = puntD; // Directos = 12
	int npindirectos0 = tamBloque/sizeof(unsigned int); //en 1024 bytes caben 256 punteros
	int npindirectos1 = npindirectos0*npindirectos0;
	int npindirectos2 = npindirectos1*npindirectos0;
	
	int ultBloque = in.tamBytesLogicos/tamBloque; //Ultimo bloque con contenido
	int bucle, bfis;
	int existe = 0;
	unsigned int buf[npindirectos0];
	unsigned int punt[3]; //Indica el nivel de cada puntero
	int idx;
	
	if(blogico < npdirectos) idx = -1; //Punteros directos
	else if (blogico < npdirectos+npindirectos0) { //Indirectos 0
		idx = 0;
		punt[idx] = blogico-npdirectos;
	} else if (blogico<npdirectos+npindirectos0+npindirectos1) {
		idx = 1;
		punt[idx-1] = (blogico-(npdirectos+npindirectos0))%npindirectos0; //puntero nivel 0
		punt[idx] = (blogico-(npdirectos+npindirectos0))/npindirectos0; //puntero nivel 1
	} else if (blogico < npdirectos+npindirectos0+npindirectos1+npindirectos2) {
		idx = 2;
		punt[idx-2] = ((blogico-(npdirectos+npindirectos0+npindirectos1))%npindirectos1)%npindirectos0; //puntero nivel 0
		punt[idx-1] = ((blogico-(npdirectos+npindirectos0+npindirectos1))%npindirectos1)/npindirectos0; //puntero nivel 1
		punt[idx] = (blogico-(npdirectos+npindirectos0+npindirectos1))/npindirectos1; //puntero nivel 2
	}
	
	if (idx >= 0) { //Controlamos los punteros indirectos
		if (in.punterosIndirectos[idx] != 0) { //Si apunta a un bloque
			existe = 1;
			bfis = in.punterosIndirectos[idx];
			int n; 
			for(n = idx; n > -1 && existe; n--) { //Visitamos los niveles
				if(bread(bfis, buf) < 0) return -1;
				if(buf[punt[n]] == 0) existe = 0;
				else bfis = buf[punt[n]];
			}
		} 	
	} else if(in.punterosDirectos[blogico] != 0) { //Puntero directo y apunta a un bloque
		existe = 1;
		bfis = in.punterosDirectos[blogico];
	}
	
	if (existe) { //Si existe se le asignara un bloque
		*bfisico = bfis;
		return 0;
	}
	
	unsigned char buf2[tamBloque];
	memset(buf2,0,tamBloque); //Inicializamos el bloque a 0
	int ninodo; 
	
	if(!reservar) return -2; //Si solo se quiere consultar!!
	else if (reservar){ //Si queremos reservar
		if (idx == -1) { //Se trata de un puntero Directo
			if((ninodo = reservar_bloque()) < 0) return -1; //Error RESERVAR_BLOQUE
			if(bwrite(ninodo, buf2) < 0) return -1; //Error ESCRITURA
			in.punterosDirectos[blogico] = ninodo;
			in.cantBloquesOcupados++;
			in.ctime = time(NULL);
			*bfisico = in.punterosDirectos[blogico];
		} else { //Se trata de un puntero indirecto
			if(in.punterosIndirectos[idx] == 0) { //No apunta a nada
				if((ninodo = reservar_bloque()) < 0) return -1; //Error RESERVAR_BLOQUE
				if(bwrite(ninodo, buf2) < 0) return -1; //Error ESCRITURA
				in.punterosIndirectos[idx] = ninodo;
				in.cantBloquesOcupados++;
				in.ctime = time(NULL);	
			}
			bfis = in.punterosIndirectos[idx]; //Asignamos el puntero
			for(bucle = idx; bucle > -1; bucle--) { //Recorremos todos los niveles de los indirectos
				if(bread(bfis,buf) < 0) return -1;
				if(buf[punt[bucle]] == 0) { //No apunta a nada
					if((ninodo = reservar_bloque()) < 0) return -1; //Error RESERVAR_BLOQUE
					if(bwrite(ninodo, buf2) < 0) return -1; //Error ESCRITURA
					buf[punt[bucle]] = ninodo;
					in.cantBloquesOcupados++;
					in.ctime = time(NULL);
					if(bwrite(bfis, buf) < 0) return -1;
				}
				if(bucle == 0) *bfisico = buf[punt[bucle]]; //Es para datos
				bfis = buf[punt[bucle]];
			}
		}
		if(escribir_inodo(in,inodo) < 0) return -1; //Actualizamos el inodo
		return 0;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x590, %rsp            # imm = 0x590
movb %cl, %al
movl %edi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movb %al, -0x19(%rbp)
movl -0x8(%rbp), %esi
leaq -0x120(%rbp), %rdi
callq 0x1f20
movups -0xb0(%rbp), %xmm0
movaps %xmm0, -0x30(%rbp)
movups -0xc0(%rbp), %xmm0
movaps %xmm0, -0x40(%rbp)
movups -0xd0(%rbp), %xmm0
movaps %xmm0, -0x50(%rbp)
movups -0xe0(%rbp), %xmm0
movaps %xmm0, -0x60(%rbp)
movups -0x120(%rbp), %xmm0
movups -0x110(%rbp), %xmm1
movups -0x100(%rbp), %xmm2
movups -0xf0(%rbp), %xmm3
movaps %xmm3, -0x70(%rbp)
movaps %xmm2, -0x80(%rbp)
movaps %xmm1, -0x90(%rbp)
movaps %xmm0, -0xa0(%rbp)
movl $0xc, -0x124(%rbp)
movl $0x100, -0x128(%rbp)    # imm = 0x100
movl -0x128(%rbp), %eax
imull %eax, %eax
movl %eax, -0x12c(%rbp)
movl -0x12c(%rbp), %eax
movl -0x128(%rbp), %ecx
imull %ecx, %eax
movl %eax, -0x130(%rbp)
movl -0x7c(%rbp), %eax
shrl $0xa, %eax
movl %eax, -0x134(%rbp)
movl $0x0, -0x140(%rbp)
movl -0x128(%rbp), %eax
movq %rsp, %rcx
movq %rcx, -0x148(%rbp)
leaq 0xf(,%rax,4), %rdx
andq $-0x10, %rdx
movq %rsp, %rcx
subq %rdx, %rcx
movq %rcx, -0x580(%rbp)
movq %rcx, %rsp
movq %rax, -0x150(%rbp)
movl -0xc(%rbp), %eax
cmpl -0x124(%rbp), %eax
jae 0x3222
movl $0xffffffff, -0x160(%rbp) # imm = 0xFFFFFFFF
jmp 0x33b1
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
cmpl %ecx, %eax
jae 0x325b
movl $0x0, -0x160(%rbp)
movl -0xc(%rbp), %ecx
subl -0x124(%rbp), %ecx
movslq -0x160(%rbp), %rax
movl %ecx, -0x15c(%rbp,%rax,4)
jmp 0x33af
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
addl -0x12c(%rbp), %ecx
cmpl %ecx, %eax
jae 0x32d7
movl $0x1, -0x160(%rbp)
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
subl %ecx, %eax
xorl %edx, %edx
divl -0x128(%rbp)
movl -0x160(%rbp), %eax
subl $0x1, %eax
cltq
movl %edx, -0x15c(%rbp,%rax,4)
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
subl %ecx, %eax
xorl %edx, %edx
divl -0x128(%rbp)
movl %eax, %ecx
movslq -0x160(%rbp), %rax
movl %ecx, -0x15c(%rbp,%rax,4)
jmp 0x33ad
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
addl -0x12c(%rbp), %ecx
addl -0x130(%rbp), %ecx
cmpl %ecx, %eax
jae 0x33ab
movl $0x2, -0x160(%rbp)
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
addl -0x12c(%rbp), %ecx
subl %ecx, %eax
xorl %edx, %edx
divl -0x12c(%rbp)
movl %edx, %eax
xorl %edx, %edx
divl -0x128(%rbp)
movl -0x160(%rbp), %eax
subl $0x2, %eax
cltq
movl %edx, -0x15c(%rbp,%rax,4)
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
addl -0x12c(%rbp), %ecx
subl %ecx, %eax
xorl %edx, %edx
divl -0x12c(%rbp)
movl %edx, %eax
xorl %edx, %edx
divl -0x128(%rbp)
movl %eax, %ecx
movl -0x160(%rbp), %eax
subl $0x1, %eax
cltq
movl %ecx, -0x15c(%rbp,%rax,4)
movl -0xc(%rbp), %eax
movl -0x124(%rbp), %ecx
addl -0x128(%rbp), %ecx
addl -0x12c(%rbp), %ecx
subl %ecx, %eax
xorl %edx, %edx
divl -0x12c(%rbp)
movl %eax, %ecx
movslq -0x160(%rbp), %rax
movl %ecx, -0x15c(%rbp,%rax,4)
jmp 0x33ad
jmp 0x33af
jmp 0x33b1
cmpl $0x0, -0x160(%rbp)
jl 0x34b3
movslq -0x160(%rbp), %rax
cmpl $0x0, -0x44(%rbp,%rax,4)
je 0x34b1
movl $0x1, -0x140(%rbp)
movslq -0x160(%rbp), %rax
movl -0x44(%rbp,%rax,4), %eax
movl %eax, -0x13c(%rbp)
movl -0x160(%rbp), %eax
movl %eax, -0x164(%rbp)
xorl %eax, %eax
cmpl $-0x1, -0x164(%rbp)
movb %al, -0x581(%rbp)
jle 0x3418
cmpl $0x0, -0x140(%rbp)
setne %al
movb %al, -0x581(%rbp)
movb -0x581(%rbp), %al
testb $0x1, %al
jne 0x3427
jmp 0x34af
movq -0x580(%rbp), %rsi
movl -0x13c(%rbp), %edi
callq 0x1380
cmpl $0x0, %eax
jge 0x3454
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movq -0x580(%rbp), %rax
movslq -0x164(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
cmpl $0x0, (%rax,%rcx,4)
jne 0x347b
movl $0x0, -0x140(%rbp)
jmp 0x3499
movq -0x580(%rbp), %rax
movslq -0x164(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
movl (%rax,%rcx,4), %eax
movl %eax, -0x13c(%rbp)
jmp 0x349b
movl -0x164(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x164(%rbp)
jmp 0x33f7
jmp 0x34b1
jmp 0x34d6
movl -0xc(%rbp), %eax
cmpl $0x0, -0x74(%rbp,%rax,4)
je 0x34d4
movl $0x1, -0x140(%rbp)
movl -0xc(%rbp), %eax
movl -0x74(%rbp,%rax,4), %eax
movl %eax, -0x13c(%rbp)
jmp 0x34d6
cmpl $0x0, -0x140(%rbp)
je 0x3501
movl -0x13c(%rbp), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
movl $0x0, -0x4(%rbp)
movl $0x1, -0x168(%rbp)
jmp 0x3883
leaq -0x570(%rbp), %rdi
xorl %esi, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
cmpb $0x0, -0x19(%rbp)
jne 0x3530
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
movl $0x1, -0x168(%rbp)
jmp 0x3883
cmpb $0x0, -0x19(%rbp)
je 0x3877
cmpl $-0x1, -0x160(%rbp)
jne 0x35d2
callq 0x1b90
movl %eax, -0x574(%rbp)
cmpl $0x0, %eax
jge 0x356d
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl -0x574(%rbp), %edi
leaq -0x570(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x359a
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl -0x574(%rbp), %ecx
movl -0xc(%rbp), %eax
movl %ecx, -0x74(%rbp,%rax,4)
movl -0x78(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x78(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x88(%rbp)
movl -0xc(%rbp), %eax
movl -0x74(%rbp,%rax,4), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
jmp 0x37e7
movslq -0x160(%rbp), %rax
cmpl $0x0, -0x44(%rbp,%rax,4)
jne 0x365d
callq 0x1b90
movl %eax, -0x574(%rbp)
cmpl $0x0, %eax
jge 0x3606
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl -0x574(%rbp), %edi
leaq -0x570(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x3633
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl -0x574(%rbp), %ecx
movslq -0x160(%rbp), %rax
movl %ecx, -0x44(%rbp,%rax,4)
movl -0x78(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x78(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x88(%rbp)
movslq -0x160(%rbp), %rax
movl -0x44(%rbp,%rax,4), %eax
movl %eax, -0x13c(%rbp)
movl -0x160(%rbp), %eax
movl %eax, -0x138(%rbp)
cmpl $-0x1, -0x138(%rbp)
jle 0x37e5
movq -0x580(%rbp), %rsi
movl -0x13c(%rbp), %edi
callq 0x1380
cmpl $0x0, %eax
jge 0x36b4
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movq -0x580(%rbp), %rax
movslq -0x138(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
cmpl $0x0, (%rax,%rcx,4)
jne 0x378c
callq 0x1b90
movl %eax, -0x574(%rbp)
cmpl $0x0, %eax
jge 0x36f9
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl -0x574(%rbp), %edi
leaq -0x570(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x3726
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movq -0x580(%rbp), %rax
movl -0x574(%rbp), %edx
movslq -0x138(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
movl %edx, (%rax,%rcx,4)
movl -0x78(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x78(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq -0x580(%rbp), %rsi
movq %rax, -0x88(%rbp)
movl -0x13c(%rbp), %edi
callq 0x1320
cmpl $0x0, %eax
jge 0x378a
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
jmp 0x378c
cmpl $0x0, -0x138(%rbp)
jne 0x37b3
movq -0x580(%rbp), %rax
movslq -0x138(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
movl (%rax,%rcx,4), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
movq -0x580(%rbp), %rax
movslq -0x138(%rbp), %rcx
movl -0x15c(%rbp,%rcx,4), %ecx
movl (%rax,%rcx,4), %eax
movl %eax, -0x13c(%rbp)
movl -0x138(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x138(%rbp)
jmp 0x367a
jmp 0x37e7
movl -0x8(%rbp), %edi
subq $0x80, %rsp
movaps -0x30(%rbp), %xmm0
movq %rsp, %rax
movq %rax, -0x590(%rbp)
movups %xmm0, 0x70(%rax)
movaps -0x40(%rbp), %xmm0
movups %xmm0, 0x60(%rax)
movaps -0x50(%rbp), %xmm0
movups %xmm0, 0x50(%rax)
movaps -0x60(%rbp), %xmm0
movups %xmm0, 0x40(%rax)
movaps -0xa0(%rbp), %xmm0
movaps -0x90(%rbp), %xmm1
movaps -0x80(%rbp), %xmm2
movaps -0x70(%rbp), %xmm3
movups %xmm3, 0x30(%rax)
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x1e40
addq $0x80, %rsp
cmpl $0x0, %eax
jge 0x3864
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x168(%rbp)
jmp 0x3883
movl $0x0, -0x4(%rbp)
movl $0x1, -0x168(%rbp)
jmp 0x3883
jmp 0x3879
movl $0x0, -0x168(%rbp)
movq -0x148(%rbp), %rax
movq %rax, %rsp
movl -0x4(%rbp), %eax
movq %rbp, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop