home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip: Special Survival Kit
/
Chip_Special_Survival_Kit_fuer_PC_Anwender.iso
/
01tools
/
diet
/
dietger
/
dietctrl.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-09-01
|
13KB
|
529 lines
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X+}
PROGRAM DIETControl; {28.5.1992}
USES
crt,dos;
CONST
recomp = $1;
newcomp = $2;
manucomp = $4;
info = $8;
origsize = $10;
normcol = 23;
highcol = 31;
invcol = 112;
lastopt = 7;
box_x = 5;
box_y = 6;
BS = 8; {Tastaturkonstanten für "keycode"}
Tab = 9;
ShTab = 1015;
RET = 13;
CtrlY = 25;
esc = 27;
F1 = 1059; F2 = 1060; F3 = 1061;
F4 = 1062; F5 = 1063; F6 = 1064;
F7 = 1065; F8 = 1066; F9 = 1067;
F10 = 1068;
Up = 1072; Down = 1080; Left = 1075;
Right = 1077; Home = 1071; Ende = 1079;
PgUp = 1073; PgDn = 1081; Ins = 1082;
Del = 1083;
TYPE
optionobj = object
x,y : byte;
titel : pathstr;
CONSTRUCTOR setzen (nx,ny : byte ; ntitel : pathstr);
PROCEDURE zeigen (aktiv : boolean); virtual;
FUNCTION aktion : word;virtual;
PROCEDURE sichern (var t : text);virtual;
PROCEDURE laden (var t : text); virtual;
end;
schalterobj = object (optionobj)
status : boolean;
CONSTRUCTOR setzen (nx,ny : byte ; nstat : boolean ; ntitel: pathstr);
PROCEDURE zeigen (aktiv : boolean); virtual;
FUNCTION aktion : word;virtual;
PROCEDURE sichern (var t : text); virtual;
PROCEDURE laden (var t : text); virtual;
end;
stringobj = object (optionobj)
str : pathstr;
laenge : byte;
CONSTRUCTOR setzen (nx,ny,nlaenge : byte ; nstr : pathstr ; ntitel : pathstr);
PROCEDURE zeigen (aktiv : boolean); virtual;
FUNCTION aktion : word;virtual;
PROCEDURE sichern (var t : text); virtual;
PROCEDURE laden (var t : text); virtual;
end;
optobjarray = array [1..lastopt] of ^optionobj;
VAR
dietoptionen : optobjarray;
decompschalter,
recompschalter,
newcompschalter,
manucompschalter,
infoschalter,
osizeschalter : schalterobj;
tempdirstr : stringobj;
aktopt,
i : byte;
code : word;
origexit : pointer;
atextattr : byte;
PROCEDURE DIET_aufrufen (var r : registers);
Begin
r.ah := $37;
r.bx := $899D;
intr ($21,r);
End;
FUNCTION DIETver : extstr;
VAR
r : registers;
help : extstr;
Begin
with r do begin
al := $D0;
DIET_aufrufen (r);
if (ax <> 0) or (cx <> $899D) then DIETver := ''
else begin
help := '1. ';
help[3] := char(dh-49);
help[4] := char(dl-32);
DIETver := help;
end;
end;
End;
FUNCTION TSRDIET_aktiv : boolean;
VAR
r : registers;
Begin
with r do begin
al := $D2;
DIET_aufrufen (r);
TSRDIET_aktiv := (dl = 0);
end;
End;
PROCEDURE TSRDIET_aktivieren (aktiv : boolean);
VAR
r : registers;
Begin
with r do begin
al := $D3;
dl := byte(aktiv) xor 1;
dh := 0;
DIET_aufrufen (r);
end;
End;
FUNCTION TSRDIET_Optionen : word;
VAR
r : registers;
help : extstr;
Begin
with r do begin
al := $D4;
DIET_aufrufen (r);
TSRDIET_Optionen := dx;
end;
End;
PROCEDURE TSRDIET_konfigurieren (optionen : word);
VAR
r : registers;
Begin
with r do begin
al := $D5;
dx := optionen;
DIET_aufrufen (r);
end;
End;
FUNCTION Tempdir : dirstr;
VAR
r : registers;
help : char;
pstr : ^dirstr;
Begin
with r do begin
al := $D6;
DIET_aufrufen (r);
pstr := ptr(ds-1,dx+15);
help := pstr^[0];
pstr^[0] := #255;
tempdir := copy(pstr^,1,pos(#0,pstr^)-1);
pstr^[0] := help;
end;
End;
PROCEDURE TempDir_setzen (tempdir : dirstr);
VAR
r : registers;
Begin
with r do begin
al := $D7;
tempdir := tempdir+#0;
ds := seg (tempdir[1]);
dx := ofs (tempdir[1]);
DIET_aufrufen (r);
end;
End;
FUNCTION keycode (caps : boolean) : word;
VAR code : byte;
Begin
if caps then code := ord (upcase (readkey))
else code := ord (readkey);
if code = 0 then keycode := 1000 + ord (readkey)
else keycode := code;
End;
FUNCTION optcode (caps : boolean) : word;
VAR code : word;
Begin
code := keycode (caps);
if code = up then code := ShTab
else if code = down then code := Tab;
optcode := code;
End;
CONSTRUCTOR optionobj.setzen (nx,ny : byte ; ntitel : pathstr);
Begin
if nx <> 0 then x := nx;
if ny <> 0 then y := ny;
if ntitel <> ' ' then titel := ntitel;
End;
PROCEDURE optionobj.zeigen (aktiv : boolean);
Begin
End;
FUNCTION optionobj.aktion : word;
Begin
aktion := 0;
End;
PROCEDURE optionobj.sichern (var t : text);
Begin
End;
PROCEDURE optionobj.laden (var t : text);
Begin
End;
CONSTRUCTOR schalterobj.setzen (nx,ny : byte ; nstat : boolean ; ntitel : pathstr);
Begin
optionobj.setzen (nx,ny,ntitel);
status := nstat;
End;
PROCEDURE schalterobj.zeigen (aktiv : boolean);
Begin
if aktiv then textattr := invcol
else textattr := normcol;
gotoxy (x,y);
write ('[');
if status then write ('X] ')
else write (' ] ');
write (titel);
End;
FUNCTION schalterobj.aktion : word;
VAR
code : word;
ende : boolean;
Begin
zeigen (true);
ende := false;
repeat
gotoxy (x+1,y);
code := optcode (false);
case code of
ret,32 : begin
code := ret;
setzen (0,0,not status,' ');
zeigen (true);
ende := true;
end;
else
ende := true;
end;
until ende;
aktion := code;
zeigen (false);
End;
PROCEDURE schalterobj.sichern (var t : text);
Begin
writeln (t,status);
End;
PROCEDURE schalterobj.laden (var t : text);
VAR
help : extstr;
Begin
readln (t,help);
status := (help = 'TRUE');
End;
CONSTRUCTOR stringobj.setzen (nx,ny,nlaenge : byte ; nstr : pathstr ; ntitel : pathstr);
Begin
optionobj.setzen (nx,ny,ntitel);
if nlaenge <> 0 then laenge := nlaenge;
if nstr[0] > char(laenge) then nstr[0] := char(laenge);
if nstr <> ' ' then str := nstr;
End;
PROCEDURE stringobj.zeigen (aktiv : boolean);
Begin
if aktiv then textattr := invcol
else textattr := normcol;
gotoxy (x,y);
write (titel,': ',str,'':(laenge-length(str)));
End;
FUNCTION stringobj.aktion : word;
VAR
ende : boolean;
code : word;
str_x : byte;
Begin
zeigen (true);
ende := false;
str_x := x+length(titel+': ');
repeat
gotoxy (str_x,y);
write (str,'':laenge-length(str));
gotoxy (str_x+length(str),y);
code := optcode (true);
case code of
32..255 : if length(str) < laenge then str := str + chr(code);
Home,CtrlY : str := '';
BS : delete (str,length(str),1);
else
ende := true;
end;
until ende;
aktion := code;
zeigen (false);
End;
PROCEDURE stringobj.sichern (var t : text);
Begin
writeln (t,str);
End;
PROCEDURE stringobj.laden (var t : text);
Begin
readln (t,str);
End;
PROCEDURE Box_zeichnen;
VAR
y : byte;
PROCEDURE Zeile_zeichnen (s : pathstr);
Begin
gotoxy (box_x,y);
write (s);
inc (y);
End;
Begin
textattr := invcol;
clrscr;
textattr := normcol;
y := box_y;
Zeile_zeichnen ('╔══════════════════════════════════════════════════════════════════════╗');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('╟──────────────────────────────────────────────────────┬───────────────╢');
Zeile_zeichnen ('║ │ F2 : Sichern ║');
Zeile_zeichnen ('║ │ F3 : Laden ║');
Zeile_zeichnen ('║ │ Esc: Ende ║');
Zeile_zeichnen ('║ └───────────────╢');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('║ ║');
Zeile_zeichnen ('╟──────────────────────────────────────────────────────────────────────╢');
Zeile_zeichnen ('║ DIET-Control 1.0 (c) 1992 Axel Orth ║');
Zeile_zeichnen ('╚══════════════════════════════════════════════════════════════════════╝');
gotoxy (box_x+25,box_y+1);
write ('DIET ',dietver,' resident');
End;
FUNCTION bit_gesetzt (w : word ; bit : byte) : boolean;
Begin
bit_gesetzt := w and bit <> 0;
End;
PROCEDURE Schalter_initialisieren;
CONST
opt_x = 2;
opt_y = 2;
VAR
optionen : word;
Begin
dietoptionen[1] := @decompschalter;
dietoptionen[2] := @recompschalter;
dietoptionen[3] := @newcompschalter;
dietoptionen[4] := @manucompschalter;
dietoptionen[5] := @infoschalter;
dietoptionen[6] := @osizeschalter;
dietoptionen[7] := @tempdirstr;
optionen := TSRDIET_Optionen;
decompschalter.setzen (box_x+opt_x,box_y+opt_y+1,TSRDIET_aktiv,'Komprimierte Dateien entkomprimieren');
optionen := TSRDIET_Optionen;
recompschalter.setzen (box_x+opt_x,box_y+opt_y+3,bit_gesetzt (optionen,recomp),'Entkomprimierte Dateien rück-komprimieren');
newcompschalter.setzen (box_x+opt_x,box_y+opt_y+4,bit_gesetzt (optionen,newcomp),'Neu erzeugte Dateien komprimieren');
manucompschalter.setzen (box_x+opt_x,box_y+opt_y+5,bit_gesetzt (optionen,manucomp),
'Komprimierung manuell starten ("diet -$")');
infoschalter.setzen (box_x+opt_x,box_y+opt_y+6,bit_gesetzt (optionen,info),'Komprimierungsmeldungen nicht zeigen');
osizeschalter.setzen (box_x+opt_x,box_y+opt_y+7,bit_gesetzt (optionen,origsize),'Originalgröße zurückmelden');
tempdirstr.setzen (box_x+opt_x,box_y+opt_y+9,35,tempdir,'Verzeichnis für Temporärdateien');
End;
PROCEDURE Optionen_uebertragen;
FUNCTION bitwert (sch : schalterobj; by : byte) : byte;
Begin
bitwert := byte(sch.status)*by;
End;
Begin
TSRDIET_aktivieren (decompschalter.status);
TSRDIET_konfigurieren (bitwert(recompschalter,recomp)
+bitwert(newcompschalter,newcomp)
+bitwert(manucompschalter,manucomp)
+bitwert(infoschalter,info)
+bitwert(osizeschalter,origsize));
with tempdirstr do begin
if (str <> '') and (str[length(str)] <> '\') then begin
setzen (0,0,0,str+'\',' ');
zeigen (false);
end;
tempdir_setzen (str);
end;
End;
FUNCTION cfgpathname : pathstr;
VAR
pfad : dirstr;
help : namestr;
Begin
fsplit (paramstr(0),pfad,help,help);
cfgpathname := pfad+'DIETCTRL.CFG';
End;
PROCEDURE Optionen_sichern;
VAR
i : byte;
t : text;
Begin
assign (t,cfgpathname);
rewrite (t);
for i := 1 to lastopt do dietoptionen[i]^.sichern (t);
close (t);
End;
PROCEDURE Optionen_laden;
VAR
i : byte;
t : text;
Begin
assign (t,cfgpathname);
reset (t);
for i := 1 to lastopt do with dietoptionen[i]^ do begin
laden (t);
zeigen (false);
end;
Optionen_uebertragen;
close (t);
End;
PROCEDURE dcexit;far;
Begin
exitproc := origexit;
textattr := atextattr;
clrscr;
End;
BEGIN
if dietver <> '' then begin
atextattr := textattr;
origexit := exitproc;
exitproc := @dcexit;
Box_zeichnen;
Schalter_initialisieren;
for i := 1 to lastopt do dietoptionen[i]^.zeigen(false);
aktopt := 1;
repeat
code := dietoptionen[aktopt]^.aktion;
Optionen_uebertragen;
case code of
tab : if aktopt < lastopt then inc (aktopt)
else aktopt := 1;
shtab : if aktopt > 1 then dec (aktopt)
else aktopt := lastopt;
F2 : Optionen_sichern;
F3 : Optionen_laden;
end;
until code = esc;
end
else writeln ('DIET ist nicht resident installiert; starten Sie dazu "diet -z".');
END.