Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / TEXT / TextResize

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextResize - Změna velikosti dat textového řetězce

Funkce TextResize změní velikost dat textového řetězce. Jedná se o interní funkci, která je volána ostatními funkcemi obsluhy textů. Funkce nekontroluje referenční čítač, proměnná textového řetězce by měla být jediným vlastníkem dat textového řetězce. K přivlastnění dat textového řetězce lze použít funkci TextCopyWrite.


; -----------------------------------------------------------------------------
;                           Resize text data buffer
; -----------------------------------------------------------------------------
; INPUT:	EAX = required new size of text data buffer (without head)
;		EBX = pointer to TEXT
; OUTPUT:	CY = memory error (content of TEXT not changed)
; NOTES:	Data buffer must be owned by this text string, i.e. reference
;			counter must be 1 (use TextCopyWrite).
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX požadovanou novou velikost textu v datovém bufferu (v bajtech, bez hlavičky dat textového řetězce) a registr EBX obsahuje ukazatel na textovou proměnnou TEXT. V případě chyby nedostatku paměti je navrácen příznak chyby CY, v tom případě není obsah proměnné textového řetězce změněn.


; ------------- Push registers

TextResize:	push	edx		; push EDX
		push	eax		; push EAX

; ------------- Resize text data buffer

		mov	edx,[ebx]	; EDX <- address of data buffer
		add	eax,byte TEXTDATA_size ; EAX <- size of buffer
		TEXTBUFRESIZE		; resize text data buffer
		jc	TextResize2	; memory error

Do funkce EDX si funkce připraví starou adresu datového bufferu a do registru EAX novou velikost datového bufferu, tj. velikost textu včetně hlavičky dat textové proměnné. Pomocí makra TEXTBUFRESIZE je realokován datový buffer. V případě chyby paměti je funkce ukončena s navrácením chybového příznaku CY.


; ------------- Initialize data buffer and pop registers 1

		mov	[ebx],edx	; store new address of data buffer
		pop	eax		; pop EAX (new size of buffer)
		mov	[edx+TEXT_Length],eax ; new length of text
		pop	edx		; pop EDX
		ret			; (here is NC)

; ------------- Pop registers 2

TextResize2:	pop	eax		; pop EAX
		pop	edx		; pop EDX
		ret			; (here is CY)

Nová adresa datového bufferu je uložena do proměnné textového řetězce [EBX]. Do datové struktury textového řetězce se uloží nová délka textu.


Obsah / Utility / TEXT / TextResize