Index: freexp/touch.inc =================================================================== RCS file: /server/cvs/freexp/touch.inc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- freexp/touch.inc 6 Nov 2004 21:56:42 -0000 1.1 +++ freexp/touch.inc 18 Nov 2004 16:04:11 -0000 1.2 @@ -14,26 +14,47 @@ { finden Sie in der Datei TOUCH.TXT oder auf } { http://www.martinwodrich.de/Software/Touch/nutzung.htm } { --------------------------------------------------------------- } -{ $Id: touch.inc,v 1.1 2004/11/06 21:56:42 mw Exp $ } +{ $Id: touch.inc,v 1.2 2004/11/18 16:04:11 mw Exp $ } { Erstmal einiges definieren } { Borland Pascal 7.0 oder 8.0 } {$IFDEF VER70 } {$DEFINE BP} - {$DEFINE BPLFN} -{$ENDIF } -{$IFDEF VER80 } - {$DEFINE BP} - {$DEFINE BPLFN} + {$IFNDEF WINDOWS} + {$IFNDEF DPMI} + {$IFNDEF OS2} + {$DEFINE BPLFN} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ELSE} + {$IFDEF VER80 } + {$DEFINE BP} + {$IFNDEF WINDOWS} + {$IFNDEF DPMI} + {$IFNDEF OS2} + {$DEFINE BPLFN} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ELSE} + { FreePascal } + {$IFDEF DPMI} + {$UNDEF DPMI} + {$DEFINE DOS32} + {$ENDIF} + {$ENDIF } {$ENDIF } { Andere Compiler brauchen momentan keine Extras } { $Log: touch.inc,v $ + Revision 1.2 2004/11/18 16:04:11 mw + MW: - Update auf Touch 1.2 + Revision 1.1 2004/11/06 21:56:42 mw MW: - šbernahme von TOUCH 1.1b: - Interne Žnderung, um NON-LFN-Versionen leichter zu realisieren. - } \ No newline at end of file Index: freexp/touch.pas =================================================================== RCS file: /server/cvs/freexp/touch.pas,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- freexp/touch.pas 9 Nov 2004 10:56:11 -0000 1.18 +++ freexp/touch.pas 18 Nov 2004 16:04:11 -0000 1.19 @@ -14,13 +14,13 @@ { finden Sie in der Datei TOUCH.TXT oder auf } { http://www.martinwodrich.de/Software/Touch/nutzung.htm } { --------------------------------------------------------------- } -{ $Id: touch.pas,v 1.18 2004/11/09 10:56:11 mw Exp $ } +{ $Id: touch.pas,v 1.19 2004/11/18 16:04:11 mw Exp $ } program touch; {$I TOUCH.INC } { Betriebsystemabhaeniges } {$IFNDEF WINDOWS } -{$IFDEF OS2 } +{$IFDEF VPOS2} uses use32,dos,crt; {$ELSE } uses dos,crt{$IFDEF BPLFN},touchlfn{$ENDIF}; @@ -29,6 +29,63 @@ uses windos,wincrt,strings; {$ENDIF } +const anyfile=$21; + {$IFNDEF DPMI} + {$IFNDEF unix} + beta='.1'; {Patchlevel 1} + {$ELSE} + !!! Touch 1.2 läuft nicht auf unixartigen Betriebsystemen !! + beta=' Alpha 5'; + {$ENDIF} + {$ELSE} + beta=' Alpha 5'; + {$ENDIF} + version='1.2'+beta; + touchname='Touch '+version; + copyright=' (c) 2003-2004 by Martin Wodrich'; + + { Betriebsystemstrings } + {$IFDEF MSDOS} + {$IFDEF BPLFN} + pform = ' (DOS16,LFN)'; + {$ELSE} + pform = ' (DOS16,NON LFN)'; + {$ENDIF} + {$ENDIF} + {$IFDEF DPMI} + pform = ' (DPMI16)'; + {$ENDIF} + {$IFDEF WINDOWS} + pform = ' (WIN16)'; + {$ENDIF} + {$IFDEF Dos32} + pform = ' (DOS32)'; + {$ENDIF} + {$IFDEF Win32} + pform = ' (WIN32)'; + {$ENDIF} + {$IFDEF Linux} + pform = ' (Linux)'; + {$ENDIF} + {$IFDEF OS2} + {$IFDEF BP} + pform = ' (OS2,16 Bit)'; + {$ELSE} + pform = ' (OS2,EMX)'; + {$ENDIF} + {$ENDIF} + + { Betriebsystemabhängiges } + {$IFNDEF unix} + OSDirSeparator = '\'; + Paramark = '/'; + CR=''; + {$ELSE} + OSDirSeparator = '/'; + Paramark = '-'; + CR=#13; + {$ENDIF} + type macrop = ^macro; macro = record @@ -36,21 +93,19 @@ next : macrop; end; -const anyfile=$21; - version='1.1d'; - var f:file; g:text; {$IFDEF WINDOWS } dt : TDateTime; DirInfo : TSearchRec; - FName : String[79]; + FName,own : String[79]; FNamep : Array[0..79] of Char; Dir : Array[0..67] of Char; Name : Array[0..8] of Char; Ext : Array[0..4] of Char; sp : Array[0..255] of Char; reffile : String[79]; + nc : boolean; {$ELSE } dt : DateTime; DirInfo : SearchRec; @@ -66,16 +121,20 @@ ftime : Longint; ref : boolean; s,u : string[100]; - sim : boolean; + sim,zcout : boolean; files : byte; st,n : macrop; dateSet,timeSet : boolean; findone,uc,nt : boolean; +{$IFNDEF WINDOWS} function ownfile:Pathstr; +{$ELSE} +function ownfile:String; +{$ENDIF} begin FName:=paramstr(0); - {$IFDEF WINDOWS } + {$IFDEF WINDOWS } StrPCopy(fnamep,fname); FileExpand(Dir,fnamep); StrCopy(Dir,fnamep); @@ -88,67 +147,99 @@ procedure logo; begin - writeln ('Touch '+version+' (c) 2003-2004 by Martin Wodrich'); - writeln (''); + {$IFNDEF WINDOWS} + writeln (touchname+pform+copyright+CR); + writeln (''+CR); + {$ELSE} + StrCopy(WindowTitle,touchname+pform+copyright); + {$ENDIF} own:=ownfile; end; procedure StandardIO; -BEGIN - ASSIGN( Input, '' ); - RESET( Input ); - ASSIGN( Output, '' ); - REWRITE( Output ); -END; +begin + assign( Input, '' ); + reset( Input ); + assign( Output, '' ); + rewrite( Output ); +end; procedure hilfe; +var i:char; begin - writeln ('Parameter fehlt'); - writeln (''); - writeln ('touch file1 file2 ... /t=hh:mm:ss /d=tt.mm.[yy]yy /r=refdatei /H /S /V /G /K'); + writeln ('Parameter fehlt'+CR); + writeln (''+CR); + writeln ('touch file1 file2 ... '+Paramark+'T=hh:mm:ss '+Paramark+'D=tt.mm.[yy]yy '+ + Paramark+'R=refdatei '+Paramark+'H '+Paramark+'S '+Paramark+'V '+ + Paramark+'G '+Paramark+'K'+CR); write (' '); {$IFDEF BPLFN} - write('/LFN '); - {$ENDIF} - writeln (''); - writeln (''); - writeln ('Macros:'); + write(Paramark+'LFN '); + {$ENDIF} + {$IFDEF WINDOWS} + write(Paramark+'NC '); + {$ENDIF} + writeln (Paramark+'J=Jobfile '+Paramark+'ZC '+Paramark+'I '+CR); + writeln (''+CR); + writeln ('Macros:'+CR); {$IFDEF BP} - writeln (' #: jedes Laufwerk'); + writeln (' #: jedes Laufwerk'+CR); {$ENDIF} - writeln (' \#\ jeder Verzeichnis einschliesslich gar keins'); - writeln (' \##\ und das ganze nochmals rekursiv'); - writeln (' # Das aktuelle Verzeichnis und alle alle Dateien in direkten'); - writeln (' Unterverzeichnissen touchen'); - writeln (' ## Alle Dateien die im aktuellen Verzeichnis und rekursiv in'); - writeln (' allen Unterverzeichnissen'); + writeln (' '+OSDirSeparator+'#'+OSDirSeparator+ + ' jeder Verzeichnis einschliesslich gar keins'+CR); + writeln (' '+OSDirSeparator+'##'+OSDirSeparator+ + ' und das ganze nochmals rekursiv'+CR); + writeln (' # Das aktuelle Verzeichnis und alle alle Dateien in direkten'+CR); + writeln (' Unterverzeichnissen touchen'+CR); + writeln (' ## Alle Dateien die im aktuellen Verzeichnis und rekursiv in'+CR); + writeln (' allen Unterverzeichnissen'+CR); {$IFDEF BP} - writeln (' ### alle verfuegbaren Dateien (Vorsicht: Auf eigene Gefahr!!!)'); + writeln (' ### alle verfuegbaren Dateien (Vorsicht: Auf eigene Gefahr!!!)'+CR); {$ENDIF} - writeln (''); - writeln (' /t=Zeitangabe /d=Datum das gesetzt werden soll'); - writeln (' /H auch versteckte Dateien'); - writeln (' /S auch Systemdateien'); - writeln (' /V Vortaeuschmodus (Simulationslauf)'); - writeln (' /G Dateien in Grossbuchstaben wandeln'); - writeln (' /K (nur bei /G wirksam) Dateidatum und Uhrzeit beibehalten'); + writeln (''+CR); + writeln (' '+Paramark+'T=Zeitangabe Zeit, auf das die Dateizeit gesetzt werden soll.'+CR); + writeln (' '+Paramark+'D=Datum Datum, auf das das Dateidatum gesetzt werden soll.'+CR); + writeln (' '+Paramark+'R=reffile Referenzdatei verwenden'+CR); + writeln (' '+Paramark+'H auch versteckte Dateien'+CR); + writeln (' '+Paramark+'S auch Systemdateien'+CR); + writeln (' '+Paramark+'V Vortaeuschmodus (Simulationslauf)'+CR); + writeln (' '+Paramark+'G Dateien in Grossbuchstaben wandeln'+CR); + writeln (' '+Paramark+'K (nur bei '+Paramark+'G wirksam) Dateidatum und Uhrzeit beibehalten'+CR); + writeln ('Weiter mit beliebiger Taste'+CR); + i:=Readkey; {$IFDEF BPLFN} - writeln (' /LFN lange Dateinamen benutzen (Vorsicht: Nur einschalten wenn unterstuetzt'); + writeln (' '+Paramark+'LFN lange Dateinamen benutzen (Vorsicht: Nur bei Verwendung'+CR); + writeln (' eines Betriebsystems benutzen, das in seiner DOS-Emulation'+CR); + writeln (' lange Dateinamen unterstuetzt z.B. Windows ab 95'+CR); + {$ENDIF} + {$IFDEF WINDOWS} + writeln (' '+Paramark+'NC Konsolenfenster nicht schliessen'+CR); {$ENDIF} + writeln (' '+Paramark+'J=Jobfile Dateiliste verwenden, statt lange Argumentliste'+CR); + writeln (' '+Paramark+'ZC Neue Dateien als ZConnect-PUFFER erstellen'+CR); + writeln (' '+Paramark+'I Interaktiver Modus (Lesen der Dateiinfos von Standard-Input)'+CR); end; procedure isok(meldung:integer); begin if t<>0 then begin case meldung of - 1: Writeln('Datumsangabe ungueltig'); - 2: Writeln('Zeitangabe ungueltig'); + 1: Writeln('Datumsangabe ungueltig'+CR); + 2: Writeln('Zeitangabe ungueltig'+CR); end; halt(1); end; end; -{$IFNDEF WINDOWS } +procedure newmacro; +begin + {Dateien und Macros speichern} + NEW(n); + n^.text:=s; + n^.next:=st; + st:=n; +end; + function ismacro:boolean; var re :boolean; begin @@ -156,9 +247,9 @@ {Alle Laufwerke touchen} if (copy(s,1,2)='#:') then re:=true; {\#\ = keines oder beliebiges Verzeichnis} - if pos('\#\',s)<>0 then re:=true; + if pos(OSDirSeparator+'#'+OSDirSeparator,s)<>0 then re:=true; {\##\ Rekursives Verzeichnisladen} - if pos('\##\',s)<>0 then re:=true; + if pos(OSDirSeparator+'##'+OSDirSeparator,s)<>0 then re:=true; {# entspricht .\#\*.*} if s='#' then re:=true; {## entspricht .\##\*.*} @@ -168,15 +259,6 @@ ismacro:=re; end; -procedure newmacro; -begin - {Dateien und Macros speichern} - NEW(n); - n^.text:=s; - n^.next:=st; - st:=n; -end; - procedure exmacro; const test='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var x,y : string[79]; @@ -192,14 +274,14 @@ begin y:=test; -writeln('Expandiere Makro: '+s); +writeln('Expandiere Makro: '+s+CR); if (copy(s,1,2)='#:') then begin {$IFDEF BP} if s<>'#:' then begin for i:=1 to 26 do begin {Alle Laufwerke touchen} {$I-} - assign(f,y[i]+':\touch.$$$'); + assign(f,y[i]+':'+OSDirSeparator+'touch.$$$'); rewrite(f); {$I+} if ioresult=0 then begin @@ -208,16 +290,17 @@ close(f); erase(f); end; - end; - end; + end; + end; {$ENDIF} end - else if pos('\#\',s)<>0 then begin + else if pos(OSDirSeparator+'#'+OSDirSeparator,s)<>0 then begin {# = keines oder beliebiges Verzeichnis} - x:=copy(s,1,pos('\#\',s))+copy(s,pos('\#\',s)+3,255); + x:=copy(s,1,pos(OSDirSeparator+'#'+OSDirSeparator,s))+ + copy(s,pos(OSDirSeparator+'#'+OSDirSeparator,s)+3,255); NewEntry; - y:=copy(s,1,pos('\#\',s)); - x:=copy(s,1,pos('\#\',s))+'*.*'; + y:=copy(s,1,pos(OSDirSeparator+'#'+OSDirSeparator,s)); + x:=copy(s,1,pos(OSDirSeparator+'#'+OSDirSeparator,s))+'*.*'; {$IFDEF WINDOWS } StrPCopy(sp,x); Findfirst(sp,$10,DirInfo); @@ -229,10 +312,11 @@ {$ENDIF} {$ENDIF} while DosError=0 do - begin + begin z:=(DirInfo.Attr and $10); if ((DirInfo.Name[1]<>'.') and (z=$10)) then begin - x:=y+DirInfo.Name+'\'+copy(s,pos('\#\',s)+3,255); + x:=y+DirInfo.Name+OSDirSeparator+copy(s,pos(OSDirSeparator+'#'+ + OSDirSeparator,s)+3,255); NewEntry; end; {$IFNDEF BPLFN} @@ -242,16 +326,17 @@ {$ENDIF} end; end - else if pos('\##\',s)<>0 then begin + else if pos(OSDirSeparator+'##'+OSDirSeparator,s)<>0 then begin {## = keines oder beliebiges Verzeichnis recursiv} - x:=copy(s,1,pos('\##\',s))+copy(s,pos('\##\',s)+4,255); + x:=copy(s,1,pos(OSDirSeparator+'##'+OSDirSeparator,s))+ + copy(s,pos(OSDirSeparator+'##'+OSDirSeparator,s)+4,255); NewEntry; - y:=copy(s,1,pos('\##\',s)); - x:=copy(s,1,pos('\##\',s))+'*.*'; + y:=copy(s,1,pos(OSDirSeparator+'##'+OSDirSeparator,s)); + x:=copy(s,1,pos(OSDirSeparator+'##'+OSDirSeparator,s))+'*.*'; {$IFDEF WINDOWS } StrPCopy(sp,x); Findfirst(sp,$10,DirInfo); - {$ELSE } + {$ELSE } {$IFNDEF BPLFN} Findfirst(x,$10,DirInfo); {$ELSE} @@ -262,7 +347,8 @@ begin z:=(DirInfo.Attr and $10); if ((DirInfo.Name[1]<>'.') and (z=$10)) then begin - x:=y+DirInfo.Name+'\##\'+copy(s,pos('\##\',s)+4,255); + x:=y+DirInfo.Name+OSDirSeparator+'##'+OSDirSeparator+ + copy(s,pos(OSDirSeparator+'##'+OSDirSeparator,s)+4,255); NewEntry; end; {$IFNDEF BPLFN} @@ -273,21 +359,20 @@ end; end else if s='#' then begin - x:='.\#\*.*'; + x:='.'+OSDirSeparator+'#'+OSDirSeparator+'*.*'; NewEntry; end else if s='##' then begin - x:='.\##\*.*'; - NewEntry; + x:='.'+OSDirSeparator+'##'+OSDirSeparator+'*.*'; + NewEntry; end else if s='###' then begin {$IFDEF BP} - x:='#:\##\*.*'; + x:='#:'+OSDirSeparator+'##'+OSDirSeparator+'*.*'; NewEntry; {$ENDIF} end; end; -{$ENDIF} function Testtime(ftime:longint;dateset,timeset:boolean):longint; var foldtime:longint; @@ -332,7 +417,7 @@ if fname[i]='*' then t:=false; if fname[i]='?' then t:=false; end; - if (fname[length(fname)]='\') then t:=false; + if (fname[length(fname)]=OSDirSeparator) then t:=false; {weitere Wildcards?} isnoWild:=t; end; @@ -357,8 +442,14 @@ sim:=false; uc:=false; nt:=false; + zcout:=false; + randomize; + {$IFDEF WINDOWS} + nc:=false; + {$ENDIF} end; +{$IFDEF BPLFN} function LFNuseage:boolean; var t:boolean; i:integer; @@ -376,29 +467,84 @@ s:=''; u:=ParamStr(i); for j:=1 to 4 do s:=s+upcase(u[j]); - if s='/LFN' then t:=true; + if s=Paramark+'LFN' then t:=true; end; LFNuseage:=t; end; end; +{$ENDIF} +function strs(v:integer):string; +var s:string; begin - {$IFNDEF BP } - {$IFDEF WINDOWS } - {$M 65520,65520} + str(v,s); + strs:=s; +end; + +procedure ZC; +begin + writeln(g,'EMP: /TEST'+CR); + writeln(g,'ABS: [EMAIL PROTECTED]'+CR); + writeln(g,'BET: Testnachricht '+touchname+pform+CR); + writeln(g,'EDA: '+strs(dt.Year)+strs(dt.Month)+strs(dt.Day)+ + strs(dt.Hour)+strs(dt.Min)+strs(dt.Sec)+ + 'W+0'+CR); + writeln(g,'MID: '+strs(dt.Year)+strs(dt.Month)+strs(dt.Day)+ + strs(dt.Hour)+strs(dt.Min)+strs(dt.Sec)+ + '.'+strs(random(10))+strs(random(10))+strs(random(10))+strs(random(10))+ + strs(random(10))+strs(random(10))+strs(random(10))+strs(random(10))+'@touch.invalid'+CR); + writeln(g,'ROT: touch.invalid!test'+CR); + writeln(g,'MAILER: '+touchname+pform+CR); + writeln(g,'LEN: 30'+CR); + writeln(g,''+CR); + writeln(g,'Dies ist eine Testnachricht.'+CR); +end; + +function validparm:boolean; +begin + {$IFDEF WINDOWS} + if ((ParamCount = 1) and ((ParamStr(1)=Paramark+'NC') or (ParamStr(1)=Paramark+'nc'))) then begin + validparm:=false; + nc:=true; + end + else validparm:=true; {$ELSE} - {$M 65520} - {$ENDIF } + validparm:=true; + {$ENDIF} +end; + +begin + {$IFNDEF BP } + { FreePascal } + {$IFDEF WINDOWS } + {$M 65520,655360} + {$ELSE} + {$M 65520} + {$ENDIF } {$ELSE } - {$M 65520,0,655360} + { Borland Pascal } + {$IFDEF MSDOS} + {$M 65520,0,655360} + {$ENDIF} + {$IFDEF DPMI} + {$M 65520} + {$ENDIF} + {$IFDEF WINDOWS} + {.$M 65520,655360} + {$ENDIF} {$ENDIF } {$IFDEF BPLFN} if LFNuseage then EnableLFN; {$ENDIF} + {$IFDEF WINDOWS} + logo; + InitWinCrt; + {$ELSE} StandardIO; logo; + {$ENDIF} init_touch; - if ParamCount = 0 then hilfe + if ((ParamCount = 0) or (validparm=false)) then hilfe else begin {Aktuelle Uhrzeit ermitteln} @@ -409,8 +555,9 @@ for i:=1 to paramcount do begin s:=ParamStr(i); - if (copy(s,1,1)='/') then begin + if (copy(s,1,1)=Paramark) then begin s[2]:=UpCase(s[2]); + s[3]:=UpCase(s[3]); {Parameter gefunden} if (copy(s,2,2)='T=') then begin {Uhrzeit lesen} @@ -426,7 +573,7 @@ val(s,se,t); isok(2); if (((h<0) or (h>23)) or ((mi<0) or (mi>59)) or ((se<0) or (se>59))) then begin - writeln('Zeitangabe ungueltig'); + writeln('Zeitangabe ungueltig'+CR); halt(1); end; timeSet:=true; @@ -445,7 +592,7 @@ val(s,y,t); isok(1); if (((d<1) or (d>31)) or ((mo<1) or (mo>12)) or ((y<0) or ((y>99) and ((y<1980) or (y>2107))))) then begin - Writeln('Datumsangabe ungueltig'); + Writeln('Datumsangabe ungueltig'+CR); halt(1); end; dateSet:=true; @@ -457,10 +604,17 @@ {Simulationslauf} if (copy(s,2,1)='V') then begin sim:=true; - writeln ('Simulationslauf - keine Veraenderungen werden getaetigt'); + writeln ('Simulationslauf - keine Veraenderungen werden getaetigt'+CR); + end; + if (copy(s,2,2)='ZC') then begin + zcout:=true; + Writeln ('Neue Dateien werden als ZConnect-PUFFER erstellt.'+CR); end; if (copy(s,2,1)='G') then uc:=true; if (copy(s,2,1)='K') then nt:=true; + {$IFDEF WINDOWS} + if (copy(s,2,2)='NC') then nc:=true; + {$ENDIF} if ((copy(s,2,2)='R=') or (copy(s,2,2)='F=')) then begin {Referenzdatei} s:=copy(s,4,255); @@ -470,26 +624,53 @@ Reset(f,1); {$I+} If Ioresult<>0 then begin - Writeln('Referenzdatei nicht gefunden'); + Writeln('Referenzdatei nicht gefunden'+CR); halt(1); end; GetFTime(f,Ftime); ref:=true; Close(f); end; + if (copy(s,2,2)='J=') then begin + {Jobfile} + s:=copy(s,4,255); + Assign(g,s); + {$I-} + Reset(g); + {$I+} + If Ioresult<>0 then begin + Writeln('Jobdatei nicht gefunden'+CR); + halt(1); + end; + while not EOF(g) do + begin + Readln(g,s); + newmacro; + end; + Close(g); + end; + if (copy(s,2,1)='I') then begin + {Interaktiver Modus} + Readln(s); + while not (s='') do + begin + newmacro; + Readln(s); + end; + end; end else newmacro; end; if ((ref and dateset) or (ref and timeset)) then begin - Writeln('Entweder Datum/Uhrzeit oder Referenzdatei'); + Writeln('Entweder Datum/Uhrzeit oder Referenzdatei'+CR); halt(1); end; if not (nt and uc) then begin - if dateset then writeln('Datei-Datum wird gesetzt'); - if timeset then writeln('Datei-Zeit wird gesetzt'); - if not (dateset or timeset) then writeln ('Datei-Datum und Datei-Zeit werden aktualisiert'); + if dateset then writeln('Datei-Datum wird gesetzt'+CR); + if timeset then writeln('Datei-Zeit wird gesetzt'+CR); + if not (dateset or timeset) then writeln ('Datei-Datum und Datei-Zeit werden aktualisiert'+CR); end; - if uc then writeln('Dateinamen grossschreiben'); + if uc then writeln('Dateinamen grossschreiben'+CR); {Datetime packen} if not ref then begin dt.Year:=y; @@ -502,7 +683,7 @@ end; {Dateien verarbeiten} if st=nil then begin - writeln('Dateiangabe fehlt'); + writeln('Dateiangabe fehlt'+CR); halt(1); end; n:=st; @@ -511,12 +692,10 @@ st:=n^.next; dispose(n); n:=st; - {$IFNDEF WINDOWS } if ismacro then exmacro else - {$ENDIF } begin {kein Sonderparameter also Dateiname} - if (s[length(s)]='\') then s:=s else begin + if (s[length(s)]=OSDirSeparator) then s:=s else begin findone:=false; {$IFDEF WINDOWS } StrPCopy(sp,s); @@ -551,7 +730,7 @@ if fname<>own then begin write(fname); {Refdatei nicht touchen} - if ref and testname(reffile,fname) then writeln(' Referenz') + if ref and testname(reffile,fname) then writeln(' Referenz'+CR) else begin if (sim=false) then begin Assign(f,fname); @@ -559,23 +738,28 @@ {$I-} if uc then begin rename(f,'temp.$$$'); - if IOResult <> 0 then writeln(' Umbenennen der Datei fehlgeschlagen'); + if IOResult <> 0 then writeln(' Umbenennen der Datei fehlgeschlagen'+CR); for i:=1 to length(fname) do fname[i]:=upcase(fname[i]); rename(f,fname); if IOResult <> 0 then begin - writeln(' Umbenennen der Datei kritisch fehlgeschlagen'); + writeln(' Umbenennen der Datei kritisch fehlgeschlagen'+CR); halt(1); end; end; Reset(f,1); {$I+} - if IOResult <> 0 then writeln(' Oeffnen der Datei fehlgeschlagen'); + if IOResult <> 0 then writeln(' Oeffnen der Datei fehlgeschlagen'+CR); if not (nt and uc) then ftime:=Testtime(ftime,dateset,timeset); + {$IFNDEF unix} SetFtime(f,Ftime); - if Doserror<>0 then writeln('!') else writeln(''); + if Doserror<>0 then writeln('!'+CR) else writeln(''+CR); + close(f); + {$ELSE} close(f); + if unixsetftime(s,ftime2epoch(ftime)) then writeln(''+CR) else writeln('!'+CR); + {$ENDIF} end - else writeln(''); + else writeln(''+CR); end; end; {$IFNDEF BPLFN} @@ -587,25 +771,32 @@ {Keine Datei gefunden ? Dann neu anlegen!!} if findone=false then begin if isnoWild(fname) then begin - writeln(s); - if (sim=false) then begin - Assign(f,s); - {$I-} - Rewrite(f); - {$I+} - if IOResult <> 0 then writeln(' Anlegen der neuen Datei fehlgeschlagen'); - {$I-} - Reset(f); - {$I+} - if IOResult <> 0 then writeln(' Anlegen der neuen Datei fehlgeschlagen'); - {$I-} - SetFtime(f,Ftime); - {$I+} - if IOResult <> 0 then writeln (' Touchen der neuen Datei fehlgeschlagen'); - {$I-} - close(f); - {$I+} - if ioresult <> 0 then writeln (' Schliessen der neuen Datei fehlgeschlagen'); + writeln(s+CR); + if (sim=false) then begin + Assign(g,s); + {$I-} + Rewrite(g); + {$I+} + if IOResult <> 0 then writeln(' Anlegen der neuen Datei fehlgeschlagen'+CR) + else if zcout=true then ZC; + {$IFNDEF unix} + {$I-} + Reset(g); + {$I+} + if IOResult <> 0 then writeln(' Anlegen der neuen Datei fehlgeschlagen'+CR); + {$I-} + SetFtime(g,Ftime); + {$I+} + if IOResult <> 0 then writeln (' Touchen der neuen Datei fehlgeschlagen'+CR); + {$ENDIF} + {$I-} + close(g); + {$I+} + if ioresult <> 0 then writeln (' Schliessen der neuen Datei fehlgeschlagen'+CR); + {$IFDEF unix} + if unixsetftime(s,ftime2epoch(ftime)) then write('') + else writeln(' Touchen der neuen Datei fehlgeschlagen'+CR); + {$ENDIF} end; end; end; @@ -617,9 +808,16 @@ end; until n=nil; end; + {$IFDEF WINDOWS} + if nc then Readln; + DoneWinCrt; + {$ENDIF} end. { $Log: touch.pas,v $ + Revision 1.19 2004/11/18 16:04:11 mw + MW: - Update auf Touch 1.2 + Revision 1.18 2004/11/09 10:56:11 mw MW: - Fehlerbereinigung Index: freexp/doc/touch.txt =================================================================== RCS file: /server/cvs/freexp/doc/touch.txt,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- freexp/doc/touch.txt 12 Aug 2004 11:18:02 -0000 1.5 +++ freexp/doc/touch.txt 18 Nov 2004 16:00:34 -0000 1.6 @@ -1,21 +1,31 @@ -Versuch einer Dokumentation zu Touch (c) 2003 by Martin Wodrich ---------------------------------------------------------------- +Dokumentation zu Touch (c) 2003-2004 by Martin Wodrich +------------------------------------------------------ Inhaltsverzeichnis ------------------ 1. Einleitung -2. Dateiparameter -2.1 Eindeutige Dateien -2.2 Wildcards -3. Referenzdatei -4. Datum/Uhrzeit festlegen -5. Verzeichnismakros -6. Spezielle Dateien -7. Simulationslauf -8. Automatische Groáschreibung -9. Lizenz- und Nutzungsbedingungen -10. Erweiterungen -11. Systemvoraussetzungen +2. Systemvoraussetzungen +3. Dateiparameter +3.1 Eindeutige Dateien +3.2 Wildcards +3.3 Verzeichnismakros +3.4 Spezielle Dateien +4. Dateiparameter mit besonderer Funktion +4.1 Referenzdatei +4.2 Jobdatei +5. Datum/Uhrzeit festlegen +6. Besondere Funktionen +6.1 Simulationslauf +6.2 Automatische Groáschreibung +6.3 ZConnect-PUFFER erstellen +6.4 Interaktiver Modus +7. Betriebsystemabh„ngigkeiten +7.1 Lange Dateinamen +7.2 Beenden von Touch +A. Erweiterungen +B. Lizenz- und Nutzungsbedingungen +C. Versionsgeschichte + 1. Einleitung @@ -25,9 +35,32 @@ spezielle Kniffe, die andere Implementierungen oft nicht haben. Alle bearbeiteten Dateien werden mit vollst„ndigem Pfad ausgegeben. -2. Dateiparameter + +2. Systemvoraussetzungen +------------------------- +Touch ist portabel geschrieben. Es kann daher fr fast jedes +Betriebsystem compiliert werden. + +Derzeit sind folgende Versionen verfgbar: +- DOS16 (mit einschaltbarer LFN-Untersttzung) +- DOS16 (ohne LFN-Untersttzung) +- DPMI (ohne LFN-Untersttzung) +- OS2 (ohne LFN-Untersttzung) +- WIN16 (ohne LFN-Untersttzung) + +- DOS32 (mit automatischer LFN-Untersttzung) +- WIN32 (mit LFN-Untersttzung) +- OS2-EMX +- Linux +(weitere Betriebssysteme sind m”glich) + +Win64(AMD64) und Win64(IA64) sollte compilierbar sein, kann von mir aber +mangels 64Bit-Windows weder erstellt noch getestet werden. + + +3. Dateiparameter ----------------- -2.1 Eindeutige Dateien +3.1 Eindeutige Dateien ---------------------- Touch kann mit fast beliebig vielen Dateien als Parameter aufgerufen werden. Diese Dateien k”nnen mit und auch ohne vollst„ndigen Pfad @@ -44,7 +77,7 @@ existiert, so wird die Datei neu angelegt. -2.2 Wildcards +3.2 Wildcards ------------- Als Dateiparameter sind ebenfalls sogenannte Wildcards erlaubt. Diese allerdings ausschlieálich im Dateinamen, nicht aber in @@ -56,49 +89,9 @@ Bei der Verwendung von Wildcards werden keine Dateien neu angelegt wie das u.U. bei eindeutigen Dateien geschehen kann. -3. Referenzdatei ----------------- -Touch untersttzt die Verwendung einer Referenzdatei. Dies ist eine -Datei, deren Dateidatum und Uhrzeit auf alle anderen angegebenen -Dateien kopiert wird. Es ist dabei egal, an welcher Stelle der -Parameter-Liste die Referenzdatei angegeben wird. Sie bezieht sich -immer auf alle angegebenen Dateien. Die Referenzdatei wird durch ein -vorgestelltes /R= als solche kenntlich gemacht. - -(Als alias fr /R= kann ebenso auch /F= fr die Angabe der -Referenzdatei genommen werden). - -Beispiel: -touch datei1 /R=datei2 datei3 -(Kopiert das Dateidatum und die Uhrzeit von Datei2 auf Datei1 und -Datei3) - - -4. Datum/Uhrzeit festlegen --------------------------- -Mit /t=Uhrzeit kann eine Uhrzeit bergeben werden, welche dann bei -allen als Parameter bergebenen Dateien gesetzt wird. -Die Angabe einer Uhrzeit geschieht im Format hh:mm:ss, also Stunde, -Minute und Sekunde jeweils durch Doppelpunkt getrennt. - -Mit /d=Datum kann entsprechend ein Datum bergeben werden. -Dieses wird dabei im Format tt.mm.yy oder tt.mm.yyyy eingegeben. -Das heiát Tag, Monat und Jahr werden durch einen Punkt getrennt. -Das Jahr kann zweistellig, aber auch 4-stellig eingegeben werden. - -Bei diesen Angaben wird ein Plausibilit„tstest gemacht, bevor sie auf -irgentwelche Dateien angewendet werden. Sind diese Angaben nicht -plausibel, so bricht Touch ab. Ebenso wenn Referenzdatei und -Datum/Uhrzeit gesetzt wird. - -Wird nur Datum oder nur Uhrzeit vorgegeben, so wird die fehlende -Angabe an den Dateien nicht ver„ndert. Fehlt jegliche Angabe von -Datum und Uhrzeit so wird das aktuelle Datum und die aktuelle -Zeit bei Programmstart benutzt. L„uft Touch also mehrere Sekunden -so haben dennoch alle Dateien die gleiche Uhrzeit und Datumsangabe. -5. Verzeichnismakros --------------------- +3.3 Verzeichnismakros +--------------------- Touch besitzt eine sehr umfassende M”glichkeit, um Verzeichnisangaben in Kurzform anzugeben. @@ -151,8 +144,8 @@ angelegt werden, solange die Dateiangabe eindeutig ist und keine Wildcards enth„lt. -6. Spezielle Dateien --------------------- +3.4 Spezielle Dateien +--------------------- Touch ver„ndert normalerweise versteckte Dateien sowie Systemdateien nicht, sondern nur durch direkte Angabe des Parameters. @@ -161,8 +154,65 @@ Diese Angaben k”nnen auch beide zusammen benutzt werden. -7. Simulationslauf + +4. Dateiparameter mit besonderer Funktion +----------------------------------------- +4.1. Referenzdatei ------------------ +Touch untersttzt die Verwendung einer Referenzdatei. Dies ist eine +Datei, deren Dateidatum und Uhrzeit auf alle anderen angegebenen +Dateien kopiert wird. Es ist dabei egal, an welcher Stelle der +Parameter-Liste die Referenzdatei angegeben wird. Sie bezieht sich +immer auf alle angegebenen Dateien. Die Referenzdatei wird durch ein +vorgestelltes /R= als solche kenntlich gemacht. + +(Als alias fr /R= kann ebenso auch /F= fr die Angabe der +Referenzdatei genommen werden). + +Beispiel: +touch datei1 /R=datei2 datei3 +(Kopiert das Dateidatum und die Uhrzeit von Datei2 auf Datei1 und +Datei3) + +4.2 Jobdatei +------------ +Die zu touchenden Dateien mssen nicht unbedingt als Parameter an Touch +bergeben werden. Sie k”nnen auch als Liste in einer Datei geschrieben +sein. Diese Datei wird Touch dann mit vor dem Dateinamen gestelltem +/J= als solche kenntlich gemacht. +Es existieren die gleichen M”glichkeiten bezglich Makros und Wildcards +wie bei der šbergabe als Parameter. +Auch die Jobdatei kann an beliebiger Stelle in der Parameterliste stehen. + + +5. Datum/Uhrzeit festlegen +-------------------------- +Mit /t=Uhrzeit kann eine Uhrzeit bergeben werden, welche dann bei +allen als Parameter bergebenen Dateien gesetzt wird. +Die Angabe einer Uhrzeit geschieht im Format hh:mm:ss, also Stunde, +Minute und Sekunde jeweils durch Doppelpunkt getrennt. + +Mit /d=Datum kann entsprechend ein Datum bergeben werden. +Dieses wird dabei im Format tt.mm.yy oder tt.mm.yyyy eingegeben. +Das heiát Tag, Monat und Jahr werden durch einen Punkt getrennt. +Das Jahr kann zweistellig, aber auch 4-stellig eingegeben werden. + +Bei diesen Angaben wird ein Plausibilit„tstest gemacht, bevor sie auf +irgentwelche Dateien angewendet werden. Sind diese Angaben nicht +plausibel, so bricht Touch ab. Ebenso wenn Referenzdatei und +Datum/Uhrzeit gesetzt wird. + +Wird nur Datum oder nur Uhrzeit vorgegeben, so wird die fehlende +Angabe an den Dateien nicht ver„ndert. Fehlt jegliche Angabe von +Datum und Uhrzeit so wird das aktuelle Datum und die aktuelle +Zeit bei Programmstart benutzt. L„uft Touch also mehrere Sekunden +so haben dennoch alle Dateien die gleiche Uhrzeit und Datumsangabe. + + +6. Besondere Funktionen +----------------------- +6.1 Simulationslauf +------------------- Wird der Parameter /V (Vort„uschmodus) benutzt, so wird Touch alles ausgeben, was es bei einem regul„ren Lauf ausgeben wrde, allerdings keine Ver„nderungen an Dateidatum/Uhrzeit hinterlassen. @@ -170,8 +220,8 @@ allerdings, dass der Seek auf allen Diskettenlaufwerken ebenfalls durchgefhrt wird!!! -8. Automatische Groáschreibung ------------------------------- +6.2 Automatische Groáschreibung +------------------------------- Mit dem optionalen Parameter /G kann erreicht werden, dass alle Dateien nach dem Touchlauf in Groábuchstaben im Verzeichnis stehen. @@ -179,7 +229,53 @@ nicht ver„ndert wird. Dieser Parameter ist nur bei Verwendung des Parameters /G wirksam, sonst wird er ignoriert. -9. Lizenz- und Nutzungsbedingungen +6.3 ZConnect-PUFFER erstellen +----------------------------- +Normalerweise erstellt Touch Dateien mit 0 Bytes Gr”áe. Wird das +Argument /ZC angegeben, so erstellt Touch stattdessen ZConnect-PUFFER +mit einer Testnachricht. Dabei enth„lt jede Datei exakt eine Nachricht, +mit eindeutiger Message-ID. + +6.4 Interaktiver Modus +---------------------- +Wird der Parameter /I angegeben so liest Touch Informationen ber +zu bearbeitende Dateien ber Standard-Input. + + +7. Betriebsystemabh„ngigkeiten +------------------------------ +7.1 Lange Dateinamen +-------------------- +Touch untersttzt lange Dateinamen (LFNs) sofern das Betriebsystem +diese anbietet. +Fr DOS-Realmode (DOS16) muá diese Untersttzung derzeit per Argument +(/LFN) eingeschaltet werden. Es existiert mit TOUCHNLF.ZIP aber auch +eine Version ganz ohne LFN-Untersttzung. +Fr 16 Bit DOS-Protected-Mode (DPMI) und Win16 ist die Untersttzung nicht +verfgbar, da Windows 16 Bit dies nicht bietet und die Untersttzung +fr 16 Bit DOS-Protected-Mode nicht sicher ist. +Alle 32 Bit Compilate (DOS32 und WIN32) k”nnen automatisch lange +Dateinamen nutzen. + +7.2 Beenden von Touch +--------------------- +Normalerweise beendet sich Touch sobald es mit seiner Aufgabe +fertig ist. Unter WIN16 kann mit dem Argument /nc dies verhindert +werden, da unter dieser Platform Touch in einem eignen Fenster +l„uft und sich dieses unter Umst„nden zu schnell schlieát. +Dieser Parameter existiert nur fr WIN16. + + +A. Erweiterungen +---------------- +Wer Verbesserungsvorschl„ge oder Portierungsvorschl„ge hat, darf sie +mir gerne mitteilen. Meine E-Mail-Adresse ist + [EMAIL PROTECTED] . +Fr eingebrachte Codebausteine wrde ich mich durch eine Danksagung in +diesem Text und/oder in der Touch.pas erkenntlich zeigen. + + +B. Lizenz- und Nutzungsbedingungen ---------------------------------- Touch ist Nodeware. Dies bedeutet, dass ich benachrichtigt werden m”chte, wenn Touch innerhalb der Zusammenstellung eines @@ -193,27 +289,32 @@ Freeware verwendbar, da ich bereits weiá, dass es dort eingesetzt wird und FreeXP selbst Freeware ist. -Grunds„tzlich gilt: Die datei Touch.exe bzw. Touch.pas darf nur +Grunds„tzlich gilt: Die Datei Touch.exe bzw. Touch.pas darf nur zusammen mit diesem Text verbreitet werden. -10. Erweiterungen ----------------- -Wer Verbesserungsvorschl„ge oder Portierungsvorschl„ge hat, darf sie -mir gerne mitteilen. Meine E-Mail-Adresse ist - [EMAIL PROTECTED] . -Fr eingebrachte Codebausteine wrde ich mich durch eine Danksagung in -diesem Text und/oder in der Touch.pas erkenntlich zeigen. -11. Systemvoraussetzungen -------------------------- -Touch l„sst sich derzeit fr jedes Betriebsystem mit DOS-artiger -Verzeichnisstruktur einsetzen. -Von mir selbst kann allerdings nur eine 16- und 32-Bit DOS-Version -sowie eine Win32-Version erzeugt werden. Eine OS/2-Version sollte ohne -weitere Anpassungen gelingen (Danke an Thomas Seiffert). Win64(AMD64) -und Win64(IA64) sollte compilierbar sein, kann von mir aber mangels -64Bit-Windows weder erstellt noch getestet werden. +C. Versionsgeschichte +--------------------- +- 1.0 (09.08.2003): + ----------------------- + - Erste stabile Fassung von Touch. + - Compilate fr DOS16,DOS32 und WIN32 verfgbar. + +- 1.1 (09.11.2004): + ----------------- + - Die Ausgabe von Touch kann nun in eine Datei + umgeleitet werden. + - Abfangen des Versuchs Touch selbst zu touchen. + - Einfhrung einer Spezialversion ohne LFN-Untersttzung. + +- 1.2 (18.11.2004): + ------------------------ + - Neues Feature Jobfile. + - Neues Feature ZC-PUFFER-Erstellung. + - Neue Platformen Win16 und OS2 verfgbar. + - Hilfe berarbeitet. + - Dokumentation berarbeitet. -Waltrop, 06.08.2003 +Waltrop, 18.11.2004 Martin Wodrich
------------------------------------------------------------------------ FreeXP CVS-Mailingliste [EMAIL PROTECTED] http://www.freexp.de/cgi-bin/mailman/listinfo/cvs-list