home *** CD-ROM | disk | FTP | other *** search
-
- ; MSSTRING.ASM
- ; MS 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, EdLocase
-
- ;****************************************************** 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
-
- ;****************************************************** EdLoCase
-
- ;procedure EdLocase(var S : String);
-
- ;Lower case string as quickly as possible
-
- ;equates for parameters:
- LCStr EQU DWORD PTR [BP+6]
-
- ;constants
- LoCaseMask EQU 20h
-
- EdLoCase PROC FAR
-
- PUSH BP ;Save BP
- MOV BP,SP ;Set up stack frame
- MOV DX,DS ;save DS in DX
- LDS SI,LCStr ;DS:SI points to W[0]
- XOR CH,CH ;CH = 0
- MOV CL,[SI] ;CX = Length(W)
- INC SI ;DS:SI points to W[1]
- MOV AX,DS ;AX = DS
- MOV ES,AX ;ES = DS
- MOV DI,SI ;ES:DI points to W[1]
- CLD ;Go forward
- MOV AH,LoCaseMask ;AH = LoCase mask
- MOV BH,'Z' ;BH = 'Z'
- MOV BL,'A' ;BL = 'A'
- LCNext:
- LODSB ;character into al
- CMP AL,BL ;AL >= 'A'?
- JB LCNoStore ;Do nothing if less than 'A'
- CMP AL,BH ;AL <= 'Z'?
- JA LCNoStore ;Do nothing if greater than 'Z'
- OR AL,AH ;convert to lower case
- STOSB ;store lowercased character
- LOOP LCNext ;Loop while CX <> 0
- JMP LCDone ;Done
- LCNoStore:
- INC DI ;skip character
- LOOP LCNext ;Loop while CX <> 0
- LCDone:
- MOV DS,DX ;restore DS from DX
- MOV SP,BP ;Restore SP
- POP BP ;Restore BP
- RET 4 ;Remove parameter and return
-
- EdLoCase ENDP
-
- CODE ENDS
-
- END