home *** CD-ROM | disk | FTP | other *** search
- PROGRAM TurboText;
-
- { Dieses Program erzeugt ein Turbo Pascal Programmstueck }
- { aus einem mit einem beliebigen Editor erzeugten Text. }
-
- { - Copyright (c) 1988 Pascal International - }
- { - Autor : Heinz Hagemeyer - }
-
- { -------------------------------------------------------- }
-
- CONST literal = '''' ;{ oder auch #96 }
- CR = 13 ;{ ASCII von Carrige Return }
- tab_w = ' ' ;
- zeilenlaenge = 60 ;{ Anzahl der Zeichen einer }
- { Zeile. }
- TYPE filename = STRING [ 80] ;
- str40 = STRING [ 40] ;
- str15 = STRING [ 15] ;
- buchstaben = SET OF CHAR ;
-
- VAR ziel, quelle : TEXT ;
- procedure_name : str40 ;
- trans : ARRAY [1..6, 1..3] OF str15;
- target : INTEGER ;
- ws : BOOLEAN ;
-
- { ---------------------------------------------------------}
-
- FUNCTION Tasten_Code
- (echo : BOOLEAN ; welche : buchstaben ) : CHAR ;
-
- { gibt den Tastencode einer Taste zurueck, wenn diese in }
- { der Menge WELCHE enthalten ist. }
- { Echo = true ==> Anzeige auf dem Bildschirm; }
- { Echo = false ==> keine Anzeige }
-
- VAR c : CHAR ;
-
- BEGIN
- REPEAT
- Read (kbd,c);
- UNTIL c IN welche ;
-
- IF echo THEN WriteLn (c);
- tasten_code := c;
- END;
-
- { -------------------------------------------------------- }
-
- PROCEDURE maske;
-
- BEGIN
- Write('╔══════════════════════════════════════════',
- '══════════════════════════════════╗'); WriteLn;
- Write('║ TurboText ',
- ' ║'); WriteLn;
- Write('╠══════════════════════════════════════════',
- '══════════════════════════════════╣'); WriteLn;
- Write('║ ┌─────────────────────────────────',
- '─────────────────────────┐ ║'); WriteLn;
- Write('║ │ Geben Sie den Namen der Quellda',
- 'tei ein : │ ║'); WriteLn;
- Write('║ │ Ist die Quelldatei WS-Datei (J/',
- 'N) : │ ║'); WriteLn;
- Write('║ │ Jetzt den Namen Ihres Pascal-Pr',
- 'ogramms : │ ║'); WriteLn;
- Write('║ │ Bitte den Namen der Prozedur ei',
- 'ngeben : │ ║'); WriteLn;
- Write('║ └─────────────────────────────────',
- '─────────────────────────┘ ║'); WriteLn;
- Write('║ ┌─────────────────────────────────',
- '─────────────────────────┐ ║'); WriteLn;
- Write('║ │ Wird die Eingabe der Prozedur m',
- 'it <CR> übergangen, │ ║'); WriteLn;
- Write('║ │ wird ein Pascal-Quellcode erzeu',
- 'gt, der in ein Pro- │ ║'); WriteLn;
- Write('║ │ gramm eingebunden werden kann. ',
- ' │ ║'); WriteLn;
- Write('║ │ Andernfalls wird eine lauffähig',
- 'e Prozedur erzeugt, die │ ║'); WriteLn;
- Write('║ │ mittels {$I} eingeschlossen wir',
- 'd. │ ║'); WriteLn;
- Write('║ └─────────────────────────────────',
- '─────────────────────────┘ ║'); WriteLn;
- Write('║ ┌─────────────────────────────────',
- '─────────────────────────┐ ║'); WriteLn;
- Write('║ │ Zielsprache [1] Pascal.. ',
- ' │ ║'); WriteLn;
- Write('║ │ [2] BASIC... ',
- ' │ ║'); WriteLn;
- Write('║ │ [3] C....... bitte ',
- 'wählen : │ ║'); WriteLn;
- Write('║ │ Wieviele Spalten einrücken ....',
- '........? │ ║'); WriteLn;
- Write('║ └─────────────────────────────────',
- '─────────────────────────┘ ║'); WriteLn;
- Write('║ ',
- ' ║'); WriteLn;
- Write('╚══════════════════════════════════════════',
- '══════════════════════════════════╝');
- END;
-
- { -------------------------------------------------------- }
-
- PROCEDURE init;
-
- BEGIN
- { Pascal-Syntax }
- trans[1,1] := 'Write(''';
- trans[2,1] := '''); WriteLn;';
- trans[3,1] := ''',';
- trans[4,1] := 'WriteLn('''')';
- trans[5,1] := 'WriteLn;';
- trans[6,1] := '''';
- { BASIC-Syntax }
- trans[1,2] := 'PRINT " ';
- trans[2,2] := ' " ';
- trans[3,2] := ' "; ';
- trans[4,2] := 'PRINT " ';
- trans[5,2] := 'PRINT';
- trans[6,2] := 'PRINT ';
- { C-Syntax }
- trans[1,3] := 'printf(" ';
- trans[2,3] := ' \n");';
- trans[3,3] := ' ")';
- trans[4,3] := 'printf(" ';
- trans[5,3] := 'printf("\n")';
- trans[6,3] := 'printf(" ';
- END;
-
- { -------------------------------------------------------- }
-
- PROCEDURE oeffne_quell_datei (VAR quelle : TEXT);
-
- { Oeffnet die Quelldatei zum Lesen. Ueberprueft gleichzei- }
- { tig, ob diese ueberhaupt vorhanden ist. Falls nicht, }
- { erfolgt Programmabbruch ! }
-
- VAR quell_name : filename ;
- taste : CHAR ;
-
- BEGIN
- GotoXY (54, 5);
- ReadLn (quell_name);
-
- Assign (quelle, quell_name);
-
- {$I-} { Fehlerueberwachung aus }
- Reset (quelle);
- {$I+} { und wieder ein. }
-
- IF IOResult <> 0 THEN BEGIN { Falls Fehler aufgetreten }
- ClrScr;
- WriteLn ('** Oben eingegebene Quelldatei existiert',
- ' nicht ! **': 68);
- WriteLn ('** Programm wird daher abgebrochen ',
- '! **': 68);
- HALT;
- END;
-
- REPEAT
- GotoXY (54, 6);
- Read (kbd, taste);
- Write (taste);
- UNTIL (taste = 'j') or (taste = 'J') or (taste = 'n') or
- (taste = 'N');
- taste := upcase (taste);
-
- ws := false;
- { Ist WS auf false gesetzt, erfolgt keine Ausblendung des }
- { Bit 7 und keine Auswertung der von Wordstar benutzten }
- { Steuerzeichen. }
- IF taste = 'J' THEN ws := true;
-
- END; { Oeffne_quell_datei }
-
- { -------------------------------------------------------- }
-
- PROCEDURE oeffne_ziel_datei ( VAR ziel : TEXT ;
- VAR procedure_name : str40 );
-
- CONST egal_welcher : buchstaben = [#0 .. #255];
-
- VAR ziel_name : filename ;
- c : CHAR ;
- BEGIN
- GotoXY (54, 7);
- ReadLn (ziel_name);
-
- Assign (ziel, ziel_name);
-
- {$I-} { Siehe oeffne quelldatei }
- Reset (ziel );
- {$I+}
-
- IF IOResult = 0 THEN BEGIN
-
- { Wenn kein Fehler auftritt, ist die Zieldatei }
- { vorhanden. Sicherheitshalber wird dann abge- }
- { fragt, ob diese ueberschrieben werden darf. }
- { Wenn nicht, erfolgt Programmabbruch. }
-
- GotoXY(10,25);
- Write ('Zieldatei ',Ziel_name,' existiert bereits.');
- Write ('Ueberschreiben (J/N) ? ');
- REPEAT
- Read (kbd, c);
- Write (c);
- UNTIL (c = 'j') or (c = 'J') or (c = 'n') or
- (c = 'N');
- c := upcase (c);
-
- IF c = 'N' THEN BEGIN
- ClrScr;
- WriteLn ('** Programm wird abgebrochen ! **' : 58);
- HALT;
- END;
- GotoXY (1,25);
- Write (' ');
- Write (' ');
- END;
-
- ReWrite (ziel) ;
- GotoXY (54, 8);
- ReadLn (procedure_name);
- GotoXY (54,20);
- ReadLn (target);
- IF target >= 3 THEN target := 3;
- IF target <= 1 THEN target := 1;
- END { Oeffne_Quell_Datei } ;
-
- { ---------------------------------------------------------}
-
- PROCEDURE Arbeite
- (VAR Quelle, Ziel : TEXT ; Procedure_Name : str40 );
-
- TYPE Zeile = STRING [255];
-
- CONST BTX = TRUE ;
-
- { Wird BTX (Bild_Schirm_Text) auf false gesetzt, erfolgt }
- { keine Ausgabe auf dem Bildschirm. Geht schneller - }
- { dafuer sieht man nicht's . }
-
- VAR tab : filename ;
- anzahl,
- ascii : INTEGER ;
- CR_da : BOOLEAN;
- c : CHAR;
- z : Zeile;
-
- BEGIN
- IF procedure_name <> '' THEN BEGIN
- tab := ' ';
- WriteLn (ziel,'PROCEDURE ',procedure_name,';');
- WriteLn (ziel,'BEGIN');
- IF BTX THEN BEGIN
- ClrScr;
- WriteLn ('PROCEDURE ',procedure_name,';');
- WriteLn ('BEGIN');
- END;
- END
- ELSE BEGIN
- tab := '';
- GotoXY(54,21);
- ReadLn (anzahl);
- FOR anzahl := anzahl DOWNTO 1 DO tab := tab + ' ';
- END;
-
- ClrScr;
- anzahl := 0;
- Z := Tab + trans[1,target];
- CR_da := FALSE;
-
- WHILE NOT EoF (quelle) DO BEGIN
- IF NOT CR_da THEN Read (quelle,c);
-
- ascii := ord (c);
-
- { Fuer Wordstar - Muffel : Bei bestehenden Texten, }
- { welche nicht durch Wordstar unter CP/M erzeugt }
- { wurden, sind die folgenden Zeilen dann zu entfer- }
- { nen bzw. geeignet zu aendern, wenn das verwendete }
- { Textprogramm das 7.te Bit anders nutzt. }
- { Am Einfachsten geht dies durch Aendern der Konstan- }
- { ten WS. Bei Benutzung des Turbo Pascal Editors ist }
- { dies nicht noetig, es sei denn, man benutzt das ^P- }
- { Steuerzeichen. }
-
- IF WS THEN BEGIN
- WHILE ascii > $7F DO ascii := ascii - $80;
- c := Chr (ascii);
- IF ascii = $1F THEN Z := Z + '-' ;
- { "weiches" Trennzeichen }
- END;
-
- IF ascii = CR THEN BEGIN { Carrige Return }
- { = Zeilenende }
- CR_da := TRUE;
- Z := Z + trans[2,target];
-
- { Die folgende Anweisung wandelt "WriteLn ('''');" }
- { um in "WriteLn ;" }
-
- IF z = tab + trans[4,target] THEN
- z := tab + trans[5,target];
-
- WriteLn (ziel,z);
- IF BTX THEN WriteLn (z);
-
- Read (quelle,c);
- anzahl := 0;
-
- IF NOT EoF (quelle) THEN { Kein Textende }
- Z := tab + trans[1,target];
- END
- ELSE BEGIN
- CR_da := FALSE;
- IF ascii > $1F THEN BEGIN { kein Steuerzeichen }
- Z := Z + c ;
- anzahl := Succ (anzahl);
-
- IF (anzahl >= zeilenlaenge - Length(tab) - 15)
- AND (c <> literal) THEN BEGIN
-
- { Zur besseren Uebersichtlichkeit des erzeugten }
- { Programmtextes werden die maximal auf dem Bild- }
- { schirm darstellbaren Zeichen in einer Zeile in 2 }
- { Zeilen aufgeteilt, wobei das Literalzeichen ' }
- { nicht zerhackt werden darf. (Siehe auch weiter }
- { unten.) }
-
- Z := Z + trans[3,target];
- WriteLn (ziel,Z);
- IF BTX THEN WriteLn (z);
- IF target = 1 THEN
- Z := tab + tab_w + trans[6,target];
- IF (target = 2) or (target = 3) THEN
- Z := tab + trans[4,target];
- anzahl := 0;
- END;
- END;
- END;
-
- { Steht das Literalbegrenzungszeichen inerhalb }
- { eines Literals, so muss es 2 mal geschrieben }
- { werden. Soll z.B. der Text "Das war's." auf dem }
- { Bildschirm ausgegeben werden, so lautet die ent- }
- { sprechende Schreibanweisung in Pascal : }
- { WriteLn ('Das war''s.'); }
- { Daher muessen die Literale doppelt geschrieben }
- { werden. }
-
- IF c = literal THEN BEGIN
- Z := Z + literal;
- Anzahl := Succ (Anzahl);
- END;
- END { WHILE } ;
-
- IF procedure_name <> '' THEN BEGIN
- WriteLn (ziel,'END;');
- IF BTX THEN WriteLn ('END;');
- END;
-
- END { ARBEITE };
-
- { -------------------------------------------------------- }
-
- BEGIN { ** Hauptprogramm ** }
-
- init;
- ClrScr;
- maske;
- Oeffne_Quell_Datei (quelle);
- Oeffne_Ziel_Datei (ziel, procedure_name);
- Arbeite (quelle, ziel, procedure_name);
- Close (quelle);
- Close (ziel );
-
- END.