summaryrefslogtreecommitdiff
path: root/tools.pas
diff options
context:
space:
mode:
Diffstat (limited to 'tools.pas')
-rw-r--r--tools.pas169
1 files changed, 125 insertions, 44 deletions
diff --git a/tools.pas b/tools.pas
index 49a9251..3d7c895 100644
--- a/tools.pas
+++ b/tools.pas
@@ -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.