home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / turbopas / tpstr121.arc / SCANFOR.PAS < prev    next >
Pascal/Delphi Source File  |  1989-12-18  |  1KB  |  52 lines

  1. { This is a simple demo for STRINGS.TPU copyright 1989 by Richard Winkel }
  2. program scanfor;
  3. uses strings;
  4. type buftype=array[0..$FFF0] of char;
  5. var i,p,cnt,size,inlen:word;
  6.     fstr:string;
  7.     offset:longint;
  8.     args:string;
  9.     parms:^string;
  10.     dlm:char;
  11.     buf,blkptr:^buftype;
  12.     infile:file;
  13.  
  14. procedure help;
  15. begin
  16.    writeln('Syntax: SCANFOR /target string/ IN file');
  17.    writeln('Finds all occurrances of the target string in the specified file.');
  18.    writeln('Use any unique characters to delimit the target string.');
  19.    halt;
  20. end;
  21.  
  22. begin
  23.    parms:=ptr(prefixseg,$80);
  24.    args:=strip(parms^,'b',' ');
  25.    if (args='?') or (length(args)=0) then help;
  26.    dlm:=args[1];
  27.    i:=firstpos(dlm,args,2); if i=0 then help;
  28.    fstr:=substr(args,2,i-2);
  29.    args:=substr(args,i+1,255);
  30.    if (uppercase(werd(args,1))<>'IN') or (words(args)<>2) then help;
  31.    assign(infile,werd(args,2));
  32.    if maxavail>$FFF1 then size:=$FFF1 else size:=maxavail;
  33.    getmem(buf,size);
  34.    reset(infile,1);
  35.    offset:=0;
  36.    repeat
  37.       blockread(infile,buf^,size,inlen);
  38.       blkptr:=buf; cnt:=inlen;
  39.       repeat
  40.          p:=scanmem(fstr,blkptr,cnt);
  41.          if p<$FFFF then begin
  42.             writeln('Found at file offset ',offset+ofs(blkptr^)+p-ofs(buf^));
  43.             cnt:=cnt-p-1;
  44.             blkptr:=@blkptr^[p+1];
  45.          end;
  46.       until p=$FFFF;
  47.       offset:=offset+inlen;
  48.    until eof(infile);
  49.    close(infile);
  50.    freemem(buf,size);
  51. end.
  52.