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

Obsah / Utility / TEXT / TextFirst, TextNext

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


TextFirst - Posun ukazatele textu na první znak textu

Funkce TextFirst posune ukazatel v textu na první znak textu. Ukazatelem nemusí být vždy offset 0, pokud začátek textu obsahuje detekční bajty.


; -----------------------------------------------------------------------------
;                    Shift position to first character
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
; OUTPUT:	EDX = position of first character (or end of text if CY)
;		CY = text is empty (EDX = end of text)
; -----------------------------------------------------------------------------

TextFirst:	xor	edx,edx		; EDX <- 0
		dec	edx		; EDX <- -1, minimal position

; TextNext must follow.

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ve které se ukazatel pozice nastavuje. Na výstupu funkce obsahuje registr EDX offset prvního znaku v textu. Pokud je text prázdný (nebo obsahuje pouze detekční bajty), navrátí funkce nastavený příznak chyby CY a registr EDX ukazuje na konec textu.

Funkce přednastaví obsah registru na hodnotu -1 a pokračuje funkcí TextNext, která ukazatel posune na první znak v textu.

TextNext - Posun ukazatele textu na další znak textu

Funkce TextNext posune ukazatel v textu na další znak textu.


; -----------------------------------------------------------------------------
;                      Shift position to next character
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
;		EDX = character position (it can be out of range)
; OUTPUT:	EDX = position of next character (or end of text if CY)
;		CY = no next character (EDX = end of text)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ve které se ukazatel pozice nastavuje. Registr EDX obsahuje vstupní ukazatel pozice (offset v textu), ukazatel může být mimo platný rozsah znaků. Na výstupu funkce obsahuje registr EDX offset dalšího znaku v textu. Pokud není k dispozici žádný další znak, navrátí funkce nastavený příznak chyby CY a registr EDX ukazuje na konec textu.


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

TextNext:	push	eax		; push EAX
		push	ecx		; push ECX
		push	esi		; push ESI

; ------------- Get data and length of text

		mov	esi,[ebx]	; ESI <- data buffer
		mov	ecx,[esi+TEXT_Length] ; ECX <- length of text

; ------------- Check character position

		cmp	edx,ecx		; check character position
		jae	TextNext6	; position is not valid

Do registru ESI se připraví ukazatel na datový buffer textu a do registru ECX délka textu. Porovnáním délky se zadanou výchozí pozicí se ověří, zda zadaná výchozí pozice leží mimo platný rozsah.


; ------------- Increase character position

TextNext2:	inc	edx		; EDX <- increase character position

; ------------- Check character position

TextNext4:	cmp	edx,ecx		; check character position
		cmc			; CY = invalid position
		jc	TextNext5	; position is not valid

; ------------- Check character if it is start of next character

		mov	al,[esi+TEXT_Text+edx] ; AL <- current byte
		cmp	al,0feh		; detection bytes?
		jae	TextNext2	; skip detection bytes
		and	al,0c0h		; mask bits
		cmp	al,80h		; is it first byte of character?
		je	TextNext2	; it is not first byte of character

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

		clc			; clear error flag
TextNext5:	pop	esi		; pop ESI
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

V případě platného ukazatele pozice se ukazatel pozice v registru EDX zvýší o 1. Pokud bylo dosaženo konce textu, funkce se ukončí s navrácením chybového příznaku CY. Jinak načte do registru AL bajt textu z dané pozice. Pokud má hodnotu 0FEh nebo 0FFh, jedná se o detekční bajt, který bude přeskočen, funkce pokračuje posunem na další pozici v textu. Jedná-li se o bajt, jehož nejvyšší 2 bity mají hodnotu 80h, jsou to vnitřní datové bajty znaku a funkce také pokračuje posunem na další znak. Jinak byl nalezen začátek dalšího platného znaku a funkce se úspěšně ukončí.


; ------------- Check minimal character position

TextNext6:	or	edx,edx		; is character position negative?
		js	TextNext8	; character position is negative

; ------------- Character position is behind end of text

		mov	edx,ecx		; EDX <- limit character position
		stc			; set error flag
		jmp	short TextNext5

; ------------- Character position is before start of text

TextNext8:	xor	edx,edx		; EDX <- shift to first position
		jmp	short TextNext4

Pokud byla pozice textu na začátku funkce neplatná, pokračuje se rozlišením, zda ukazatel ukazuje za konec textu nebo před začátek textu. Pokud ukazuje za konec textu, nastaví se ukazatel na konec textu (tj. délku textu) a funkce se ukončí s nastaveným příznakem chyby CY. Pokud ukazuje ukazatel textu před začátek textu, nastaví se výchozí pozice textu na nulu a funkce pokračuje testem platnosti znaku na offsetu 0.


Obsah / Utility / TEXT / TextFirst, TextNext