home *** CD-ROM | disk | FTP | other *** search
- {
- Here's a routine that's faster than Pos on my system. It's written
- in external assembly language, and linked directly into TP program
- code. I'm including an example of using the code, the assembly
- source code, and a pre-assembled ready-to-compile POSIN.OBJ file:
-
- Here's the example... }
-
- (*******************************************************************)
- PROGRAM Demo; { A faster Pos() for TP4+. June 17/94 Greg Vigneault }
-
- VAR str : STRING; j : BYTE;
-
- FUNCTION PosIn (Pattern, Str : STRING) : BYTE; EXTERNAL;
- {$L POSIN.OBJ} (* link in the external code *)
-
- BEGIN
- WriteLn;
- str := 'Position of THIS in string is ';
- j := PosIn ('THIS',str);; WriteLn (str,j);
- WHILE (j > 1) DO BEGIN Write (' '); DEC(j); END;
- WriteLn ('^^^^');
- WriteLn;
- END.
- (*******************************************************************)
-
- Here's the assembly code source...
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- code segment byte public 'CODE'
- assume cs:code
- ; FUNCTION PosIn (pattern, string : STRING) : BYTE;
- pattern equ dword ptr 8[bp]
- string equ dword ptr 4[bp]
- PosIn proc near
- public PosIn
- push bp ; preserve
- mov bp, sp
- push ds
- push es
- cld ; assure forward scans
- lds si, pattern ; DS:SI -> pattern
- sub ax, ax ; zero
- lodsb ; get length byte
- test ax, ax ; null string?
- jz done ; yes: exit with zero
- mov dx, ax ; length of pattern
- les di, string ; ES:DI -> string
- sub bx, bx ; zero
- mov bl, es:[di] ; string length
- cmp bx, dx ; pattern > string ?
- jc none ; yes: exit with zero
- inc di ; point to 1st string char
- lodsb ; get pattern 1st char
- dec dx ; adjust pointer
- sub bx, dx ; don't need to check end
- po0: mov cx, bx ; unsearched chars count
- repne scasb ; search for pattern char
- jne none ; no char match
- mov bx, cx ; unsearched count
- push di ; save text pointers
- push si
- mov cx, dx ; length of pattern
- repe cmpsb ; check for pattern
- pop si ; restore pointers
- pop di
- jne po0 ; loop if no pattern match
- lds ax, string ; string pointer
- xchg ax, di ; swap offsets
- sub ax, di ; subtract offsets
- dec ax ; adjust for PosIn
- jmp short done ; found pattern
- none: sub ax, ax ; pattern not found
- done: pop es ; restore
- pop ds
- mov sp, bp
- pop bp
- ret 8
- PosIn endp
- code ends
- end
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- USE XX3402 to decode this and obtain POSIN.OBJ requried for this unit.
-
- *XX3402-000140-170694--72--85-37398-------POSIN.OBJ--1-OF--1
- U+g+0L-jQqZi9Y3HHHGK-k++-2BDF2J2a+Q+82U++U6-v7+A+++--J-DIoZC++++pMU2++0W
- +R4UH++-++-JWykS-jn3RUUfk8m3k5EkWx12TUEfqmO85HjOQW-5f2cfqcj9wetp3MjNJpO9
- mjCaLZxpvgJ4-7QfloXf+Wj+-ly9tJr00+1nWU6++5E+
- ***** END OF BLOCK 1 *****
-