home *** CD-ROM | disk | FTP | other *** search
- PROGRAM txt2exe_Uebersetzer;
- {
- Dies ist der Turbo-Pascal-Quelltext zu einer einfachen Version von
- TXT2EXE. Benötigt wird TP6.0 oder TP7.0/BP7.0
-
- * Beliebige Textlänge (max 2 GigaByte // maxLongInt )
- * max. 80 Z. / Zeile (sorry)
- * keine Maus ( "" )
- * keine Überschrift ( "" )
- * keine Stichwortlite ( "" )
- .... ( "" )
-
- Autor : P.Fischer-Haaser
- Mozartstr. 10
- 74072 Heilbronn
- Tel.: 07131/81947
- Fax: 07131/962843
- }
-
- {$DEFINE FalscherCompiler}
-
- {$IFNDEF Ver60}
- {$ifdef Ver70}
- {$undef FalscherCompiler}
- {$EndIF}
- {$else}
- {$undef FalscherCompiler}
- {$Endif}
-
- {$ifdef FalscherCompiler}
- BEGIN
- WriteLn('Turbo Pascal Version 6.0 / 7.0 besorgen');
-
- {$else}
- {$Ifdef Ver60}
-
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X+}
- {$M 8192,0,64000}
-
- {$else}
-
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,R-,S-,V-,X+,Y-}
- {$M 8192,0,64000}
-
- { ACHTUNG: wenn Programm als DPMI-Anwendung sind einige Änderungen notwendig... }
-
- {$endif}
-
- USES crt,dos;
-
- (***************************************************************************)
-
- CONST
- MAGIC = 3727; { Länge von T2BR.EXE }
- TmpFile = '~TXT2EXE.$$1';
- TmpLong = '~TXT2EXE.$$2';
- Browser = 'T2BR.EXE';
- t2e : STRING[4] = 'T2E ';
- Version :STRING[32] = '(2.01) PD Version (incl. Source)';
- Zeilen : LongInt = 0;
- TabOffset : LongInt = 0;
-
- (***************************************************************************)
-
- TYPE
- PuffTyp = ARRAY[0..8192] OF Byte;
- PuffPtr = ^PuffTyp;
-
- (***************************************************************************)
-
- VAR
- geLesen, geSchrieben : Word;
- TxtPuffer : PuffPtr;
- Puffer : PuffPtr;
- prgdir,prgname,prgext : STRING;
-
- (***************************************************************************)
-
- FUNCTION HeapFunc(size : word) : Integer; FAR;
- { getmem liefert NIL-Ptr wenn zu wenig Speicher da }
- BEGIN
- HeapFunc := 1
- END;
-
- (***************************************************************************)
-
- PROCEDURE addch(VAR S : STRING; c : Char);
- { sehr schnelles S :=S + c }
- VAR
- L : Byte ABSOLUTE S;
- BEGIN
- IF L = 255 THEN Exit;
- Inc(L);
- S[L] := c
- END; { addch }
-
- (***************************************************************************)
-
- PROCEDURE AddStr(VAR S1, s2 : STRING);
- { sehr schnelles S1 := S1 + s2 }
- VAR
- L1 : Byte ABSOLUTE S1;
- L2 : Byte ABSOLUTE s2;
- i : Byte;
- BEGIN
- FOR i := 1 TO L2 DO
- BEGIN
- Inc(L1);
- S1[L1] := s2[i]
- END
- END; { addstr }
-
- (***************************************************************************)
-
- FUNCTION UpString(s:STRING) : STRING;
- { Ersatz für :
- for i := 1 to length(S) do
- s[i] := upcase(s[i]) }
- VAR
- L : Byte ABSOLUTE S;
- i : Byte;
- tmpS : STRING;
- BEGIN
- tmpS := '';
- FOR i := 1 TO L DO
- addch(tmpS,UpCase(s[i]));
- UpString := tmpS
- END;
-
- (***************************************************************************)
-
- FUNCTION Replicate(nr : Byte; ch : Char) : STRING;
- { Replicate := String aus 'nr' mal 'ch' }
- VAR
- i : Byte;
- tmp : STRING;
- BEGIN
- tmp := '';
- FOR i := 1 TO nr DO addch(tmp,ch);
- Replicate := tmp
- END; { replicate }
-
- (***************************************************************************)
-
- PROCEDURE HaltError(s : STRING);
- { s Schreiben un STOP !!! }
- BEGIN
- WriteLn(s);
- Halt(255)
- END; { Halterror }
-
- (***************************************************************************)
-
- PROCEDURE FileError(nr : Integer);
- { mögliche Fehler ... }
- VAR
- msg : STRING;
- BEGIN
- CASE nr OF
- 1 : msg := 'Lesefehler';
- 2 : msg := 'Schreibfehler';
- 3 : msg := 'Zu wenig Speicher';
- 4 : msg := 'Abbruch';
- 5 : msg := 'Fehler in Browser-Modul'
- END;
- HaltError(msg)
- END; { FileError }
-
- (***************************************************************************)
-
- FUNCTION Exist(FName : STRING) : Boolean;
- { Existiert Datei (FName) aus TP-PROF }
- VAR
- R : Registers;
- FLen : Byte ABSOLUTE FName;
- BEGIN
- IF Length(FName) = 0 THEN
- Exist := False
- ELSE WITH R DO BEGIN
- Inc(FLen);
- FName[FLen] := #0; { Dateinamen mit #0 terminieren }
- AX := $4300; { ah : $43 }
- DS := Seg(FName); { ds:dx : Filename (ASIIZ) }
- DX := Ofs(FName[1]);
- MsDos(R); { DOS - Call }
- Exist := (NOT Odd(Flags)) AND (IOResult = 0) AND
- (CX AND (VolumeID+Directory) = 0)
- END
- END; { Exist }
-
- (***************************************************************************)
-
- FUNCTION GetKey : Integer;
- { so was wie ReadKey aber MIT Sondertasten (Code > 1000) }
- VAR
- r : Registers;
- BEGIN
- r.Ah := 0; { BIOS - WAIT-Key }
- Intr($16, r);
- IF r.AL = 0 THEN
- GetKey := 1000+r.Ah
- ELSE
- GetKey := r.AL
- END; { GetKey }
-
- (***************************************************************************)
-
- PROCEDURE Help;
- { Signon-Message }
- BEGIN
- WriteLn('Zweck : Texte in lauffähige EXE-Dateien umwandeln.');
- WriteLn('Aufruf : ',t2e,' <Textdatei> <Programmdatei.EXE>');
- Halt(1)
- END; { Help }
-
-
- (***************************************************************************)
-
- FUNCTION GetFileLength(FN : STRING) : LongInt;
- { Datei-Länge kommt zurück }
- VAR
- len : LongInt;
- f : FILE;
- savemode : Byte;
- BEGIN
- savemode := filemode;
- filemode := 0; { readonly->egal }
- Assign(f, FN);
- Reset(f, 1);
- IF IOResult <> 0 THEN
- FileError(1); { nicht da }
- len := FileSize(f); { Länge in Bytes feststellen }
- Close(f);
- filemode := savemode;
- GetFileLength := len
- END; { Checklength }
-
- (***************************************************************************)
-
- PROCEDURE Compile;
- VAR
- fprg, ftxt , long : FILE;
- txt : Text;
- c : Char;
- s : STRING;
- txtpos : LongInt;
- DummyStr : STRING;
- BEGIN
-
- WriteLn(T2E+version); { Meldung }
-
- IF ParamCount < 2 THEN { T2E benötigt 2 Parameter }
- Help
- ELSE
- BEGIN
- IF NOT EXIST(prgdir+browser) THEN { Browser im Programm-Verzeichnis ? }
- Halterror('Browser-Modul (T2BR.EXE) nicht gefunden');
-
- IF NOT Exist(ParamStr(1)) THEN
- Halterror('Datei >>'+UpString(ParamStr(1))+'<< nicht gefunden'); ;
-
- IF Exist(ParamStr(2)) THEN { Abfrage wenn EXE schon da ... }
- BEGIN
- WriteLn('Achtung : >>'+UpString(ParamStr(2))+'<< existiert');
- Write('Überschreiben ? [J/N]');
- REPEAT
- c := UpCase(Chr(GetKey));
- UNTIL c IN ['J', 'N'];
- WriteLn(c);
- IF c = 'N' THEN
- FileError(4) { "Abbruch" }
- ELSE
- BEGIN { löschen der Datei .... }
- filemode := 2; { read/write }
- Assign(fprg, ParamStr(2));
- SetFAttr(fprg, archive); { sicher ist sicher }
- Erase(fprg)
- END
- END;
-
- New(puffer); { Puffer allokieren }
- IF puffer = NIL THEN { genug Speicher ? }
- FileError(3);
-
- New(txtPuffer); { TextPufer allokieren }
- IF txtPuffer = NIL THEN { genug Speicher ? }
- FileError(3);
-
- WriteLn('Übersetzung...');
-
- filemode := 0; { read-only ist hier OK }
- Assign(fprg, prgdir+browser);
- {$i-}
- Reset(fprg, 1);
- BlockRead(fprg, puffer^, MAGIC, geLesen);
- { T2BR.EXE in puffer^ lesen }
- IF geLesen <> MAGIC THEN
- FileError(1); { Schade ... }
- Close(fprg);
-
- filemode := 2; { hier read/write }
- Assign(ftxt, TmpFile); { neues File : T2BR.EXE aus puffer^ schreiben }
- Rewrite(ftxt, 1);
- BlockWrite(ftxt, puffer^, MAGIC, geSchrieben);
- IF geSchrieben <> MAGIC THEN
- FileError(2); { Schade }
-
- BlockWrite(ftxt, dummyStr, 4); { Zeilen-Zahl : longint (momentan noch dummy-wert) }
- BlockWrite(ftxt, dummyStr, 4); { taboffset : longint (momentan noch dummy-wert) }
-
- filemode := 0; { read-only }
- Assign(txt, ParamStr(1));
- SetTextBuf(txt, TxtPuffer^); { schnell, schnell... }
- Reset(txt); { nicht Reset(txt,1) wg.
- TP/BP var txt : TEXT }
- { jetzt keine IO-Prüfung, da s.o. if exist(..) }
-
- filemode := 2;
- Assign(long, TmpLong); { Verweis - Datei erstellen }
- Rewrite(long, 1);
- IF IOResult <> 0 THEN
- FileError(2); { war wohl nix }
-
- REPEAT
- Inc(Zeilen);
-
- txtpos := FilePos(ftxt);
- BlockWrite(long, txtpos, sizeof(longint)); { Verweis ablegen }
-
- ReadLn(txt, s); { String aus Text-Datei lesen }
- IF s[0] > #80 THEN { max. 80 Zeichen }
- s[0] := #80;
- BlockWrite(ftxt, s, Length(s)+1, geSchrieben);
- { und String in neuer EXE ablegen }
-
- IF geSchrieben <> Length(s)+1 THEN
- FileError(2); { Mist!! Platte zu klein oder so }
-
- IF Zeilen mod 10 = 0 then
- BEGIN
- GotoXY(1,WhereY); { wer schreibt der bleibt ...}
- ClrEol; { wir zeigen, was wir tun }
- Write(Zeilen, ' Zeilen bearbeitet') { sonst wird's langweilig }
- END
- UNTIL Eof(txt) ;
- Close(long);
-
- WriteLn(#13#10'Verweise anhängen'); { da fehlt noch was }
-
- Close(txt);
-
- TabOffset := FilePos(ftxt); { wo kommt denn jetzt die Tabelle hin ? }
-
- Reset(long, 1); { Verweis-Tabelle anhängen }
-
- REPEAT
- BlockRead(long, puffer^, MAGIC, geLesen);
-
- BlockWrite(ftxt, puffer^, geLesen, geSchrieben);
-
- UNTIL (geLesen = 0) OR (geLesen <> geSchrieben);
-
- Close(long);
- Erase(long); { Verweis-Datei wird nicht mehr benötigt }
-
- { wichtig, direkt nach MAGIC !!! }
- Seek(ftxt, MAGIC); { Zeilen, Offset Tabelle speichern }
-
- BlockWrite(ftxt, Zeilen, 4);
- BlockWrite(ftxt, TabOffset, 4);
-
- Close(ftxt); { schließen und umbenennen }
-
- Rename(ftxt, ParamStr(2)); { VORSICHT : }
- { hier kann evtl. rename nicht funktionieren,
- [ z.b. wenn von C: nach D: oder so]
- ->man/frau nehme dann so was wie copy xy }
-
- WriteLn('Fertig')
- END
- END; { Compile }
-
- (***************************************************************************)
- (****** M A I N ************************************************************)
- (***************************************************************************)
-
- BEGIN
- {$i-}
- directvideo := true; { fast, compatible crt... }
-
- HeapError := @HeapFunc; { wg. GetMem(...) }
-
- IF Lo(DosVersion) < 3 THEN { nur mit DOS ab Ver 3.xx }
- Halterror('DOS ab Ver 3.0 wird benötigt');
-
- IF MaxAvail < 2*SizeOf(PuffTyp) THEN { Speicher-Platz da ?? }
- FileError(3);
-
- FSplit(ParamStr(0),prgdir,prgname,prgext); { wo sind wir denn auf der Platte }
- IF prgdir[Length(prgdir)] <> '\' THEN
- addch(prgdir,'\');
-
- IF GetFileLength(prgdir+Browser) = MAGIC THEN { Browser-Länge auswerten }
-
- Compile { scheinbar OK --> gutgläubig übersetzen }
-
- ELSE
-
- fileerror(5); { Patch, Virus, oder wa ?? }
-
-
- { das MUß jetzt doch noch kommen... }
- WriteLn(#13#10'Idee+Code : P.Fischer-Haaser, D-74072 Heilbronn, Mozartstr. 10'+#13#10+
- 'Tel.:07131/81947, FAX:962843'#13#10)
- { sonst tut's net ....}
- {$ENDIF}
- END.
- (***************************************************************************)
-
-
-
-