[Back to FILES SWAG index] [Back to Main SWAG index] [Original]

    PROGRAM HI_There;
    (*   Syntax:  there  textfile  number  /quotedstring
       where textfile is filename, number is a line offset, & quotedstring is a
       group of characters without embedded control codes.  Purpose is to go to a
       given line offset in the text file, search that line for the string, and
       report via DOS error 1=True or 0=False depending upon if it was there.

    Example:  there.exe  there.pas  0  /'program'
       would return error level 1 (True) since 'program' is on the first line.

    Author:  John Howard                                   Date:  January 5, 1994
    Copyright 1994  Howard International,  P.O. Box 34633, NKC, MO 64116

    Restrictions:  You are free to use this program but I retain commercial
                   ownership.  You may not charge someone to use this program.
    Note:          Case sensitive.  Front or Back quote is removed.  No trailing
                   whitespace is removed from the string.  Zero-based line offset.
                   Returns DOS error level values: 0 thru 4 ******* *)
    {$DEFINE debug}
    VAR
       F: text;          (* CHAIN.TXT dropfile used by WWIV BBS *)
       LineNo: word;     (* Line Number from 0..65535 *)
       S: string;        (* Substring of 1..255 characters *)
       CmdLine: string;  (* string[127] command-line string *)

       Test: string;     (* temporary search line *)
       Code: integer;    (* temporary result of VAL conversion *)
       I: word;          (* temporary index of current line *)
       B: byte;          (* temporary index of command-line string *)
    BEGIN { MAIN }
          {$I-}  (* Turn OFF input/output checking to prevent run-time error *)
          (* Open an existing text file *)
          Assign(F, ParamStr(1));
          Reset(F);
          {$I+}  (* Turn ON I/O *)
          if (IOResult <> 0) then Halt(2); {writeln('File not found');}
          (* Get text from command line and convert into a number *)
          Val(ParamStr(2), LineNo, Code);
          if Code <> 0 then Halt(3); {writeln('Bad number at position: ', Code);}
          (* Get quoted string or un-broken string. NO end whitespace removed! *)
          Move(Mem[PrefixSeg:$80], CmdLine, Mem[PrefixSeg:$80] + 1);
          S := CmdLine;
    {$IFDEF debug}                  writeln(S);  {$ENDIF}
          B := Pos( '/', S);
    {$IFDEF debug}                  writeln('CmdLine pos ', B);  {$ENDIF}
          Delete(S, 1, B);
          if S[1] = #39 then Delete(S, 1, 1);                   (* start quote *)
          if S[Length(S)] = #39 then Delete(S, Length(S), 1);   (* end quote *)
          if S = '' then Halt(4); {writeln('Empty string not allowed');}
    {$IFDEF debug}                  writeln('Line: ', LineNo);  {$ENDIF}
    {$IFDEF debug}                  writeln(S);  {$ENDIF}
          (* Go to specified line within text file *)
          I := 0;
          while not Eof(F) do
              begin
              Readln(F, Test);
    {$IFDEF debug}                  writeln(Test);  {$ENDIF}
              if (I = LineNo) then
                 begin
                 if Pos(S, Test) > 0 then
                 (* String S matched substr Test at position *)
                    begin
                    Close(F);
    {$IFDEF debug}                  writeln('True ', I);  {$ENDIF}
                    Halt(1);   (* Return True *)
                    end
                 else
                 (* Search string not found *)
                    begin
                    Close(F);
    {$IFDEF debug}                  writeln('False ', I);  {$ENDIF}
                    Halt(0);   (* Return False *)
                    end;
                 end;
              (* Move to the next line *)
              if (I < 65535) then
                 INC(I)               {I := I + 1}
              else
                 begin
                 Close(F);
                 Halt(0);
                 end;
              end;  {while}
          (* Close the existing text file *)
          Close(F);
          Halt(0);     (* Return False *)
    END.  { MAIN }

[Back to FILES SWAG index] [Back to Main SWAG index] [Original]