home *** CD-ROM | disk | FTP | other *** search
- {===========================================================================
- Date: 10-07-93 (13:12)
- From: GUY MCLOUGHLIN
- Subj: Pos-Search Demo
- ---------------------------------------------------------------------------}
-
- {.$DEFINE DebugMode}
-
- {$IFDEF DebugMode}
-
- {$A+,B-,D+,E-,F-,I+,L+,N-,O-,R+,S+,V+}
- {$M 4096,65536,65536}
-
- {$ELSE}
-
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
- {$M 4096,65536,65536}
-
- {$ENDIF}
-
- (* Public-domain Search routine, using the standard TP *)
- (* POS function. Guy McLoughlin - May 16, 1993. *)
- program DemoPosSearch;
-
-
- (***** Force alphabetical characters to uppercase. *)
- (* *)
- procedure UpCaseData({input } var Data;
- wo_Size : word); far; assembler;
- asm
- push ds
- cld
- lds si, Data
- mov di, si
- mov cx, wo_Size
- xor ah, ah
-
- @L1:
- jcxz @END
- lodsb
- cmp al, 'a'
- jb @L2
- cmp al, 'z'
- ja @L2
- sub al, 20h
-
- @L2:
- stosb
- loop @L1
-
- @END:
- pop ds
-
- end; (* UpCaseData. *)
-
-
- (***** PosSearch function. Returns 0 if string is not found. *)
- (* Returns 65,535 if BufferSize is too large. *)
- (* ie: Greater than 65,520 bytes. *)
- (* *)
- function PosSearch({input } var Buffer;
- BuffSize : word;
- Pattern : string;
- ExactCase : boolean) : {output} word;
- type
- arwo_2 = array[1..2] of word;
- arch_255 = array[1..255] of char;
- var
- po_Buffer : ^arch_255;
- by_Temp,
- by_IncSize : byte;
- wo_Index : word;
- begin
- if (BuffSize > 65520) then
- begin
- PosSearch := $FFFF;
- exit
- end;
- by_IncSize := (255 - pred(length(Pattern)));
- po_Buffer := addr(Buffer);
- if NOT ExactCase then
- begin
- UpCaseData(po_Buffer^, BuffSize);
- for wo_Index := 1 to length(Pattern) do
- Pattern[wo_Index] := upcase(Pattern[wo_Index])
- end;
-
- wo_Index := 0;
- repeat
- by_Temp := pos(Pattern, po_Buffer^);
- if (by_Temp = 0) then
- begin
- inc(wo_Index, by_IncSize);
- inc(arwo_2(po_Buffer)[1], by_IncSize)
- end
- else
- inc(wo_Index, by_Temp)
- until (by_Temp <> 0) or (wo_Index > BuffSize);
- if (by_Temp = 0) then
- PosSearch := 0
- else
- PosSearch := wo_Index
- end; (* PosSearch. *)
-
-
- type
- arby_64K = array[1..65520] of byte;
-
- var
- Index : word;
- st_Temp : string[20];
- Buffer : ^arby_64K;
-
- BEGIN
- new(Buffer);
- fillchar(Buffer^, sizeof(Buffer^), 0);
- st_Temp := 'aBcDeFgHiJkLmNoPqRsT';
- move(st_Temp[1], Buffer^[65501], length(st_Temp));
- st_Temp := 'AbCdEfGhIjKlMnOpQrSt';
- Index := PosSearch(Buffer^, sizeof(Buffer^), st_Temp, false);
- writeln(st_Temp, ' found at offset ', Index)
- END.
-