home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
08
/
tricks
/
schloss.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-07-05
|
14KB
|
429 lines
(* ------------------------------------------------------ *)
(* SCHLOSS.PAS *)
(* Codierung von Pascal-Programmen *)
(* (c) 1990 P.Kurzweil, A.Dengler & TOOLBOX *)
(* ------------------------------------------------------ *)
PROGRAM Schloss;
USES Crt;
CONST
maxvar = 500;
hfil = 'SCHLOSS.HLP';
p = 65;
cmd : ARRAY [1..p] OF STRING [15] =
('ABSOLUTE', 'AND', 'ARRAY', 'BEGIN', 'CASE',
'CONST', 'DIV', 'DO', 'DOWNTO', 'ELSE', 'END',
'EXTERNAL', 'FILE', 'FOR', 'FORWARD',
'FUNCTION', 'GOTO', 'IF', 'IMPLEMENTATION',
'IN', 'INLINE', 'INTERFACE', 'INTERRUPT',
'LABEL', 'MOD', 'NIL', 'NOT', 'OF', 'OR',
'PACKED', 'PROCEDURE', 'PROGRAM', 'RECORD',
'REPEAT', 'SET', 'SHL', 'SHR', 'STRING', 'THEN',
'TO', 'TYPE', 'UNIT', 'UNTIL', 'USES', 'VAR',
'WHILE', 'WITH', 'XOR', 'REAL', 'SINGLE',
'DOUBLE', 'EXTENDED', 'COMP', 'INTEGER',
'SHORTINT', 'LONGINT', 'BYTE', 'WORD',
'BOOLEAN', 'CHAR', 'TEXT', 'CRT', 'DOS',
'PRINTER', 'GRAPH');
TYPE
strg = STRING [30]; { Länge der Bezeichner }
Varnamen = ARRAY [1..maxvar] OF strg;
Varnamenptr = ^Varnamen;
VAR
varalt,
varaltup,
varneu : Varnamenptr; { Variablennamen }
quelle,
ziel, hilf,
xref : TEXT;
qfil, zfil,
xfil,
schluessel : STRING [40];
nvar,
nstart,
wahl,
methode : WORD;
s, sup : strg;
PROCEDURE PointerInit;
{ Speicherplatz für Variablen reservieren }
VAR
size : LONGINT;
BEGIN
size := SizeOf(Varnamen);
IF MaxAvail < (3 * size) THEN BEGIN
Write('Nicht genügend Speicher!'); Halt(1);
END;
varalt := NIL; varaltup := NIL; varneu := NIL;
GetMem(varalt, size);
GetMem(varaltup, size);
GetMem(varneu, size);
END {PointerInit};
PROCEDURE KommentareEntfernen; { Schritt 1 }
VAR
ch : CHAR;
BEGIN
Assign(quelle, qfil); Reset(quelle);
Assign(hilf, hfil); Rewrite(hilf);
WHILE NOT EOF(quelle) DO BEGIN
Read(quelle, ch);
CASE ch OF
#39: BEGIN { 1. String }
Write(hilf, #39);
REPEAT
Read(quelle, ch); Write(hilf, ch);
UNTIL ch = #39;
END;
'{': BEGIN
REPEAT
Read(quelle, ch);
UNTIL ch <> #32;
IF ch = '$' THEN
Write(hilf, #123 + '$')
{ 2a. Compileroption }
ELSE
REPEAT
Read(quelle, ch);
UNTIL ch = #125; { 2b. Kommentar }
END;
'(': BEGIN
Read(quelle, ch);
CASE ch OF
'*': BEGIN { 3a. Compileroption }
Read(quelle, ch);
IF ch = '$' THEN BEGIN
Write(hilf, #123 + '$');
WHILE ch <> '*' DO BEGIN
Read(quelle, ch);
IF ch <> '*' THEN
Write(hilf, ch);
END;
REPEAT
Read(quelle, ch);
UNTIL ch = ')';
Write(hilf, #125);
END ELSE BEGIN
REPEAT { 3b. Kommentar }
REPEAT
Read(quelle, ch);
UNTIL ch = '*';
Read(quelle, ch);
UNTIL ch = ')';
END;
END;
#39: BEGIN { 4. Menge von Strings }
Write(hilf, '(' + #39);
REPEAT
Read(quelle, ch);
Write(hilf, ch);
UNTIL ch = #39;
END;
ELSE { 5. gewöhnliche Klammer }
Write(hilf, '(' + ch);
END;
END;
ELSE
Write(hilf, ch);
END;
END;
Close(hilf); Close(quelle);
END {KommentareEntfernen};
PROCEDURE VariablenSuche; { Schritt 2 }
VAR
ch : CHAR;
i : BYTE;
Stop, Pascalwort, Deklaration : BOOLEAN;
PROCEDURE WortLesen;
BEGIN
REPEAT
Read(hilf, ch);
Stop := (ch = #26);
IF Stop THEN Exit {WortLesen}; { 1. EOF }
IF ch IN ['A'..'Z', 'a'..'z'] THEN BEGIN
{ 2. Bezeichner }
s := ch; sup := UpCase(ch);
REPEAT
Read(hilf, ch);
s := s + ch; sup := sup + UpCase(ch);
UNTIL NOT
(ch IN ['A'..'Z', 'a'..'z', '0'..'9', '_']);
Delete(s, Length(s), 1);
Delete(sup, Length(sup), 1);
END;
IF ch = #39 THEN
REPEAT
Read(hilf, ch);
UNTIL ch = #39; { 3. String }
UNTIL s[1] IN ['A'..'Z', 'a'..'z'];
END {WortLesen};
PROCEDURE Entdoppeln;
{ doppelte Bezeichner aussortieren }
VAR
k : WORD;
BEGIN
IF nvar < 2 THEN Exit {Entdoppeln};
FOR k := 1 TO nvar-1 DO BEGIN
IF varaltup^[k] = varaltup^[nvar] THEN BEGIN
nvar := nvar - 1; Exit {Entdoppeln};
END;
END;
END {Entdoppeln};
BEGIN
Assign(hilf, hfil); Reset(hilf);
REPEAT
WortLesen;
Deklaration := ((sup = 'CONST') OR
(sup = 'FUNCTION') OR
(sup = 'PROCEDURE') OR
(sup = 'PROGRAM') OR
(sup = 'RECORD') OR
(sup = 'TYPE') OR
(sup = 'VAR'));
IF Deklaration AND (NOT Stop) THEN BEGIN
REPEAT { Deklarationsteil }
WortLesen;
i := 0;
REPEAT
i := i + 1;
Pascalwort := (sup = cmd[i]);
UNTIL Pascalwort OR (i >= p);
IF (NOT Pascalwort) AND
(nvar < maxvar) THEN BEGIN
nvar := nvar + 1;
varalt^[nvar] := s;
varaltup^[nvar] := sup;
Entdoppeln;
END;
UNTIL Stop OR (sup = 'BEGIN'); { Anweisungsteil }
END;
UNTIL Stop;
Close(hilf);
END {VariablenSuche};
PROCEDURE NeueBezeichner; { Schritt 3 }
VAR
i, fac, len : WORD;
FUNCTION Kennung(x, xmax : WORD) : strg;
{ Variablennamen erzeugen }
CONST
n = 5; b : STRING [n] = '0O1Il';
{ Null, Oscar, Eins, India, Lima }
{ 5-er System }
VAR
i, j, k, c, h : WORD;
s : strg;
BEGIN
s := '';
k := Trunc(Ln(xmax) / Ln(n) + 1);
{ Länge der Kennung }
FOR i := k-1 DOWNTO 0 DO BEGIN
h := 1;
IF i > 0 THEN BEGIN
h := n;
FOR j := 2 TO i DO h := h * n;
END; { n^i }
c := x DIV h;
x := x MOD h;
s := s + b[c+1];
END;
WHILE (s[1] = b[1]) AND (Length(s) > 1) DO
Delete(s, 1, 1); { Oh, oh: führende Null... }
Kennung := s;
END {Kennung};
BEGIN
Assign(xref, xfil); Rewrite(xref);
FOR i := 1 TO nstart DO
WriteLn(xref, varalt^[i], #32, varneu^[i]);
FOR i := nstart+1 TO nvar DO BEGIN
CASE methode OF
1: BEGIN
Str(i, s);
varneu^[i] := schluessel + s;
END; { Numerische Namen }
2: varneu^[i] := schluessel + Kennung(i, nvar);
{ Permutationsnamen }
END;
WriteLn(xref, varalt^[i], #32, varneu^[i]);
END;
Close(xref);
END {NeueBezeichner};
PROCEDURE Umbenennen(filename : strg); { Schritt 4 }
VAR
a : strg;
ch : CHAR;
Stop : BOOLEAN;
i : WORD;
alpha : BOOLEAN;
BEGIN
Assign(ziel, zfil); Rewrite(ziel);
Assign(hilf, filename); Reset(hilf);
REPEAT
s := ''; a := '';
REPEAT
Read(hilf, ch);
alpha := ch IN ['A'..'Z', 'a'..'z', '0'..'9', '_'];
{ Wort oder Zahl }
IF alpha THEN BEGIN
a := a + ch;
s := s + UpCase(ch);
END;
IF ch = #39 THEN BEGIN { String }
Write(ziel, ch);
alpha := TRUE;
REPEAT
Read(hilf, ch); Write(ziel, ch);
UNTIL ch = #39;
END;
IF ch = #123 THEN BEGIN { Compileroption }
Write(ziel, ch);
alpha := TRUE ;
REPEAT
Read(hilf, ch); Write(ziel, ch);
UNTIL ch = #125;
END;
UNTIL NOT alpha; { Wortende }
Stop := ((s = 'END') AND (ch = '.')) OR (ch = #26);
{ EOF }
IF (NOT Stop) AND (s[1] IN ['A'..'Z']) THEN BEGIN
i := 0; { Variable ersetzen }
REPEAT
i := i + 1;
IF s = varaltup^[i] THEN BEGIN
a := varneu^[i];
i := nvar;
Write('.');
END;
UNTIL i >= nvar;
END;
Write(ziel, a + ch);
UNTIL Stop;
Close(hilf); Close(ziel);
END {Umbenennen};
PROCEDURE CrossreferenceLesen(VAR varneu,
varalt : Varnamenptr);
VAR
s : STRING;
i, j : WORD;
x : strg;
BEGIN
Assign(xref, xfil); Reset(xref);
WHILE NOT EOF(xref) DO BEGIN
ReadLn(xref, s); nvar := nvar + 1;
i := 1;
WHILE (s[i] IN ['a'..'z', '0'..'9', 'A'..'Z', '_']) DO
i := i + 1;
varneu^[nvar] := Copy(s, 1, i-1);
Delete(s, 1, i);
WHILE NOT
(s[1] IN ['a'..'z', '0'..'9', 'A'..'Z', '_']) DO
Delete(s, 1, 1);
varalt^[nvar] := Copy(s, 1, Length(s));
END;
Close(xref);
END {CrossreferenceLesen};
PROCEDURE Varaltupper; { Umwandlung in Großbuchstaben }
VAR
i, j : WORD;
x : strg;
BEGIN
FOR i := 1 TO nvar DO BEGIN
varaltup^[i] := '';
x := varalt^[i];
FOR j := 1 TO Length(x) DO
varaltup^[i] := varaltup^[i] + UpCase(x[j]);
END;
END {Varaltupper};
PROCEDURE LeerzeilenEntfernen; { Schritt 5 }
VAR
s, s2 : STRING;
BEGIN
Assign(quelle, zfil); Reset(quelle);
Assign(hilf, hfil); Rewrite(hilf);
WHILE NOT EOF(quelle) DO BEGIN
Readln(quelle, s);
WHILE s[Length(s)] = #32 DO Delete(s, Length(s), 1);
IF (Length(s) > 0) THEN WriteLn(hilf, s);
END;
Close(quelle); Close(hilf);
Assign(ziel, zfil); Erase(ziel); Rename(hilf, zfil);
END {LeerzeilenEntfernen};
BEGIN
PointerInit; nstart := 0; nvar := 0;
ClrScr; WriteLn('SCHLOSS - versteckt Variablen', #13#10);
REPEAT { Eingabemenü }
WriteLn('(1) Codieren ');
WriteLn('(2) - mit altem Crossreferencefile');
WriteLn('(3) Decodieren ');
ReadLn(wahl);
UNTIL wahl IN [1..3];
IF wahl < 3 THEN BEGIN
WriteLn('(1) Numerische Variablennamen ');
WriteLn('(2) Permutationsnamen ');
ReadLn(methode);
END;
IF methode <> 1 THEN methode := 2;
WriteLn;
Write('Quellfile: '); ReadLn(qfil);
IF wahl < 3 THEN BEGIN { Datentypen }
IF Pos('.', qfil) = 0 THEN
qfil := qfil + '.pas';
zfil := Copy(qfil, 1, Pos('.', qfil)) + 'sch';
Write('Schluesselstring: ');
ReadLn(schluessel);
END ELSE BEGIN
IF Pos('.', qfil) = 0 THEN qfil := qfil + '.sch';
zfil := Copy(qfil, 1, Pos('.', qfil)) + 'org';
END;
xfil := Copy(qfil, 1, Pos('.', qfil)) + 'crf';
WriteLn('bestehendes Quellfile: ', qfil);
WriteLn('erzeugtes Zielfile: ', zfil);
WriteLn('erzeugtes Crossreferencefile: ', xfil);
WriteLn;
IF wahl = 2 THEN BEGIN { Codieren }
Write('bestehendes Crossreferencefile: ');
ReadLn(xfil);
IF Pos('.', xfil) = 0 THEN xfil := xfil + '.crf';
WriteLn('Crossreferencefile einlesen...');
CrossreferenceLesen(varalt, varneu);
nstart := nvar;
Varaltupper;
xfil := Copy(qfil, 1, Pos('.', qfil)) + 'crf';
END;
IF wahl IN [1,2] THEN BEGIN
WriteLn;
WriteLn('Kommentare entfernen...');
KommentareEntfernen;
WriteLn('Variablenliste erstellen...'); Variablensuche;
WriteLn('Neue Namen erfinden...'); NeueBezeichner;
Write ('Umbenennen'); Umbenennen(hfil);
WriteLn;
WriteLn('Leerzeilen entfernen...');
LeerzeilenEntfernen;
END;
IF wahl = 3 THEN BEGIN { Decodieren }
WriteLn('Crossreferencefile einlesen...');
CrossreferenceLesen(varneu, varalt); Varaltupper;
Write('Originalnamen einsetzen...'); Umbenennen(qfil);
WriteLn;
END;
WriteLn(#13#10, 'OK.');
END {Schloss}.
(* ------------------------------------------------------ *)
(* Ende von SCHLOSS.PAS *)