// File: /workspace/github_c_makefile_star2_O1/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, %ebp
movq %rdx, 0x98(%rsp)
movl %esi, %r15d
movl %edi, %ebx
leaq 0xb0(%rsp), %rdi
movl %ebx, %esi
callq 0x1991
movq %rsp, %rax
cmpl $0xc, %r15d
movq %rax, 0xa8(%rsp)
movl %ebx, 0xa4(%rsp)
movl %ebp, 0x90(%rsp)
jae 0x22b8
movl $0xffffffff, %ebx       # imm = 0xFFFFFFFF
movb $0x1, %bpl
xorl %eax, %eax
jmp 0x2344
cmpl $0x10b, %r15d           # imm = 0x10B
ja 0x22d4
leal -0xc(%r15), %eax
movl %eax, 0x84(%rsp)
xorl %ebp, %ebp
movb $0x1, %al
xorl %ebx, %ebx
jmp 0x2344
cmpl $0x1010b, %r15d         # imm = 0x1010B
ja 0x22ff
leal -0x10c(%r15), %eax
movzbl %al, %ecx
movl %ecx, 0x84(%rsp)
shrl $0x8, %eax
movl %eax, 0x88(%rsp)
movl $0x1, %ebx
jmp 0x233c
cmpl $0x101010b, %r15d       # imm = 0x101010B
ja 0x2342
leal -0x1010c(%r15), %eax
movl $0xff, %ecx
movl %eax, %edx
andl %ecx, %edx
movl %edx, 0x84(%rsp)
movl %eax, %edx
shrl $0x8, %edx
andl %ecx, %edx
movl %edx, 0x88(%rsp)
shrl $0x10, %eax
movl %eax, 0x8c(%rsp)
movl $0x2, %ebx
movb $0x1, %al
xorl %ebp, %ebp
jmp 0x2344
xorl %eax, %eax
testb %al, %al
movl %eax, 0xa0(%rsp)
je 0x23b3
cmpl $0xc, %r15d
setb %cl
movl %ebx, %eax
movl 0x10c(%rsp,%rax,4), %r12d
testl %r12d, %r12d
setne %al
sete %dl
orb %cl, %dl
jne 0x23c4
leaq 0x130(%rsp), %r13
movl %ebx, %r14d
movl %r12d, %edi
movq %r13, %rsi
callq 0x131d
testl %eax, %eax
js 0x25d9
movl %r14d, %eax
movl 0x84(%rsp,%rax,4), %eax
movl 0x130(%rsp,%rax,4), %ecx
testl %ecx, %ecx
setne %al
cmovnel %ecx, %r12d
testl %r14d, %r14d
jle 0x23c4
decl %r14d
testl %ecx, %ecx
jne 0x2378
jmp 0x23c4
movl %r15d, %eax
movl 0xdc(%rsp,%rax,4), %r12d
testl %r12d, %r12d
setne %al
testb %al, %al
je 0x23da
movq 0x98(%rsp), %rax
movl %r12d, (%rax)
xorl %ebp, %ebp
jmp 0x25de
leaq 0x530(%rsp), %rdi
movl $0x400, %edx            # imm = 0x400
xorl %esi, %esi
callq 0x10b0
cmpb $0x0, 0x90(%rsp)
je 0x245b
testb $0x1, %bpl
je 0x2465
callq 0x1786
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
testl %eax, %eax
js 0x25de
movl %eax, %r12d
leaq 0x530(%rsp), %rsi
movl %eax, %edi
callq 0x12e5
testl %eax, %eax
js 0x25de
movl %r15d, %eax
movl %r12d, 0xdc(%rsp,%rax,4)
incl 0xd8(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, 0xc8(%rsp)
movq 0x98(%rsp), %rax
movl %r12d, (%rax)
jmp 0x255e
movl $0xfffffffe, %ebp       # imm = 0xFFFFFFFE
jmp 0x25de
movl %ebx, %r12d
leaq (%rsp,%r12,4), %r15
addq $0x10c, %r15            # imm = 0x10C
cmpl $0x0, (%r15)
je 0x2584
cmpb $0x0, 0xa0(%rsp)
je 0x255e
movl 0xd8(%rsp), %r14d
movq 0xc8(%rsp), %r13
incl %ebx
movl (%r15), %ebp
movl %ebp, %edi
leaq 0x130(%rsp), %rsi
callq 0x131d
testl %eax, %eax
js 0x25c9
movl 0x84(%rsp,%r12,4), %eax
leaq (%rsp,%rax,4), %r15
addq $0x130, %r15            # imm = 0x130
cmpl $0x0, (%r15)
jne 0x2531
movq %r12, 0x90(%rsp)
movq %r13, %r12
callq 0x1786
testl %eax, %eax
js 0x25c6
movl %eax, %r13d
movl %eax, %edi
leaq 0x530(%rsp), %rsi
callq 0x12e5
testl %eax, %eax
js 0x25c6
movl %r13d, (%r15)
incl %r14d
xorl %edi, %edi
callq 0x1120
movq %rax, %r13
movl %ebp, %edi
leaq 0x130(%rsp), %rsi
callq 0x12e5
testl %eax, %eax
movq 0x90(%rsp), %r12
js 0x25c9
subq $0x1, %r12
jae 0x2544
movl (%r15), %eax
movq 0x98(%rsp), %rcx
movl %eax, (%rcx)
decl %ebx
testl %ebx, %ebx
jg 0x249d
movl %r14d, 0xd8(%rsp)
movq %r13, 0xc8(%rsp)
leaq 0xb0(%rsp), %rsi
movl $0x10, %ecx
movq %rsp, %rdi
rep  movsq (%rsi), %es:(%rdi)
movl 0xa4(%rsp), %edi
callq 0x1918
movl %eax, %ebp
sarl $0x1f, %ebp
jmp 0x25de
callq 0x1786
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
testl %eax, %eax
js 0x25de
movl %eax, %r13d
leaq 0x530(%rsp), %rsi
movl %eax, %edi
callq 0x12e5
testl %eax, %eax
js 0x25de
movl %r13d, (%r15)
incl 0xd8(%rsp)
xorl %edi, %edi
callq 0x1120
movq %rax, 0xc8(%rsp)
jmp 0x247d
movq %r12, %r13
movl %r14d, 0xd8(%rsp)
movq %r13, 0xc8(%rsp)
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
movq 0xa8(%rsp), %rsp
movl %ebp, %eax
addq $0x938, %rsp            # imm = 0x938
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop