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

    Unit ExecPath;

    Interface

    PROCEDURE ExecInPath(line : STRING);

    FUNCTION FindInPath(cmd : STRING): STRING;

    FUNCTION Exist(fn : STRING): BOOLEAN;

    Implementation

    Uses
      Dos;

    FUNCTION Exist(fn : STRING): BOOLEAN;
    VAR
      f : FILE;
      a : WORD;
    BEGIN
      Assign(f,fn);
      GetFAttr(f,a);
      Exist := DosError = 0;
    END;

    FUNCTION FindInPath(cmd : STRING): STRING;
    VAR
      path : STRING;
      Dir : DirStr;
      Name : NameStr;
      Ext : ExtStr;
      p : WORD;
    BEGIN
      FSplit(cmd,Dir,Name,Ext);
      IF Dir <> '' THEN BEGIN
        IF Ext <> '' THEN BEGIN
          cmd := Dir + Name + Ext;
          IF NOT Exist(cmd) THEN cmd := '';
        END
        ELSE BEGIN
          cmd := Dir + Name + '.COM';
          IF NOT Exist(cmd) THEN BEGIN
            cmd := Dir + Name + '.EXE';
            IF NOT Exist(cmd) THEN BEGIN
              cmd := Dir + Name + '.BAT';
              IF NOT Exist(cmd) THEN
                cmd := '';
            END;
          END;
        END;
        FindInPath := cmd;
        Exit;
      END;

      path := '.;'+GetEnv('PATH');

      REPEAT
        p := Pos(';',path);
        IF p = 0 THEN p := Length(path)+1;

        Dir := Copy(path,1,p-1);
        Delete(path,1,p);

        IF Dir[Length(Dir)] <> '\' THEN
          Insert('\',Dir,Length(Dir)+1);

        IF Ext <> '' THEN BEGIN
          cmd := Dir + Name + Ext;
          IF NOT Exist(cmd) THEN
            cmd := '';
        END
        ELSE BEGIN
          cmd := Dir + Name + '.COM';
          IF NOT Exist(cmd) THEN BEGIN
            cmd := Dir + Name + '.EXE';
            IF NOT Exist(cmd) THEN BEGIN
              cmd := Dir + Name + '.BAT';
              IF NOT Exist(cmd) THEN
                cmd := '';
            END;
          END;
        END;
      UNTIL (cmd <> '') OR (path = '');

      FindInPath := cmd;
    END;

    PROCEDURE ExecInPath(line : STRING);
    VAR
      command : PathStr;
      space : WORD;
    BEGIN
      WHILE (Length(line) > 0) AND (line[1] <= ' ') DO Delete(line,1,1);
      IF Length(line) = 0 THEN Exit;
      space := Pos(' ',line);
      IF space = 0 THEN BEGIN
        command := line;
        line := '';
      END
      ELSE BEGIN
        command := Copy(line,1,space-1);
        Delete(line,1,space-1);
      END;

      command := FindInPath(command);

      IF command = '' THEN
        DosError := 123
      ELSE IF Copy(command,Length(command)-3,4) = '.BAT' THEN BEGIN
        SwapVectors;
        Exec(GetEnv('COMSPEC'),'/C '+command+line);
        SwapVectors;
      END
      ELSE BEGIN
        SwapVectors;
        Exec(command,line);
        SwapVectors;
      END;
    END;

    END.

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