// File: /workspace/github_c_makefile_star2_O2/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 $0x938, %rsp            # imm = 0x938
movl %ecx, %r15d
movq %rdx, 0xa8(%rsp)
movl %esi, %ebp
movl %edi, %r13d
leaq 0xb0(%rsp), %rdi
movl %r13d, %esi
callq 0x194e
movq %rsp, %r14
cmpl $0xc, %ebp
jae 0x21b6
movl %ebp, %ebx
movl 0xdc(%rsp,%rbx,4), %r12d
testl %r12d, %r12d
je 0x21fd
movq 0xa8(%rsp), %rax
movl %r12d, (%rax)
xorl %r12d, %r12d
jmp 0x242f
cmpl $0x10b, %ebp            # imm = 0x10B
ja 0x21cf
addl $-0xc, %ebp
movl %ebp, 0x9c(%rsp)
xorl %ebp, %ebp
jmp 0x22b0
cmpl $0x1010b, %ebp          # imm = 0x1010B
ja 0x2273
addl $0xfffffef4, %ebp       # imm = 0xFFFFFEF4
movzbl %bpl, %eax
movl %eax, 0x9c(%rsp)
shrl $0x8, %ebp
movl %ebp, 0xa0(%rsp)
pushq $0x1
jmp 0x22af
leaq 0x530(%rsp), %rdi
movl $0x400, %edx            # imm = 0x400
xorl %esi, %esi
callq 0x10b0
testb %r15b, %r15b
je 0x241f
callq 0x1767
pushq $-0x1
popq %r12
testl %eax, %eax
js 0x242f
movl %eax, %r15d
leaq 0x530(%rsp), %rsi
movl %eax, %edi
callq 0x12e3
testl %eax, %eax
js 0x242f
movl %r15d, 0xdc(%rsp,%rbx,4)
incl 0xd8(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, 0xc8(%rsp)
movq 0xa8(%rsp), %rax
movl %r15d, (%rax)
jmp 0x24b7
cmpl $0x101010b, %ebp        # imm = 0x101010B
ja 0x2194
addl $0xfffefef4, %ebp       # imm = 0xFFFEFEF4
movl $0xff, %eax
movl %ebp, %ecx
andl %eax, %ecx
movl %ecx, 0x9c(%rsp)
movl %ebp, %ecx
shrl $0x8, %ecx
andl %eax, %ecx
movl %ecx, 0xa0(%rsp)
shrl $0x10, %ebp
movl %ebp, 0xa4(%rsp)
pushq $0x2
popq %rbp
movl %ebp, %ebx
movl 0x10c(%rsp,%rbx,4), %r12d
testl %r12d, %r12d
je 0x232f
movl %r13d, 0x8c(%rsp)
movq %r14, 0x90(%rsp)
xorl %eax, %eax
leaq 0x130(%rsp), %r13
movl %ebp, %r14d
testb $0x1, %al
jne 0x2317
testl %r14d, %r14d
js 0x2317
movl %r12d, %edi
movq %r13, %rsi
callq 0x1319
testl %eax, %eax
js 0x2423
movl %r14d, %eax
movl 0x9c(%rsp,%rax,4), %eax
movl 0x130(%rsp,%rax,4), %ecx
testl %ecx, %ecx
sete %al
cmovnel %ecx, %r12d
decl %r14d
jmp 0x22dc
testb $0x1, %al
movq 0x90(%rsp), %r14
movl 0x8c(%rsp), %r13d
je 0x21a3
leaq 0x530(%rsp), %rdi
movl $0x400, %edx            # imm = 0x400
xorl %esi, %esi
callq 0x10b0
testb %r15b, %r15b
je 0x241f
movl 0x10c(%rsp,%rbx,4), %r15d
testl %r15d, %r15d
je 0x2447
movl %r13d, 0x8c(%rsp)
movl 0xd8(%rsp), %eax
movl %eax, 0x90(%rsp)
movq 0xc8(%rsp), %r13
leaq 0x130(%rsp), %r12
testl %ebp, %ebp
js 0x2499
movl %r15d, %edi
movq %r12, %rsi
callq 0x1319
testl %eax, %eax
js 0x242b
movl %ebp, %eax
movl 0x9c(%rsp,%rax,4), %ebx
movl 0x130(%rsp,%rbx,4), %eax
testl %eax, %eax
je 0x23b7
movl %eax, %r15d
jmp 0x2406
callq 0x1767
testl %eax, %eax
js 0x242b
movl %eax, %r13d
movl %eax, %edi
leaq 0x530(%rsp), %rsi
callq 0x12e3
testl %eax, %eax
js 0x242b
movl %r13d, 0x130(%rsp,%rbx,4)
xorl %edi, %edi
callq 0x1120
movq %rax, %r13
movl %r15d, %edi
movq %r12, %rsi
callq 0x12e3
testl %eax, %eax
js 0x242b
incl 0x90(%rsp)
movl 0x130(%rsp,%rbx,4), %r15d
subl $0x1, %ebp
jae 0x2383
movq 0xa8(%rsp), %rax
movl %r15d, (%rax)
jmp 0x2383
pushq $-0x2
jmp 0x242d
movq 0x90(%rsp), %r14
pushq $-0x1
popq %r12
movq %r14, %rsp
movl %r12d, %eax
addq $0x938, %rsp            # imm = 0x938
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
callq 0x1767
pushq $-0x1
popq %r12
testl %eax, %eax
js 0x242f
movl %eax, %r15d
leaq 0x530(%rsp), %rsi
movl %eax, %edi
callq 0x12e3
testl %eax, %eax
js 0x242f
movl %r13d, 0x8c(%rsp)
movl %r15d, 0x10c(%rsp,%rbx,4)
movl 0xd8(%rsp), %eax
incl %eax
movl %eax, 0x90(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, %r13
jmp 0x237b
movl 0x90(%rsp), %eax
movl %eax, 0xd8(%rsp)
movq %r13, 0xc8(%rsp)
movl 0x8c(%rsp), %r13d
pushq $0x10
popq %rcx
leaq 0xb0(%rsp), %rsi
movq %rsp, %rdi
rep  movsq (%rsi), %es:(%rdi)
movl %r13d, %edi
callq 0x18d9
movl %eax, %r12d
sarl $0x1f, %r12d
jmp 0x242f