git » orga2-tp1.git » commit 909facd

Implementar imprimir

author Rodrigo Campos
2011-04-14 03:30:16 UTC
committer Rodrigo Campos
2011-04-14 03:30:16 UTC
parent 8bec9b884af75a6041a95ef72ee677a256897c47

Implementar imprimir

bintree.asm +107 -2
test.c +6 -5

diff --git a/bintree.asm b/bintree.asm
index 615d8e0..1f6d18b 100644
--- a/bintree.asm
+++ b/bintree.asm
@@ -8,10 +8,18 @@
 %define off_izq 10
 %define off_der 14
 
-extern malloc, free
+global insertar, eliminar, destruirArbol, imprimir
+
+extern malloc, free, fopen, fprintf, fclose
+
+; TODO: ver bien que secciones hay y donde corresponde cada cosa
+section .data
+
+append_mode: db 'a', 0
+fprintf_format: db '[ %d %f %s ]', 0
+fprintf_newline: db 10, 0
 
 section .text
-global insertar, eliminar, destruirArbol, imprimir
 
 insertar:
 	push ebp
@@ -476,7 +484,104 @@ imprimir:
 	push esi
 	push ebx
 
+	push dword append_mode; char*, modo append, 2º param
+	; XXX: esto es "memoria a memoria" y anda. Por que ?
+	push dword [ebp + 12] ; char* path, 1º param
+	call fopen
+	add esp, 8
+	; si devuelve error (NULL), salimos
+	cmp eax, 0
+	je .fin
+
+	; guardo el FILE* en ebx
+	mov ebx, eax
+
+	push ebx; FILE*, 2º param
+	push dword [ebp + 8] ; nodo*, 1º param
+	call imprimirArbol
+	add esp, 8
 
+	; pongo un '\n' al final
+	push dword fprintf_newline
+	push ebx
+	call fprintf
+	add esp, 8
+	cmp eax, 0
+	je .fin
+
+	; cerramos el FILE*
+	push ebx
+	call fclose
+	add esp, 4
+	; si devolvio error(!=0) salimos
+	cmp eax, 0
+	jne .fin
+
+.fin:
+	pop ebx
+	pop esi
+	pop edi
+	pop ebp
+	ret
+
+; void imprimir(nodo *arbol, FILE *archivo);
+imprimirArbol:
+	push ebp
+	mov ebp, esp
+	push edi
+	push esi
+	push ebx
+
+	mov edi, [ebp + 8]; nodo* arbol
+	%define .nId [edi + off_id]
+	%define .nNom [edi + off_nom]
+	%define .nPun [edi + off_puntaje]
+	%define .nIzq [edi + off_izq]	
+	%define .nDer [edi + off_der]	
+
+	mov ebx, [ebp + 12]; file* archivo
+
+	; el nodo vacio no se imprime
+	; TODO: checkear como se debe imprimir el arbol vacio
+	cmp edi, 0
+	je .fin
+
+	; imprimir inorder es: imprimir el subarbol izquierdo, el nodo actual y
+	; luego el subarbol derecho
+
+	; Imprimo el subarbol izquierdo
+	push ebx ; FILE*, 2º param
+	push dword .nIzq ; nodo*, 1º param
+	call imprimirArbol
+	add esp, 8
+
+	; Me imprimo yo
+	push dword .nNom
+
+	fld dword .nPun
+	sub esp, 8
+	fstp qword [esp]
+
+	mov eax, 0
+	mov ax, .nId
+	push eax
+
+	push dword fprintf_format ; formato
+	push ebx ; FILE*, 1º param
+	call fprintf
+	add esp, 24
+
+	; si devolvio error salimos
+	cmp eax, 0
+	jl .fin
+
+	; Imprimo el subarbol derecho
+	push ebx ; FILE*, 2º param
+	push dword .nDer ; nodo*, 1º param
+	call imprimirArbol
+	add esp, 8
+
+.fin:
 	pop ebx
 	pop esi
 	pop edi
diff --git a/test.c b/test.c
index 508ccb4..a207fe5 100644
--- a/test.c
+++ b/test.c
@@ -25,11 +25,11 @@ int main()
 
 
 	nodo *e = NULL;
-	insertar(&e, "nodoe", 32, 7.5);
-	insertar(&e, "nodoe", 30, 7.5);
-	insertar(&e, "nodoe", 34, 7.5);
+	insertar(&e, "nodo1", 32, 7.5);
+	insertar(&e, "nodo2", 30, 7.5);
+	insertar(&e, "nodo3", 34, 7.5);
 
-	insertar(&e, "nodoe", 31, 7.5);
+	insertar(&e, "nodo4", 31, 7.5);
 
 	
 	printf("31 == %d\n", e->izq->der->id);
@@ -48,7 +48,8 @@ int main()
 //	eliminar(&e, 30);
 //	eliminar(&e, 31);
 //	eliminar(&e, 34);
-	destruirArbol(e);
+	//destruirArbol(e);
 
+	imprimir(e, "farbol");
 	return 0;
 }