home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
tptools.zip
/
FIRSTED.ZIP
/
EDSTRING.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-12-21
|
9KB
|
224 lines
; EDSTRING.ASM
; ED 4.0
; Copyright (c) 1985, 87 by Borland International, Inc.
;
; Primitive string routines for Editor Toolbox
DATA SEGMENT BYTE PUBLIC
DATA ENDS
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE,DS:DATA
PUBLIC EdLongUpCase, EdLongPosFwd, EdLongPosBack
;****************************************************** EdLongUpcase
;procedure EdLongUpcase(var Buffer; Size : Word);
;Fast uppercasing routine. Buffer is a textline or a standard string
;Size is the size of the buffer.
;equates for parameters:
LUSize EQU WORD PTR [BP+6]
LUBuffer EQU DWORD PTR [BP+8]
EdLongUpCase PROC FAR
PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
MOV DX,DS ;Save DS in DX
LDS SI,LUBuffer ;DS:SI points to Buffer
MOV AX,DS ;AX = DS
MOV ES,AX ;ES = DS
MOV DI,SI ;ES:DI points to Buffer
MOV CX,LUSize ;Total size of Buffer
JCXZ LUDone ;Done if CX = 0
INC CX ;Account for junk byte
MOV AH,0DFh ;AH = UpCase mask
MOV BH,'z' ;BH = 'z'
MOV BL,'a' ;BL = 'a'
CLD ;Go forward
LUNext:
LODSB ;Next char into AL
CMP AL,BL ;AL < 'a'?
JB LUNoStore ;If so, don't change the char
CMP AL,BH ;AL > 'z'?
JA LUNoStore ;If so, don't change the char
AND AL,AH ;Else, convert to uppercase
STOSB ;Store the converted character
LOOP LUNext ;Repeat if CX <> 0
JMP LUDone ;Done if CX = 0
LUNoStore:
INC DI ;Skip this character
LOOP LUNext ;Repeat if CX <> 0
LUDone:
MOV DS,DX ;Restore DS from DX
MOV SP,BP ;Restore SP
POP BP ;Restore BP
RET 6 ;Remove parameters and return
EdLongUpcase ENDP
;****************************************************** EdLongPosFwd
;function EdLongPosFwd(var Buffer; Start, Size : Word; var Pattern : VarString) : Word;
;Return the position of pattern in buffer, or 0 if not found
;Buffer is a textline or a standard string
;Start indicates the first character to look at
;equates for parameters:
PFPattern EQU DWORD PTR [BP+6]
PFSize EQU WORD PTR [BP+10]
PFStart EQU WORD PTR [BP+12]
PFBuffer EQU DWORD PTR [BP+14]
EdLongPosFwd PROC FAR
PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
PUSH DS ;Save DS
LES DI,PFBuffer ;ES:DI => Buffer
MOV BX,DI ;BX = Ofs(Buffer)
INC BX ;BX = Ofs(Buffer) + 1
MOV AX,PFStart ;AX = Start
ADD DI,AX ;DI has starting offset
MOV CX,PFSize ;CX = Size of buffer
SUB CX,AX ;CX = Size - Start
INC CX ;CX = (Size - Start) + 1
LDS SI,PFPattern ;DS:SI => Pattern[0]
MOV DL,[SI] ;DL = Length(Pattern)
TEST DL,DL ;Length(Pattern) = 0?
JZ PFError ;If so, we're done
XOR DH,DH ;Clear DH
DEC DL ;DX = Length(Pattern)-1
SUB CX,DX ;CX = Size - (Length(Pattern)-1)
JBE PFError ;Error if Size is less
INC SI ;DS:SI => Pattern[1]
CLD ;Go forward
LODSB ;AL = Pattern[1];
;DS:SI => Pattern[2]
PFNext: ;Search for first character in Pattern
REPNE SCASB ;Search forward for Pattern[1]
JNE PFError ;Done if not found
TEST DX,DX ;If Length = 1 (DX = 0)
JZ PFFound ; the "string" was found
;Search for remainder of Pattern
PUSH CX ;Save CX
PUSH DI ;Save DI
PUSH SI ;Save SI
MOV CX,DX ;CX = Length(Pattern) - 1
REPE CMPSB ;Does rest of string match?
POP SI ;Restore SI
POP DI ;Restore DI
POP CX ;Restore CX
JNE PFNext ;Try again if no match
PFFound: ;Calculate number of bytes searched and return in AX
MOV AX,DI ;AX = Offset where found
SUB AX,BX ;Subtract starting offset
JMP PFDone ;Done
PFError:
XOR AX,AX ;Return 0
PFDone:
POP DS ;Restore DS
MOV SP,BP ;Restore SP
POP BP ;Restore BP
RET 12 ;Remove parameters and return
EdLongPosFwd ENDP
;****************************************************** EdLongPosBack
;function EdLongPosBack(var Buffer; Start : Word; var Pattern : VarString) : Word;
;Return the position of pattern in buffer, or 0 if not found
;Buffer is a textline or a standard string
;Scan backwards from Start to 1
;equates for parameters:
PBPattern EQU DWORD PTR [BP+6]
PBStart EQU WORD PTR [BP+10]
PBBuffer EQU DWORD PTR [BP+12]
EdLongPosBack PROC FAR
PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
PUSH DS ;Save DS
LES DI,PBBuffer ;ES:DI => Buffer
MOV BX,DI ;BX = Ofs(Buffer)
MOV AX,PBStart ;AX = Start
ADD DI,AX ;DI has starting offset
MOV CX,AX ;CX = maximum number of bytes to scan
LDS SI,PBPattern ;DS:SI => Pattern[0]
MOV DL,[SI] ;DL = Length(Pattern)
TEST DL,DL ;Length(Pattern) = 0?
JZ PBError ;If so, we're done
XOR DH,DH ;Clear DH
ADD SI,DX ;DS:SI points to end of Pattern
DEC DX ;DX = Length(Pattern)-1
SUB CX,DX ;CX = Start - (Length(Pattern)-1)
JBE PBError ;Error if Start is less
STD ;Go backwards
LODSB ;AL = Pattern[Length(Pattern)];
;DS:SI => Pattern[Length(Pattern)-1]
PBNext: ;Search for last character in Pattern
REPNE SCASB ;Search backward for char in AL
JNE PBError ;Done if not found
TEST DX,DX ;If Length = 1 (DX = 0)
JZ PBFound ; the "string" was found
;Search for remainder of Pattern
PUSH CX ;Save CX
PUSH DI ;Save DI
PUSH SI ;Save SI
MOV CX,DX ;CX = Length(Pattern) - 1
REPE CMPSB ;Does rest of string match?
POP SI ;Restore SI
POP DI ;Restore DI
POP CX ;Restore CX
JNE PBNext ;Try again if no match
PBFound: ;Calculate number of bytes searched and return in AX
MOV AX,DI ;AX = Offset where last character in
; Pattern was found
SUB AX,DX ;Subtract Length(Pattern) - 1
SUB AX,BX ;Subtract Ofs(Buffer)
INC AX ;Add one to get the relative offset
JMP PBDone ;Done
PBError:
XOR AX,AX ;Return 0
PBDone:
CLD ;Reset direction flag
POP DS ;Restore DS
MOV SP,BP ;Restore SP
POP BP ;Restore BP
RET 10 ;Remove parameters and return
EdLongPosBack ENDP
CODE ENDS
END