home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
unpress.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1986-10-12
|
4KB
|
124 lines
(* -------------------------------------------------------------------------
Ein Utility zum platzsparenden Abspeichern von ASCII-Dateien
------------------------------------------------------------------------- *)
PROGRAM UnPress (INPUT, OUTPUT);
VAR eindatnam, ausdatnam : STRING [20];
eindatei, ausdatei : TEXT;
(* ------------------------------------------------------------------------- *)
PROCEDURE HoleDatNam;
BEGIN
WriteLn; WriteLn;
WriteLn ('------------------------');
WriteLn (' U N P R E S S v0.1 ');
WriteLn ('------------------------');
WriteLn; WriteLn;
Write ('Welche Datei soll bearbeitet werden ? ');
Read (eindatnam);
WriteLn; WriteLn;
Write ('Wie soll die Ausgabedatei heissen ? ');
Read (ausdatnam);
WriteLn; WriteLn;
END; (* HoleDatNam *)
(* ------------------------------------------------------------------------- *)
PROCEDURE OeffneDateien;
BEGIN
Assign (eindatei, eindatnam); (* Quelldatei zum *)
Reset (eindatei); (* lesen oeffnen. *)
Assign (ausdatei, ausdatnam); (* Zieldatei zum *)
Rewrite (ausdatei); (* schreiben oeffnen. *)
END; (* OeffneDateien *)
(* ------------------------------------------------------------------------- *)
PROCEDURE UnPress;
CONST EofMarker = 26; (* Markiert Ende der Datei bei CP/M *)
ESC = 27;
Mask = 128; (* 8. Bit setzen bei Wordende *)
Blank = ' ';
VAR ch, chtmp : CHAR;
einanz, ausanz, i : INTEGER;
BlankFg : BOOLEAN;
(* -----------------------------------------------------------------------
Pruefen, ob 'gepresstes' Zeichen am Ende eines Wortes. Wenn ja, Bit 7
zuruecksetzen und melden, dass nach dem Zeichen ein Leerzeichen
folgen muss. *)
FUNCTION BlankApp (VAR ch : CHAR) : BOOLEAN;
BEGIN
BlankApp := False;
IF NOT (Ord (ch) < Mask) THEN
BEGIN
ch := Chr (Ord (ch) - Mask);
BlankApp := True;
END;
END; (* BlankApp *)
(* ------------------------------------------------------------------------- *)
BEGIN (* UnPress *)
einanz := 1; ausanz := 1;
Read (eindatei, ch);
WHILE NOT Eof (eindatei) DO BEGIN
einanz := Succ (einanz);
CASE Ord (ch) OF
ESC : BEGIN (* komprimiertes Zeichen! *)
Read (eindatei, ch, chtmp);
einanz := einanz + 2;
CASE Ord (ch) OF
ESC : BEGIN (* Anzahl = EOF-Kennung! *)
BlankFg := BlankApp (chtmp);
For i := 1 TO EofMarker DO
Write (ausdatei, chtmp);
ausanz := ausanz + EofMarker;
END
ELSE
BEGIN (* Anzahl <> EOF-Kennung! *)
BlankFg := BlankApp (ch);
For i := 1 TO Ord (chtmp) DO
Write (ausdatei, ch);
ausanz := ausanz + Ord (chtmp);
END;
END;
END;
ELSE
BEGIN (* einzelnes Zeichen! *)
BlankFg := BlankApp (ch);
Write (ausdatei, ch);
ausanz := Succ (ausanz);
END;
END;
If BlankFg THEN (* Am Wortende ein Leerzeichen einfuegen. *)
BEGIN
Write (ausdatei, Blank);
ausanz := Succ (ausanz);
END;
IF ausanz MOD 1024 < 2 THEN
Write ('.');
Read (eindatei, ch);
END;
Close (eindatei);
Close (ausdatei);
WriteLn; WriteLn;
WriteLn (einanz:7,' Zeichen aus ''',eindatnam,''' gelesen,');
WriteLn (ausanz:7,' Zeichen nach ''',ausdatnam,''' geschrieben.');
END; (* UnPress *)
BEGIN
HoleDatNam;
OeffneDateien;
UnPress;
END.