// File: /workspace/github_c_makefile_star2_O3/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x928, %rsp            # imm = 0x928
movl %ecx, %ebp
movq %rdx, %rbx
movl %esi, %r15d
movl %edi, %r12d
leaq 0xa0(%rsp), %rdi
movl %r12d, %esi
callq 0x1995
movq %rsp, %r13
cmpl $0xc, %r15d
movq %rbx, 0x98(%rsp)
jae 0x2210
movl %r15d, %ebx
movl 0xcc(%rsp,%rbx,4), %eax
testl %eax, %eax
je 0x2261
movq 0x98(%rsp), %rcx
movl %eax, (%rcx)
xorl %ebp, %ebp
jmp 0x250b
cmpl $0x10b, %r15d           # imm = 0x10B
ja 0x222c
addl $-0xc, %r15d
movl %r15d, 0x84(%rsp)
xorl %ebx, %ebx
jmp 0x232d
cmpl $0x1010b, %r15d         # imm = 0x1010B
ja 0x22e8
addl $0xfffffef4, %r15d      # imm = 0xFFFFFEF4
movzbl %r15b, %eax
movl %eax, 0x84(%rsp)
shrl $0x8, %r15d
movl %r15d, 0x88(%rsp)
movl $0x1, %ebx
jmp 0x232d
leaq 0x120(%rsp), %rdi
movl $0x400, %edx            # imm = 0x400
xorl %esi, %esi
callq 0x10b0
testb %bpl, %bpl
movq %r13, 0x90(%rsp)
je 0x246d
callq 0x178f
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
testl %eax, %eax
js 0x2503
movl %eax, %r15d
movl %r12d, 0x80(%rsp)
leaq 0x120(%rsp), %rsi
movl %eax, %edi
callq 0x12e5
testl %eax, %eax
js 0x2503
movl %r15d, 0xcc(%rsp,%rbx,4)
incl 0xc8(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, 0xb8(%rsp)
movq 0x98(%rsp), %rax
movl %r15d, (%rax)
jmp 0x24df
cmpl $0x101010b, %r15d       # imm = 0x101010B
ja 0x21f1
addl $0xfffefef4, %r15d      # imm = 0xFFFEFEF4
movl $0xff, %eax
movl %r15d, %ecx
andl %eax, %ecx
movl %ecx, 0x84(%rsp)
movl %r15d, %ecx
shrl $0x8, %ecx
andl %eax, %ecx
movl %ecx, 0x88(%rsp)
shrl $0x10, %r15d
movl %r15d, 0x8c(%rsp)
movl $0x2, %ebx
movl %ebx, %r14d
movl 0xfc(%rsp,%r14,4), %r15d
testl %r15d, %r15d
movl %r12d, 0x80(%rsp)
je 0x2389
leaq 0x520(%rsp), %r12
movl %r15d, %edi
movq %r12, %rsi
callq 0x131d
testl %eax, %eax
js 0x2477
movl %ebx, %eax
movl 0x84(%rsp,%rax,4), %eax
movl 0x520(%rsp,%rax,4), %eax
testl %eax, %eax
cmovnel %eax, %r15d
je 0x2381
leal -0x1(%rbx), %ecx
testl %ebx, %ebx
movl %ecx, %ebx
jg 0x234d
testl %eax, %eax
jne 0x21ff
movq %r13, 0x90(%rsp)
leaq 0x120(%rsp), %rdi
movl $0x400, %edx            # imm = 0x400
xorl %esi, %esi
callq 0x10b0
testb %bpl, %bpl
je 0x246d
leaq (%rsp,%r14,4), %r15
addq $0xfc, %r15
cmpl $0x0, (%r15)
je 0x2481
movl 0xc8(%rsp), %ebx
movq 0xb8(%rsp), %r13
incq %r14
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
movl (%r15), %r12d
movl %r12d, %edi
leaq 0x520(%rsp), %rsi
callq 0x131d
testl %eax, %eax
js 0x2503
movl 0x80(%rsp,%r14,4), %eax
leaq (%rsp,%rax,4), %r15
addq $0x520, %r15            # imm = 0x520
cmpl $0x0, (%r15)
jne 0x245c
callq 0x178f
testl %eax, %eax
js 0x2503
movl %eax, %r13d
movl %eax, %edi
leaq 0x120(%rsp), %rsi
callq 0x12e5
testl %eax, %eax
js 0x2503
movl %r13d, (%r15)
xorl %edi, %edi
callq 0x1120
movq %rax, %r13
movl %r12d, %edi
leaq 0x520(%rsp), %rsi
callq 0x12e5
testl %eax, %eax
js 0x2503
incl %ebx
cmpq $0x1, %r14
je 0x24c3
decq %r14
jg 0x23da
jmp 0x24d0
movl $0xfffffffe, %ebp       # imm = 0xFFFFFFFE
jmp 0x2503
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
jmp 0x250b
callq 0x178f
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
testl %eax, %eax
js 0x2503
movl %eax, %r12d
leaq 0x120(%rsp), %rsi
movl %eax, %edi
callq 0x12e5
testl %eax, %eax
js 0x2503
movl %r12d, (%r15)
incl 0xc8(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, 0xb8(%rsp)
jmp 0x23c3
movl (%r15), %eax
movq 0x98(%rsp), %rcx
movl %eax, (%rcx)
movl %ebx, 0xc8(%rsp)
movq %r13, 0xb8(%rsp)
leaq 0xa0(%rsp), %rsi
movl $0x10, %ecx
movq %rsp, %rdi
rep  movsq (%rsi), %es:(%rdi)
movl 0x80(%rsp), %edi
callq 0x191c
movl %eax, %ebp
sarl $0x1f, %ebp
movq 0x90(%rsp), %r13
movq %r13, %rsp
movl %ebp, %eax
addq $0x928, %rsp            # imm = 0x928
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop