Subj : sweep
To   : Vitus Jensen
From : Eddy Thilleman
Date : Thu Mar 15 2001 03:55 am

Hello Vitus,

Wednesday 14 March 2001 02:18, Vitus Jensen wrote to Eddy Thilleman:

ET>>>> Borland Pascal as DOS .EXE file and compiled it with Virtual
ET>>>> Pascal/2 v2.1 build 243 as OS/2 .EXE file, and implemented it
ET>>>> also in REXX.
VJ> ...
ET>> another example

ET>> sweep for %a in (*.bak) do echo %a

ET>> The compiled version is easier to use than the REXX variant.

VJ> "easier to use"?  I would expect the rexx variant to be easier to
VJ> code.

Yep, that's the difference. The REXX variant is somewhat easier to code (the
pascal version is not difficult), but I found it more difficult to use the REXX
variant with a "for %a in (*) do..." command (with and without a preceding 'cmd
/c'), because sometimes I get errors, like:

C:\>\os2\rexx\sweep for %a in (*.txt) do echo %a
>> Command >> for %a in (*.txt) do echo %a
>>> Sweep >>> C:\
SYS1079: a was unexpected at this time.
Error?  rc=1

C:\>\os2\rexx\sweep cmd /c for %a in (*.txt) do echo %a
>> Command >> cmd /c for %a in (*.txt) do echo %a
>>> Sweep >>> C:\
SYS1079: a was unexpected at this time.
Error?  rc=1

C:\>\os2\rexx\sweep cmd /c for %%a in (*.txt) do echo %%a
>> Command >> cmd /c for %%a in (*.txt) do echo %%a
>>> Sweep >>> C:\
Error?  rc=31112

C:\>\os2\rexx\sweep cmd /c for %a in (*.txt) do echo %a
>> Command >> cmd /c for %a in (*.txt) do echo %a
>>> Sweep >>> C:\
SYS1079: a was unexpected at this time.
Error?  rc=1


Only one time I managed to get above construct working with the REXX variant.
That's why I wrote the pascal version.

ET>>>> Shall I post the source of all three?
VJ>>> Are you sure it's the screen output?
ET>> No, I'm not certain.
VJ>>> If not, remove screen output from the program and rerun it.

ET>> I've run it without screen output from all the sweep variants
ET>> themselves, the only screen output is by the command run in each
ET>> (sub)directory. The command in the compiled OS/2 version is run
ET>> somewhat slower.

VJ> There are larger gaps between execution in the different directories?

Yes.

VJ> That would mean that searching for directories is slower in VP/2
VJ> which is not to be expected or the startup of every command line takes
VJ> longer (s.b.).

I'm not sure about this.

VJ> (how do you do it?),

FindFirst/FindNext.

Here is the source code of the pascal version:

------------------- begin of sweep.pas -------------------

uses dos;

Var
 i       : byte;
 quiet   : boolean;
 CmdProc : string;
 CmdLine : string;


function RunProg( Prog, Parm: string ): boolean;
begin
 Exec( Prog, Parm );
 if DOSError = 0 then
   RunProg := True
 else
   writeln( 'DOS error #', DOSError );
end;


{$S+}
Procedure AllDirs;
var
 DR : SearchRec;
 Pad: string;

begin
 GetDir( 0, Pad );
 if not quiet then writeln( '>>> SWEEP >>> ' + Pad );
 if RunProg( CmdProc, '/c' + CmdLine ) then
 begin
   FindFirst('*', Directory, DR);
   while (DosError = 0) do
   begin
     if (DR.Attr and Directory) = Directory then
     begin
       if ((DR.Name <> '.') and (DR.Name <> '..')) then
       begin
         ChDir( DR.Name );
         AllDirs;
         ChDir( '..' );
       end
     end;
     FindNext( DR );
   end;
 end;
end;
{$S-}

begin
 quiet := False;
 if ParamCount > 0 then begin
   CmdProc := GetEnv('COMSPEC');
   CmdLine := '';
   for i := 1 to ParamCount do
   begin
     if ((paramstr( i )[1] = '/') or (paramstr( i )[1] = '-')) and
(upcase(paramstr( i )[2]) = 'Q') then
       quiet := True
     else
       CmdLine := CmdLine + ' ' + paramstr( i );
     { /q ? }
   end;  { all parameters }
   writeln( 'command:', CmdLine );
   AllDirs;
 end;
end.
-------------------- end of sweep.pas --------------------

VJ> cmd.exe should already reside in the disk cache so the difference
VJ> should be small or non existent.

VJ> You are executing all commands through cmd.exe when coding in pascal.
VJ> How do you do it in Rexx?

Here is the source code for the REXX variant:

------------------- begin of sweep.cmd -------------------
/*
* A sweep command for OS/2
* Recurses through directories from default and executes a command line
*/

'@echo off'

ARG P1 dummy

if P1 = '-Q' then
 parse arg dummy cl
else do
 P1 = 0
 parse arg cl
end

if cl = '/?' then signal GiveHelp
if cl = '?'  then signal GiveHelp
if cl = '-?' then signal GiveHelp
if cl = ''   then signal GiveHelp

signal on Syntax
signal on Error
signal on Failure
signal on Halt

CRLF = '0D'x || '0A'x

n = setlocal()

say '>> Command >>' cl
call Exec( directory() )

n = endlocal()
return


Exec: procedure expose cl P1
 parse arg path

 newdir = directory( path )
 if newdir = path then
 do
   if P1 \= '-Q' then say '>>> Sweep >>>' directory()
   cl
 end

 Call SysFileTree path || "\*", 'dir', 'D'
 if datatype( dir.0 ) <> "NUM" then dir.0 = 0
 do f = 1 to dir.0
   name = substr( dir.f, 38 )
   if (substr( dir.f, 32, 1 ) = 'D') then    /* directory? */
     call Exec( name )
 end
return


Syntax:
 ErrorNr = rc
 Say 'Line' sigl':' Sourceline(sigl)
 Say 'Error' rc':' Errortext(ErrorNr)
 n = endlocal()
 exit


Failure:
 say 'Failure, rc='rc
 n = endlocal()
 exit


Error:
 say 'Error?  rc='rc
 n = endlocal()
 exit


Halt:
 n = endlocal()
 exit


GiveHelp:
 say 'SWEEP.CMD'
 say ' Performs a command in the current directory and in all its
subdirectories.'
 say ''
 say ' Usage:    Sweep [-Q] command'
 say ''
 say '                  -Q  quiet, don''t display directories'
 exit
-------------------- end of sweep.cmd --------------------

VJ> If you just let the already running copy of cmd.exe handle it we have
VJ> a major difference: a new process for cmd.exe does not have to be
VJ> started. Try to compare the following times,

The DOS pascal version is equally fast as the REXX version, the OS/2 VP/2
version is slower (as I said).

VJ> Rexx:        sweep cmd /C "for %a in (*.bak) do echo %a"

I can't execute this with the REXX version. single commands work with the REXX
version, however.

That's why I just give cd as the single command to all sweep versions.

VJ> Pascal:      sweep for %a in (*.bak) do echo %a

for the pascal version, this is no problem.

Any ideas?


 Greetings   -=Eddy=-

 email: [email protected]
        [email protected]

... Warp 4, Scotty... and close those damn Windows!
--- GoldED/2 3.0.1
* Origin: The only thing more complicated than computers is TAX (2:280/5143.7)