home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
oberon
/
ps2asc.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-10-14
|
8KB
|
307 lines
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
{$M 16384,0,0}
(*------------------------------------------------*)
(* PS2ASC.PAS Version 0.9 *)
(*------------------------------------------------*)
(* Copyright (C) 1991 J. Braun & DMV-Verlag *)
(* *)
(* wandelt eine Postscript-Datei in das ASCII- *)
(* Format zurück. *)
(*------------------------------------------------*)
PROGRAM Postscript2Ascii;
USES
Dos;
VAR
InFileName, OutFileName : PathStr;
InFile, OutFile : TEXT;
CONST
Init : BOOLEAN = FALSE;
OldNum : LONGINT = 0;
InFileOpen : BOOLEAN = FALSE;
OutFileOpen : BOOLEAN = FALSE;
DefExt : STRING[4] = '.PS';
Version : STRING[4] = 'v0.9';
Copyright : STRING[41] = 'Copyright (C) 1991 J. Braun '
+ '& DOS-toolbox';
CONST
TAB = Chr(9);
LF = Chr(10);
FF = Chr(12);
CR = Chr(13);
SPC = Chr(32);
PROCEDURE ErrorMessage(Msg: BYTE);
VAR
s: STRING;
BEGIN
CASE Msg OF
1: s := 'Datei wurde nicht gefunden oder kann nicht ' +
'bearbeitet werden.';
2: s := 'Kein Dateiname angegeben.';
ELSE s := '';
END;
WriteLn(s);
END;
PROCEDURE Terminate(ExitCode: WORD);
BEGIN
IF ExitCode > 0 THEN
WriteLn(CR + LF + 'Programm wurde abgebrochen!');
IF InFileOpen THEN Close(InFile);
IF OutFileOpen THEN Close(OutFile);
Halt(ExitCode);
END;
PROCEDURE Help;
BEGIN
WriteLn(CR + LF + 'PS2ASC Postscript nach ASCII-Wandler '
+ Version);
WriteLn(Copyright);
WriteLn(' Aufruf:');
WriteLn(TAB + 'PS2ASC [Dateiname[.Ext]]');
WriteLn(TAB + 'Default-Extension ist .PS');
Terminate(0);
END;
FUNCTION WhichFile: PathStr;
VAR
InFileName: PathStr;
HasExt,
Exists: BOOLEAN;
Attr : WORD;
s : SearchRec;
i : BYTE;
BEGIN
IF ParamCount = 0 THEN BEGIN
Write('Dateiname mit Pfad: ');
ReadLn(InFileName);
END ELSE InFileName := ParamStr(1);
IF Length(InFileName) > 0 THEN
IF (Pos('?' , InFileName) > 0) OR
(Pos('*' , InFileName) > 0) THEN Help;
IF Length(InFileName) = 0 THEN BEGIN
ErrorMessage(2);
Terminate(2);
END
ELSE FOR i := 1 TO Length(InFileName) DO
InFileName[i] := UpCase(InFileName[i]);
HasExt := Pos(DefExt, InFileName) > 0;
IF NOT HasExt THEN
IF InFileName[Length(InFileName)] = '.' THEN
HasExt := TRUE;
IF NOT HasExt THEN
InFileName := Concat(InFileName, DefExt);
FindFirst(InFileName, Archive, s);
Exists := DosError = 0;
IF NOT Exists THEN BEGIN
ErrorMessage(1);
Terminate(4);
END;
WriteLn('PS2ASC Postscript nach ASCII-Wandler '
+ Version);
WriteLn(Copyright + CR + LF);
Assign(InFile, InFileName);
Reset(InFile);
InFileOpen := TRUE;
WhichFile := InFileName;
END;
PROCEDURE Convert(InFileName: PathStr);
VAR
Line, NewLine : STRING;
FPath : DirStr;
FName : NameStr;
FExt : ExtStr;
PROCEDURE ParseLine(Line: STRING; VAR NewLine: STRING);
VAR
NewNum : LONGINT;
TextRest : STRING;
PROCEDURE SearchEndComment;
(*--------------------------------------------*)
(* Hier sollten auch noch die Makrobezeichner *)
(* gesucht werden ! *)
(*--------------------------------------------*)
VAR
Level : SHORTINT;
i : BYTE;
BEGIN
REPEAT
Level := 0;
FOR i := 1 TO Length(Line) DO BEGIN
IF Line[i] = '{' THEN Inc(Level);
IF Line[i] = '}' THEN Dec(Level);
END;
IF (Level > 0) OR (i >= Length(Line)) THEN
ReadLn(InFile, Line);
UNTIL (Pos('def', Line) > 0) AND (Level = 0);
END; (* SearchEndComment *)
FUNCTION SplitLine(Line: STRING;
VAR Rest: STRING): LONGINT;
VAR
Done : BOOLEAN;
Number: LONGINT;
FUNCTION Parse1stNum(Line: STRING;
VAR Rest: STRING): BOOLEAN;
VAR
s : STRING;
l : LONGINT;
i : BYTE;
BEGIN
i := 1;
s := '';
WHILE Line[i] <> SPC DO
BEGIN
s := Concat(s, Line[i]);
Inc(i);
END;
Delete(Line, 1, Length(s) + 1);
Rest := Line;
Parse1stNum := TRUE;
END;
FUNCTION Parse2ndNum(VAR Rest: STRING;
VAR Number: LONGINT): BOOLEAN;
VAR
s : STRING;
i : BYTE;
code : INTEGER;
BEGIN
i := 1;
s := '';
WHILE Rest[i] <> SPC DO
BEGIN
s := Concat(s, Rest[i]);
Inc(i);
END;
Delete(Rest, 1, Length(s) + 1);
Val(s, Number, code);
IF code <> 0 THEN
BEGIN
Number := 0;
IF s = 'p' THEN WriteLn(OutFile, FF);
END;
Parse2ndNum := code = 0;
END;
FUNCTION ParseText(VAR Rest: STRING): BOOLEAN;
VAR
Level : SHORTINT;
i, l : INTEGER;
s : STRING;
PROCEDURE OpenBracket;
BEGIN
IF (i > 1) AND (i < l) THEN BEGIN
IF Rest[i + 1] = ')' THEN
IF Rest[i-1] <> '\' THEN Rest[i] := CR;
IF (Rest[i - 1] <> '\') THEN
BEGIN
Inc(Level);
Rest[i] := SPC;
END;
END;
END;
PROCEDURE CloseBracket;
BEGIN
IF i > 1 THEN
IF Rest[i - 1] = CR THEN Rest[i] := LF;
IF NOT (Rest[i - 1] IN ['\', '(']) THEN BEGIN
Dec(Level);
Rest[i] := SPC;
END;
END;
PROCEDURE BackSlash;
BEGIN
IF i < l THEN
IF Rest[i + 1] IN [')', '('] THEN Inc(i);
END;
BEGIN
Level := 0; l := Length(Rest); s := ''; i := 1;
REPEAT
CASE Rest[i] OF
'(': OpenBracket;
')': CloseBracket;
'\': BackSlash;
END;
IF Level <> 0 THEN s := s + Rest[i];
Inc(i);
UNTIL i >= l;
IF Level <> 0 THEN s := Concat(s, Rest[i]);
IF (Pos('Syntax', s) > 0) AND
(Pos('.Fnt', s) > 0) THEN BEGIN
Delete(s, Pos('Syntax', s),
Pos('.Fnt', s) + 4 - Pos('Syntax', s));
END;
Rest := s;
ParseText := TRUE;
END;
BEGIN
Number := 0;
Done := Parse1stNum(Line, Rest);
IF Parse2ndNum(Rest, Number) THEN
Done := ParseText(Rest);
SplitLine := Number;
END; (* SplitLine *)
BEGIN
IF (Line[1] = '/') THEN
IF UpCase(Line[2]) IN ['A' .. 'Z'] THEN BEGIN
SearchEndComment;
Exit;
END;
IF Pos('init', Line) = 1 THEN
BEGIN
Init := TRUE;
ReadLn(InFile, Line);
END;
IF Init THEN
BEGIN
IF Line[1] IN ['1' .. '9'] THEN
NewNum := SplitLine(Line, TextRest)
ELSE TextRest := '';
IF (NewNum <> OldNum) THEN BEGIN
WriteLn(OutFile); WriteLn;
END;
Write(TextRest);
Write(OutFile, TextRest);
OldNum := NewNum;
END;
END; (* ParseLine *)
BEGIN
NewLine := '';
FSplit(InFileName, FPath, FName, FExt);
OutFileName := Concat(FPath, FName, '.ASC');
Assign(OutFile, OutFileName);
ReWrite(OutFile);
OutFileOpen := TRUE;
WHILE NOT EoF(InFile) DO BEGIN
ReadLn(InFile, Line);
IF Length(Line) > 0 THEN BEGIN
IF Line[1] <> '%' THEN (* Kommentarzeile *)
ParseLine(Line, NewLine);
END;
END;
Close(InFile); Close(OutFile);
InFileOpen := FALSE; OutFileOpen := FALSE;
END;
BEGIN
Convert(WhichFile);
END.