git » orga2-tp1.git » commit 7fe67d3

Implementar strdup2

author Rodrigo Campos
2011-04-15 22:51:05 UTC
committer Rodrigo Campos
2011-04-16 02:11:03 UTC
parent 875eb97d8eb52fc81f6c1c02e0386e0694e275f2

Implementar strdup2

Por las dudas no se valga usar strdup, implementamos strdup2 que deberia
hacer lo mismo :)

bintree.asm +55 -5

diff --git a/bintree.asm b/bintree.asm
index 7e1ca0a..986b359 100644
--- a/bintree.asm
+++ b/bintree.asm
@@ -10,7 +10,7 @@
 
 global insertar, eliminar, destruirArbol, imprimir
 
-extern malloc, free, fopen, fprintf, fclose, strdup
+extern malloc, free, fopen, fprintf, fclose
 
 ; TODO: ver bien que secciones hay y donde corresponde cada cosa
 section .data
@@ -22,9 +22,6 @@ fprintf_newline: db 10, 0
 section .text
 
 ; TODO:
-; copiar el contenido del char* nombre y NO el puntero. Esto afecta a
-; insertar, eliminar y destruirArbol
-;
 ; el mul de eliminar va siempre bien, no ? y el imul ? Ver el manual
 
 
@@ -73,7 +70,7 @@ insertar:
 	; XXX: el unico registro que usamos y no protege la convencion C es dx,
 	; pero ya lo asignamos (el id), asique no nos importa
 	push dword .nom
-	call strdup
+	call strdup2
 	add esp, 4
 	mov .nNom, eax
 
@@ -97,6 +94,59 @@ insertar:
 	pop ebp
 	ret
 
+; char *strdup(char *s)
+strdup2:
+	push ebp
+	mov ebp, esp
+	push edi
+	push esi
+	push ebx
+
+	mov ebx, [ebp + 8]
+
+	; me fijo el tamaƱo del string
+	mov edi, 1
+	mov esi, ebx
+.loop:
+	cmp byte [esi], 0
+	je .gotLargo
+	inc edi
+	inc esi
+	jmp .loop
+
+	; ya se el largo(edi), hago un malloc
+.gotLargo:
+	push edi ; largo del string/cantidad de bytes
+	call malloc
+	add esp, 4
+	cmp eax, 0
+	je .fin
+
+	; ecx: longitud del string (con el \0 final)
+	; ebx: src 
+	; esi: dst
+	mov ecx, edi
+	mov esi, eax
+.copy:
+	cmp ecx, 0
+	je .fin
+
+	mov dl, [ebx]
+	mov byte [esi], dl
+
+	inc esi
+	inc ebx
+	dec ecx
+	jmp .copy
+
+.fin:
+	; en eax ya quedo el char* que creamos
+	pop ebx
+	pop esi
+	pop edi
+	pop ebp
+	ret
+
 
 ; void buscar_e_insertar(nodo **arbol, nodo *n);
 ; asume que *arbol != NULL