diff options
Diffstat (limited to 'tools.pas')
-rw-r--r-- | tools.pas | 169 |
1 files changed, 125 insertions, 44 deletions
@@ -5,20 +5,32 @@ unit tools; interface uses - Classes, SysUtils, Process, mystringlistunit, regExpr; + classes, sysUtils, process, mystringlistunit, regExpr; type + tAktualitaet = (aVeraltet,aAktuell,aWirdErneuert); tStringlistBArray = array[boolean] of tStringlist; tSummenDatei = record name: string; inhalt: tStringlistBArray; end; + tDateiMitDatum = class + name: ansiString; + aktuell: tAktualitaet; + end; + tDateienMitDaten = array of tDateiMitDatum; +function min(a1,a2: tAktualitaet): tAktualitaet; overload; +function max(a1,a2: tAktualitaet): tAktualitaet; overload; function anzCs(c: char; s: string): longint; function notQuotedPos(was,worin: string): longint; function unescapedpos(was,worin: string): integer; procedure testeObBefehlLokal(bef, ordner: string; lokTest: tRegExpr); function extrahiereAlleDateien(woraus: string): tMyStringList; +function unescape(s: string): string; +function escape(s,toe: string; ec: char): string; +function bashMatch(was,worauf: string): boolean; +function gleicheDateinamen(dl1,dl2: tDateienMitDaten): boolean; // Routinen für sha512-Prüfsummen @@ -27,8 +39,25 @@ function dateienMitGueltigerSumme(sumNam: string): tStringList; implementation +function min(a1,a2: tAktualitaet): tAktualitaet; +begin + if a1<a2 then + result:=a1 + else + result:=a2; +end; + +function max(a1,a2: tAktualitaet): tAktualitaet; +begin + if a1>a2 then + result:=a1 + else + result:=a2; +end; + function anzCs(c: char; s: string): longint; -var i: longint; +var + i: longint; begin result:=0; for i:=1 to length(s) do @@ -51,18 +80,19 @@ begin end; function unescapedpos(was,worin: string): integer; -var Ebene: longint; +var + ebene: longint; begin result:=0; - Ebene:=0; + ebene:=0; while pos(was,copy(worin,result+1,length(worin)))>0 do begin repeat result:=result+1; case worin[result] of - '{': inc(Ebene); - '}': dec(Ebene); + '{': inc(ebene); + '}': dec(ebene); end; - until (result>=length(worin)) or ((copy(worin,result,length(was))=was) and (Ebene=0)); + until (result>=length(worin)) or ((copy(worin,result,length(was))=was) and (ebene=0)); if ((result=1) or ((worin[result-1]<>'\') and (worin[result-1]<>was))) and ((result=length(worin)) or (worin[result+1]<>was)) and @@ -104,25 +134,25 @@ begin // set output "~/Dokumente/Erich_Masterarbeit/Bilder/gnuplot/Energiescan.tex" regex:='^ *set +output +'; re:=tRegExpr.create; - re.Expression:='"[^"]*/[^"]*"'; + re.expression:='"[^"]*/[^"]*"'; end else if exe='epost' then begin // Datei: regex:='^ *(Datei|Legende): *'; re:=tRegExpr.create; - re.Expression:='[^ :]*/[^ ]*'; + re.expression:='[^ :]*/[^ ]*'; end else if exe='math' then begin // das wird vmtl. schwer zu überprüfen, außer man nimmt Muster, // die generisch auf Pfade passen, aber dann erwischt man auch den Input mit ... regex:='^([^"]*"[^"]*")*[^"]*"([^"]*/)+[^"]*"'; re:=tRegExpr.create; - re.Expression:='"[^"]*/[^"]*"'; + re.expression:='"[^"]*/[^"]*"'; end else exit; - // folgende Executables sind unkritisch, da der Name des Outputs i.d.R. direkt - // vom Namen des Inputs abhängt bzw. per Kommandozeilenparameter übergeben + // folgende executables sind unkritisch, da der name des outputs i.d.R. direkt + // vom namen des Inputs abhängt bzw. per Kommandozeilenparameter übergeben // wird (und nicht in einer Datei steht): // // 'convert' @@ -146,17 +176,17 @@ begin dateien.free; for i:=0 to relZeil.count-1 do begin - re.InputString:=relZeil[i]; - if re.SubExprMatchCount=0 then - writeln('*** Warnung: Hier ist eine Zeile in der Optionsdatei, die keine passende Inputdatei benennt, es aber sollte! ('''+relZeil[i]+''')!'); - for j:=0 to re.SubExprMatchCount-1 do begin - s:=trim(re.Match[j]); + re.inputString:=relZeil[i]; + if re.subExprMatchCount=0 then + writeln('*** Warnung: Hier ist eine Zeile in der optionsdatei, die keine passende Inputdatei benennt, es aber sollte! ('''+relZeil[i]+''')!'); + for j:=0 to re.subExprMatchCount-1 do begin + s:=trim(re.match[j]); if (leftStr(s,1)='"') and (rightStr(s,1)='"') then begin delete(s,1,1); delete(s,length(s),1); end; - if not lokTest.Exec(s) then begin - writeln('*** FEHLER: '''+relZeil[i]+''' in Befehl '''+oBef+''' hat Lokalitätstest nicht bestanden! ('+lokTest.Expression+')'); + if not lokTest.exec(s) then begin + writeln('*** FEHLER: '''+relZeil[i]+''' in Befehl '''+oBef+''' hat Lokalitätstest nicht bestanden! ('+lokTest.expression+')'); halt(1); end; end; @@ -180,46 +210,97 @@ begin end; end; +function unescape(s: string): string; +begin + result:=s; + while pos('\,',result)>0 do + delete(result,pos('\,',result),1); +end; + +function escape(s,toe: string; ec: char): string; +var i,j: longint; + b: boolean; +begin + result:=''; + for i:=1 to length(s) do begin + b:=false; + for j:=1 to length(toe) do + b:=b or (toe[j]=s[i]); + if b then result:=result+ec; + result:=result+s[i]; + end; +end; + +function bashMatch(was,worauf: string): boolean; +var + re: tRegExpr; +begin + if pos('*',was)=0 then begin + result:=was=worauf; + exit; + end; + re:=tRegExpr.create; + re.expression:='^'+escape(escape(was,'.|()^$','\'),'*','.')+'$'; + result:=re.exec(worauf); + re.free; +end; + +function gleicheDateinamen(dl1,dl2: tDateienMitDaten): boolean; +var + i,j: longint; +begin + result:=length(dl1)=length(dl2); + if not result then + exit; + for i:=0 to length(dl1)-1 do begin + result:=false; + for j:=0 to length(dl2)-1 do + result:=result or (dl1[i].name=dl2[j].name); + if not result then exit; + end; +end; + // Routinen für sha512-Prüfsummen var - Summenvorrat: array of tSummenDatei; + summenvorrat: array of tSummenDatei; function testeSummen(sumNam: string): tStringlistBArray; -var p: tProcess; - rb,i: longint; - s: string; - erg: tStringlist; - gut: boolean; +var + p: tProcess; + rb,i: longint; + s: string; + erg: tStringlist; + gut: boolean; const leseHappen=65536; begin - for i:=0 to length(Summenvorrat)-1 do - if Summenvorrat[i].name=sumNam then begin + for i:=0 to length(summenvorrat)-1 do + if summenvorrat[i].name=sumNam then begin for gut:=false to true do begin result[gut]:=tStringlist.create; - result[gut].text:=Summenvorrat[i].inhalt[gut].text; + result[gut].text:=summenvorrat[i].inhalt[gut].text; end; exit; end; p:=tProcess.create(nil); - p.Executable:='/usr/bin/sha512sum'; - p.Parameters.add('-c'); - p.Parameters.add(sumNam); - p.Options:=p.Options + [poUsePipes]; - p.Execute; + p.executable:='sha512sum'; + p.parameters.add('-c'); + p.parameters.add(sumNam); + p.options:=p.options + [poUsePipes]; + p.execute; rb:=0; s:=''; - while p.Running do begin - if p.Output.NumBytesAvailable=0 then sleep(10) + while p.running do begin + if p.output.numBytesAvailable=0 then sleep(10) else begin setlength(s,rb+leseHappen); - rb:=rb+p.Output.Read(s[rb+1],leseHappen); + rb:=rb+p.output.read(s[rb+1],leseHappen); end; end; - if p.Output.NumBytesAvailable>0 then begin + if p.output.numBytesAvailable>0 then begin setlength(s,rb+leseHappen); - rb:=rb+p.Output.Read(s[rb+1],leseHappen); + rb:=rb+p.output.read(s[rb+1],leseHappen); end; p.free; setlength(s,rb); @@ -237,8 +318,8 @@ begin end; erg.free; - setlength(Summenvorrat,length(Summenvorrat)+1); - with Summenvorrat[length(Summenvorrat)-1] do begin + setlength(summenvorrat,length(summenvorrat)+1); + with summenvorrat[length(summenvorrat)-1] do begin name:=sumNam; for gut:=false to true do begin inhalt[gut]:=tStringlist.create; @@ -260,15 +341,15 @@ var i: longint; initialization - setlength(Summenvorrat,0); + setlength(summenvorrat,0); finalization - for i:=0 to length(Summenvorrat)-1 do - with Summenvorrat[i] do begin + for i:=0 to length(summenvorrat)-1 do + with summenvorrat[i] do begin name:=''; inhalt[false].free; inhalt[true].free; end; - setlength(Summenvorrat,0); + setlength(summenvorrat,0); end. |