home *** CD-ROM | disk | FTP | other *** search
- (* -------------------------------------------------------------------------
- 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.
-