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