home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
press.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1986-10-12
|
5KB
|
135 lines
(* -------------------------------------------------------------------------
Ein Utility zum platzsparenden Abspeichern von ASCII-Dateien
------------------------------------------------------------------------- *)
PROGRAM press (INPUT, OUTPUT);
VAR eindatnam, ausdatnam : STRING [20];
eindatei, ausdatei : TEXT;
(* ------------------------------------------------------------------------- *)
PROCEDURE HoleDatNam;
BEGIN
WriteLn; WriteLn;
WriteLn ('------------------------');
WriteLn (' 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 Press;
CONST EofMarker = 26; (* Markiert Ende der Datei bei CP/M *)
ESC = 27;
Mask = 128; (* 8. Bit setzen bei Wordende *)
Blank = ' ';
VAR chein, chalt : CHAR;
einanz, ausanz,
zaehler : INTEGER;
(* -----------------------------------------------------------------------
Anzahl der aufeinanderfolgenden, gleichen Zeichen ermitteln und diese
ueberlesen (max. 255 an einem Stueck ). *)
PROCEDURE NextChar;
BEGIN
zaehler := 0;
REPEAT
zaehler := Succ (zaehler);
IF NOT Eof (eindatei) THEN
Read (eindatei, chein);
UNTIL (chein <> chalt) OR (zaehler = 255) OR Eof (eindatei);
END; (* NextChar *)
(* -----------------------------------------------------------------------
Wenn Leerzeichen gelesen, dann bei vorrangegangenem Zeichen Bit 7
setzen und naechstes Zeichen lesen. *)
PROCEDURE WortEnde;
BEGIN
IF NOT Eof (eindatei) THEN
IF (chalt <> Blank) AND (chein = Blank) THEN
BEGIN
Read (eindatei, chein);
einanz := Succ (einanz);
chalt := Chr (Ord (chalt) + Mask);
END;
END; (* WortEnde *)
(* ------------------------------------------------------------------------- *)
BEGIN (* Press *)
einanz := 0; ausanz := 0;
Read (eindatei, chalt);
REPEAT
NextChar;
einanz := einanz + zaehler;
WortEnde;
ausanz := Succ (ausanz);
CASE zaehler OF
1 : Write (ausdatei, chalt); (* ein einzelnes Zeichen, ok! *)
2 : BEGIN (* ein Zeichenpaar: *)
IF Ord (chalt) < Mask THEN (* nicht Wordende, Bit 7 des *)
Write (ausdatei, chalt) (* ersten Zeichens ist normal *)
ELSE (* sonst Bit zuruecksetzen. *)
Write (ausdatei, Chr (Ord (chalt) - Mask));
Write (ausdatei, chalt); (* und zweites Zeichen. *)
ausanz := Succ (ausanz);
END;
EofMarker : BEGIN (* bei dieser Anzahl glei- *)
Write (ausdatei, Chr (ESC)); (* cher Zeichen eine Son- *)
Write (ausdatei, Chr (ESC)); (* derbehandlung. *)
Write (ausdatei, chalt);
ausanz := ausanz + 2;
END
ELSE (* sonst gleiche Zeichen *)
BEGIN (* komprimiert ausgeben. *)
Write (ausdatei, Chr (ESC));
Write (ausdatei, chalt);
Write (ausdatei, Chr (zaehler));
ausanz := ausanz + 2;
END;
END;
chalt := chein;
IF einanz MOD 1024 < 2 THEN (* Damit man sieht, dass sich etwas tut. *)
Write ('.');
UNTIL Eof (eindatei);
Close (eindatei);
Close (ausdatei);
WriteLn; WriteLn;
WriteLn (einanz:7,' Zeichen aus ''',eindatnam,''' gelesen,');
WriteLn (ausanz:7,' Zeichen nach ''',ausdatnam,''' geschrieben.');
END; (* Press *)
BEGIN
HoleDatNam;
OeffneDateien;
Press;
END.