home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* README.PAS v2.5 (16.5.94) *)
- (* Copyright (C) 1993, 1994 J. Braun & toolbox *)
- (* Compiler: Turbo Pascal/Borland Pascal 7.0 *)
- (* Target: DOS Real-Mode *)
- (* ====================================================== *)
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X+,P-,Q-,T-,Y-}
- {$M $3FF1,0,$FFFF}
- {$IFNDEF VER70} Fehler: Falsche Compiler-Version {$ENDIF}
- {$IFDEF Windows} Fehler: Falsches Target! {$ENDIF}
- {$IFDEF DPMI} Fehler: Falsches Target! {$ENDIF}
-
- PROGRAM ReadMe;
-
- USES
- Crt, Dos, Strings, ReadText;
-
- {$I LINES.INC}
-
- TYPE
- tScreen = ARRAY[0..24, 0..79] OF RECORD
- char: CHAR;
- attr: BYTE;
- END;
- tCharSet = SET OF CHAR; (* Erweiterung 11. 5. 94 /jb *)
-
- CONST (* Erweiterung 11. 5. 94 /jb *)
- FileChars : tCharset = ['A'..'Z', '0'..'9', '.', '\',
- ':', '_'];
- SearchChars : tCharset = [^U, ' '..#255]; (* 13.5.94 *)
- PortChars : tCharset = ['C', 'L'..'P', 'R', 'T',
- '1'..'4'];
-
- FirstPosition : INTEGER = 0; (* Anzahl der Spaces links *)
- (* vom Text. Bei Änderung *)
- (* wandert der angezeigte *)
- (* Text nach rechts bzw. *)
- (* nach links *)
- Incr = TRUE;
- Decr = FALSE;
-
- StatusColor : BYTE = $70; (* schwarz auf weiß *)
- ErrorColor : BYTE = $74; (* rot auf weiß *)
- PrintColor : BYTE = $47; (* weiß auf rot *)
- SearchColor : BYTE = $9F; (* weiß auf blau blinkend*)
- HelpColor : BYTE = $30; (* schwarz auf Cyan *)
- NormColor : BYTE = $1E; (* gelb auf blau *)
- PortName : STRING[4] = 'LPT1';
- StartCursor : WORD = $0607;
- MyCopyright : pChar = 'Erzeugt mit dem Readme-Builder'
- + ' der toolbox, (C) 1993 - 94 J.'
- + ' Braun & toolbox';
-
- VAR
- DosBoxColor, (* wird ausgelesen *)
- DefaultColor, (* Grundfarbe *)
- ActualColor : BYTE;
- ActualCursor : WORD ABSOLUTE $0040:$0060; (* ! *)
- MonoScreen : tScreen ABSOLUTE $B000:$0000; (* ! *)
- ColorScreen : tScreen ABSOLUTE $B800:$0000; (* ! *)
- DoBeep, Monochrom : BOOLEAN;
- LastSearch, LCStr : STRING;
- BIOSCursor : WORD;
- OldExitProc : Pointer;
- MaxLineLen : INTEGER; (* Änderung 16.5.94 / jb *)
-
- (* ====================================================== *)
- (* Funktionen und Prozeduren *)
- (* ====================================================== *)
-
- FUNCTION UpCase(ch: CHAR): CHAR; (* Intl. CP 437 *)
- BEGIN
- CASE ch OF
- 'A'..'Z': ;
- 'a'..'z': Dec(ch, 32);
- 'ä' : ch := 'Ä';
- 'ö' : ch := 'Ö';
- 'ü' : ch := 'Ü';
- 'ñ' : ch := 'Ñ';
- 'é' : ch := 'É';
- 'ó' : ch := 'O';
- 'ú' : ch := 'U';
- 'ç' : ch := 'Ç';
- 'æ' : ch := 'Æ';
- 'å' : ch := 'Å';
- END;
- UpCase := ch;
- END;
-
- PROCEDURE SetCursor(CONST CursorShape: WORD); ASSEMBLER;
- (* Setzen des Cursors mit Int 10h *)
- ASM
- MOV CX, CursorShape;
- MOV AH, 1
- INT 10h
- END;
-
- (* ==================================================== *)
-
- PROCEDURE HideCursor;
- (* Abschalten des Cursors über zu hohen Startwert *)
- BEGIN
- SetCursor($1500);
- END;
-
- (* ==================================================== *)
-
- PROCEDURE BlockCursor;
- (* Setzen eines Cursors von Zeile 0 bis Zeile 15 *)
- BEGIN
- SetCursor($0015);
- END;
-
- (* ==================================================== *)
-
- PROCEDURE NormCursor;
- (* normaler Strichcursor wie beim Programmstart *)
- BEGIN
- SetCursor(StartCursor);
- END;
-
- (* ==================================================== *)
-
- PROCEDURE MyExitProc; FAR;
- (* Neue Exit-Procedur, die den Cursor wieder auf den *)
- (* Startwert zurücksetzt und die Bildschirmfarbe *)
- (* restauriert *)
- BEGIN
- SetCursor(BIOSCursor);
- TextAttr := DefaultColor;
- ClrScr;
- ExitProc := OldExitProc;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE ErrorBeep(CONST Wait : Word);
- BEGIN (* geändert 13.5.94 *)
- Sound(900);
- Delay(50);
- NoSound;
- IF Wait > 0 THEN Delay(Wait);
- END;
-
- (* ==================================================== *)
-
- FUNCTION ReadString(CONST DefaultStr : STRING; (*Vorgabe*)
- CONST valid : tCharSet;(* erl. *)
- CONST EntryLength: BYTE; (*maximal*)
- VAR Return : CHAR (* Test *)
- ) : STRING;
- VAR
- ch : CHAR;
- Insert, Ready : BOOLEAN;
- CurPoint, x, y : WORD;
- counter : BYTE;
- Entry : STRING;
- i : INTEGER;
- OrgCursor : WORD;
- BEGIN
- OrgCursor := ActualCursor; (* Lokal !! *)
- x := WhereX;
- y := WhereY; (* Bugfix 16.5. / jb *)
- GotoXY(x, y); (* Bugfix 16.5. / jb *)
- FOR i := 1 TO EntryLength DO Write(#22);
- GotoXY(x, y);
- Entry := DefaultStr;
- IF Entry[0] > ^@ THEN BEGIN (* Bugfix 11. 5. 94 / jb *)
- Write(Entry);
- CurPoint := Length(Entry); (* Bugfix 11. 5. 94 / jb *)
- END ELSE
- CurPoint := 0;
- GotoXY(x + CurPoint, y);
- Insert := TRUE;
- Ready := FALSE; (* Bugfix 11. 5. 94 / jb *)
-
- REPEAT
- IF Insert THEN NormCursor ELSE BlockCursor;
- ch := UpCase(ReadKey); (* Bugfix 11. 5. 94 / jb *)
- IF ch IN valid THEN BEGIN(* variable Eingabezeichen *)
- (* 11.5.94 /jb *)
- IF Length(Entry) > Pred(EntryLength) THEN BEGIN
- IF DoBeep THEN
- ErrorBeep(0) (* Bugfix 13.5.94 *)
- END ELSE IF (Length(Entry) < EntryLength) OR
- NOT Insert THEN BEGIN
- IF CurPoint = Length(Entry) THEN BEGIN
- Entry := Entry + ch;
- GotoXY(x + CurPoint, y);
- Inc(CurPoint);
- Write(ch);
- END ELSE BEGIN
- IF Insert THEN BEGIN
- Entry := Entry + Chr(32);
- FOR counter := Pred(Length(Entry)) DOWNTO
- Succ(CurPoint) DO
- Entry[Succ(counter)] := Entry[counter];
- END;
- Inc(CurPoint);
- Entry[CurPoint] := ch;
- GotoXY(x, y);
- Write(Entry);
- GotoXY(x + CurPoint, y);
- END;
- END;
- END ELSE CASE ch OF
- Chr(10), Chr(13): (* LF, CR *)
- BEGIN
- Return := ch;
- Ready := TRUE;
- END;
- Chr(3), Chr(27): (* ^C, ESC *)
- BEGIN
- Return := ch;
- Entry := '';
- CurPoint := 0;
- Ready := TRUE;
- END;
- Chr(7):
- BEGIN
- IF CurPoint <> Length(Entry) THEN BEGIN
- FOR counter := Succ(CurPoint)
- TO Pred(Length(Entry)) DO
- Entry[counter] := Entry[Succ(counter)];
- Entry := Copy(Entry, 1, Pred(Length(Entry)));
- GotoXY(x, y);
- Write(Entry, Chr(22));
- GotoXY(x + CurPoint, y);
- END;
- END;
- Chr(8), Chr(127): (* BS, ^BS *)
- BEGIN
- IF CurPoint <> 0 THEN BEGIN
- FOR counter := CurPoint TO Pred(Length(Entry))DO
- Entry[counter] := Entry[Succ(counter)];
- Entry := Copy(Entry, 1, Pred(Length(Entry)));
- Dec(CurPoint);
- GotoXY(x, y);
- Write(Entry, Chr(22));
- GotoXY(x + CurPoint, y);
- END;
- END;
- Chr(0): (* erweiterte Taste *)
- BEGIN
- ch := ReadKey;
- CASE ch OF
- Chr(82): (* Ins *)
- BEGIN
- Insert := NOT Insert;
- IF Insert THEN NormCursor ELSE Blockcursor;
- END;
- Chr(71): (* Home *)
- BEGIN
- CurPoint := 0;
- GotoXY(x, y);
- Write(Entry);
- GotoXY(x + CurPoint, y);
- END;
- Chr(79): (* End *)
- BEGIN
- CurPoint := Length(Entry);
- GotoXY(x, y);
- Write(Entry);
- GotoXY(x + CurPoint, y);
- END;
- Chr(83): (* Del *)
- BEGIN
- IF CurPoint <> Length(Entry) THEN BEGIN
- FOR counter := Succ(CurPoint) TO
- Pred(Length(Entry)) DO
- Entry[counter] := Entry[counter + 1];
- Entry:=Copy(Entry, 1, Pred(Length(Entry)));
- GotoXY(x, y);
- Write(Entry, Chr(22));
- GotoXY(x + CurPoint, y);
- END;
- END;
- Chr(75): (* <- *)
- BEGIN
- IF CurPoint <> 0 THEN BEGIN
- Dec(CurPoint);
- GotoXY(x + CurPoint, y);
- END;
- END;
- Chr(77): (* -> *)
- BEGIN
- IF CurPoint <> Length(Entry) THEN BEGIN
- Inc(CurPoint);
- GotoXY(x + CurPoint, y);
- END;
- END;
- ELSE IF DoBeep THEN ErrorBeep(0);
- END;
- END ELSE IF DoBeep THEN ErrorBeep(0);
- END;
- UNTIL Ready;
- ReadString := Entry;
- SetCursor(OrgCursor); (* Lokal !! *)
- (* HideCursor; *)
- END;
-
- (* ==================================================== *)
-
- PROCEDURE OutTextXY(CONST Str : STRING;
- CONST Attr : BYTE;
- CONST Line, FirstPos : INTEGER);
-
- PROCEDURE ClearMonoLine;
- VAR
- x: INTEGER;
- BEGIN
- FOR x := 0 TO 79 DO BEGIN
- (* direkt in den BS-Speicher, kein DPMI möglich! *)
- MonoScreen[Pred(Line), x].attr := Attr;
- MonoScreen[Pred(Line), x].char := ' ';
- END;
- END;
-
- PROCEDURE ClearColorLine;
- VAR
- x: INTEGER;
- BEGIN
- FOR x := 0 TO 79 DO BEGIN
- (* direkt in den BS-Speicher, kein DPMI möglich *)
- ColorScreen[Pred(Line), x].attr := Attr;
- ColorScreen[Pred(Line), x].char := ' ';
- END;
- END;
-
- VAR
- x: INTEGER;
- BEGIN
- IF Monochrom THEN BEGIN
- ClearMonoLine;
- (* Display Text *)
- IF Length(Str) > 0 THEN
- FOR x := 1 TO Length(Str) DO
- IF x + FirstPos < 81 THEN
- MonoScreen[Pred(Line),
- Pred(x) + FirstPos].char := Str[x];
- END ELSE BEGIN
- ClearColorLine;
- (* Display Text *)
- IF Length(Str) > 0 THEN
- FOR x := 1 TO Length(Str) DO
- IF x + FirstPos < 81 THEN (* wg. Überlauf! *)
- ColorScreen[Pred(Line),
- Pred(x) + FirstPos].char := Str[x];
- END;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE DisplayFooter;
- CONST
- StatusLine = '['#24']['#25'] [Bild'#24']'
- + '[Bild'#25'] [Pos1][Ende] '
- + '[S]uche [W]eiter e[X]it [D]rucken'
- + ' [F1]Hilfe';
- BEGIN
- OutTextXY(StatusLine, StatusColor, 25, 1);
- END;
-
- (* ==================================================== *)
-
- PROCEDURE DisplayHeader(CONST s: STRING);
- VAR
- i : INTEGER;
- il : STRING;
- BEGIN
- il := StrPas(InfoLine); (* Änderung jb/11.5.94 --> *)
- IF s <> '' THEN BEGIN (* Infoline auch ein pChar *)
- WHILE Length(il) < 79 DO il := ' ' + il + ' ';
- il[0] := #80;
- FOR i := 1 TO 10 DO il[68 + i] := s[i];
- il[68] := '[';
- il[75 + MaxLineLen] := ']'; (* Änderung 16.5.94 / jb *)
- OutTextXY(il, StatusColor, 1, 1);
- END ELSE
- OutTextXY(il, StatusColor, 1, 40-Length(il) DIV 2);
- END;
-
- (* ==================================================== *)
-
- PROCEDURE ScrollThruText(VAR Line : INTEGER);
- VAR
- i, y : INTEGER;
- OutStr : STRING;
- GoTop : BOOLEAN;
-
- BEGIN
- GoTop := FALSE;
- REPEAT
- IF GoTop THEN BEGIN
- ClrScr;
- FOR i := 1 TO ScreenLines DO
- OutTextXY(StrPas(README_TEXT[i]), TextAttr,
- Succ(1), FirstPosition);
- GotoXY(1, ScreenLines);
- Line := 1;
- Delay(330);
- END ELSE BEGIN
- Window(1 + FirstPosition, 2, 80, Succ(ScreenLines));
- GotoXY(1, ScreenLines);
- END;
- IF Line < NumOfLines THEN y := Pred(Line)
- ELSE y := 1;
- FOR i := y + Succ(ScreenLines) TO NumOfLines DO BEGIN
- Str(i - Succ(ScreenLines), LCStr);
- WHILE Length(LCStr) < MaxLineLen DO LCStr := ' ' + LCStr;
- LCStr := 'Zeile ' + LCStr;
- DisplayHeader(LCStr);
- Line := i - ScreenLines;
- OutStr := StrPas(README_TEXT[Pred(i)]);
- IF (Length(OutStr) + FirstPosition) > 80 THEN BEGIN
- OutStr[0] := Chr(80); (* cut it ! *)
- Write(OutStr);
- END ELSE WriteLn(OutStr);
- OutTextXY(StrPas(README_TEXT[i]), TextAttr,
- Succ(ScreenLines), FirstPosition);
- IF KeyPressed THEN
- IF ReadKey = ' ' THEN BEGIN
- Inc(Line);
- Window(1, 1, 80, 25);
- Exit;
- END;
- Delay(333); (* 1/3tel Sekunde warten *)
- END;
- GoTop := TRUE;
- UNTIL FALSE;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE Help;
- VAR
- ch : CHAR;
-
- PROCEDURE WriteAt(CONST WhichLine : INTEGER;
- CONST MsgStr : STRING);
- BEGIN
- OutTextXY(MsgStr, HelpColor, WhichLine,
- 40 - Length(MsgStr) DIV 2);
- END;
-
- BEGIN
- WriteAt( 2,
- '┌──────────────────────────────────────────' +
- '──────────────────────┐');
- WriteAt( 3,
- '│ H I L F E Z U D E N T A S T E N ' +
- 'F U N K T I O N E N │');
- WriteAt( 4,
- '├──────────────────────────────────────────' +
- '──────────────────────┤');
- WriteAt( 5,
- '│ ' +
- ' │');
- WriteAt( 6,
- '│ ['#24' | '#25'] Scroll' +
- 'en nach oben und unten │');
- WriteAt( 7,
- '│ [Pos1] Zum Textanfang ' +
- 'springen │');
- WriteAt( 8,
- '│ [Ende] Zum Textende ' +
- 'springen │');
- WriteAt( 9,
- '│ [Bild'#25'] Eine Seite' +
- ' nach unten blättern │');
- WriteAt(10,
- '│ [Bild'#24'] Eine Seite' +
- ' nach oben blättern │');
- WriteAt(11,
- '│ ' +
- ' │');
- WriteAt(12,
- '│ [ESC], [ALT]-[X], [F10] Programm beend' +
- 'en │');
- WriteAt(13,
- '│ ' +
- ' │');
- WriteAt(14,
- '│ [D] Text ausdrucken' +
- ' │');
- WriteAt(15,
- '│ [F2] Text in ' +
- '(anzugebender) Datei sichern │');
- WriteAt(16,
- '│ [S] | [W] Text suchen / T' +
- 'ext nochmals suchen │');
- WriteAt(17,
- '│ [L] Text automatisc' +
- 'h nach unten scrollen │');
- WriteAt(18,
- '│ ' +
- ' │');
- WriteAt(19,
- '│ [>] Farbattribut um' +
- ' 1 erhöhen │');
- WriteAt(20,
- '│ [<] Farbattribut um' +
- ' 1 erniedrigen │');
- WriteAt(21,
- '│ [T] Fehlerton ' +
- '(falsche Taste) umschalten │');
- WriteAt(22,
- '│ [O] Dos aufruf' +
- 'en (Zurück mit »Exit« │');
- WriteAt(23,
- '│ ' +
- ' │');
- WriteAt(24,
- '└─────────────────────────────────────────' +
- '───────────────────────┘');
- OutTextXY('Hilfebildschirm - zurück mit beliebiger ' +
- 'Taste ...', StatusColor, 25, 1);
- ch := ReadKey;
- IF ch = #0 THEN ch := ReadKey;
- DisplayFooter;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE SaveToFile;
- VAR
- test : CHAR;
- i : INTEGER;
- FileName : STRING;
- Attr : BYTE;
- t : Text;
- BEGIN
- NormCursor;
- OutTextXY('Dateiname(+Pfad)+'#17#196#196#217'):',
- StatusColor, 25, 1);
- GotoXY(26, 25);
- Attr := TextAttr;
- TextAttr := StatusColor;
- FileName := ParamStr(0);
- Dec(FileName[0], 4);
- FileName := FileName + '.TXT';
- FileName := ReadString(FileName, FileChars, 54, test);
- (* max. 54 Zeichen! *)
- TextAttr := Attr;
- IF test = #27 THEN FileName := ''; (* ESC ! *)
- IF FileName = '' THEN BEGIN
- IF DoBeep THEN ErrorBeep(0);
- END ELSE BEGIN
- FOR i := 1 TO Length(FileName) DO
- FileName[i] := UpCase(FileName[i]);
- OutTextXY('Speichere Text in ' + FileName,
- StatusColor, 25, 1);
- Delay(500);
- Assign(t, FileName);
- {$I-}
- Rewrite(t);
- IF IOResult <> 0 THEN BEGIN
- OutTextXY('Fehler beim Speichern von »' +
- FileName + '«!', ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1000);
- END ELSE BEGIN
- (* Den Overhead in »ScreenLines« nicht sichern! *)
- FOR i := 1 TO NumOfLines - ScreenLines DO
- WriteLn(t, README_TEXT[i]);
- Close(t);
- END;
- END;
- DisplayFooter;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE PrintText;
- VAR (* Erweiterung mit bel. Port 11.5.94/'jb *)
- i : INTEGER;
- ch : CHAR;
- lst : Text;
- test : CHAR;
- Attr : WORD;
- BEGIN
- OutTextXY('Druckerport: ', StatusColor, 25, 1);
- GotoXY(15, 25);
- Attr := TextAttr;
- TextAttr := StatusColor;
- PortName := ReadString(PortName, PortChars, 4, test);
- IF test = #13 THEN
- IF PortName = '' THEN
- PortName := 'PRN';
- TextAttr := Attr;
- IF test = #27 THEN PortName := '';
- IF PortName = '' THEN BEGIN
- DisplayFooter;
- Exit;
- END;
- Assign(Lst, PortName);
- {$I-}
- Rewrite(Lst);
- {$I+}
- IF IoResult <> 0 THEN BEGIN
- OutTextXY('Fehler bei Druck auf ' + PortName + '!',
- ErrorColor, 25, 1);
- Delay(1000);
- DisplayFooter;
- Exit;
- END;
- OutTextXY('Datei wird auf '+ PortName + ' gedruckt,' +
- 'Abbruch mit <ESC> ' +
- 'sonst bitte warten ...', PrintColor, 25, 1);
- Delay(1000);
- FOR i := 1 TO NumOfLines - ScreenLines DO BEGIN
- (* den Overhead in »Screenlines« nicht drucken! *)
- IF KeyPressed THEN BEGIN
- ch := ReadKey;
- IF ch = #27 THEN BEGIN
- OutTextXY('Ausdruck wird abgebrochen ...',
- ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(500);
- Close(Lst);
- DisplayFooter;
- Exit;
- END;
- END;
- WriteLn(Lst, StrPas(README_TEXT[i]));
- END;
- Write(Lst, ^L); (* Seitenvorschub zum Schluß *)
- Close(Lst);
- DisplayFooter;
- END;
-
- (* ==================================================== *)
-
- PROCEDURE ChangeColor(CONST b : BOOLEAN);
- VAR
- ColStr : STRING[3];
- x, y : BYTE;
- BEGIN
- IF b THEN BEGIN (* + *)
- TextAttr := Succ(TextAttr);
- IF ((TextAttr SHR 4) AND TextAttr = 1)
- OR (TextAttr = 0) THEN
- TextAttr := Succ(TextAttr);
- END ELSE BEGIN (* - *)
- TextAttr := Pred(TextAttr);
- IF ((TextAttr SHR 4) AND TextAttr = 1) OR
- (TextAttr = 0) THEN
- TextAttr := Pred(TextAttr);
- END;
- Str(TextAttr: 3, ColStr);
- IF Monochrom THEN BEGIN
- MonoScreen[0, 68].char := ' ';
- MonoScreen[0, 69].char := ' ';
- MonoScreen[0, 70].char := ' ';
- MonoScreen[0, 71].char := ' ';
- MonoScreen[0, 72].char := ' ';
- MonoScreen[0, 73].char := ' ';
- MonoScreen[0, 74].char := ' ';
- MonoScreen[0, 75].char := ' ';
- MonoScreen[0, 76].char := ColStr[1];
- MonoScreen[0, 77].char := ColStr[2];
- MonoScreen[0, 78].char := ColStr[3];
- MonoScreen[0, 79].char := ' ';
- FOR y := 1 TO 23 DO
- FOR x := 0 TO 79 DO
- MonoScreen[y, x].attr := TextAttr;
- END ELSE BEGIN
- ColorScreen[0, 68].char := ' ';
- ColorScreen[0, 69].char := ' ';
- ColorScreen[0, 70].char := ' ';
- ColorScreen[0, 71].char := ' ';
- ColorScreen[0, 72].char := ' ';
- ColorScreen[0, 73].char := ' ';
- ColorScreen[0, 74].char := ' ';
- ColorScreen[0, 75].char := ' ';
- ColorScreen[0, 76].char := ColStr[1];
- ColorScreen[0, 77].char := ColStr[2];
- ColorScreen[0, 78].char := ColStr[3];
- ColorScreen[0, 79].char := ' ';
- FOR y := 1 TO 23 DO
- FOR x := 0 TO 79 DO
- ColorScreen[y, x].attr := TextAttr;
- END;
- Delay(100);
- END;
-
- (* ==================================================== *)
-
- FUNCTION SearchForString(CONST Last : STRING;
- VAR Line : INTEGER;
- CONST again: BOOLEAN): BYTE;
- VAR
- ExitChar : CHAR;
- Attr : BYTE;
- i : INTEGER;
- TextStr,
- SearchStr : pChar;
- SearchString : STRING;
-
- FUNCTION StrUpper(CONST s: pChar; VAR t: pChar): pChar;
- (* ... wegen Schlamperei von Borland in der Laufzeit- *)
- (* bibliothek: Die Funktion wandelt den Referenzpara- *)
- (* meter statt des Funktionsergebnisses!!! *)
- BEGIN
- StrCopy(t, s);
- StrCopy(t, Strings.StrUpper(t));
- StrUpper := t;
- END;
-
- BEGIN
- Attr := TextAttr;
- TextAttr := StatusColor;
- OutTextXY('Text suchen: ', TextAttr, 25, 1);
- GotoXY(15, 25);
- IF NOT again THEN BEGIN
- SearchString := ReadString(Last,
- SearchChars, 65,
- ExitChar);
- LastSearch := SearchString;
- END ELSE SearchString := LastSearch;
- TextAttr := Attr;
- IF ExitChar = #27 THEN BEGIN
- SearchForString := 2;
- Exit;
- END;
- IF Length(SearchString) > 0 THEN BEGIN
- GetMem(SearchStr, $100);
- GetMem(TextStr, $100);
- StrPCopy(SearchStr, SearchString);
- StrUpper(SearchStr, SearchStr);
- IF Line >= NumOfLines - Pred(ScreenLines) THEN
- Line := 1;
- FOR i := Succ(Line) TO NumOfLines DO
- IF StrLen(README_TEXT[i]) > 0 THEN BEGIN
- (*nicht die aktuelle erste sondern nächste Zeile am BS*)
- StrUpper(README_TEXT[i], TextStr);
- IF StrPos(TextStr, SearchStr) <> NIL THEN BEGIN
- Line := i;
- SearchForString := 1;
- FreeMem(SearchStr, $100);
- FreeMem(TextStr, $100);
- Exit;
- END;
- END;
- Line := NumOfLines;
- END ELSE BEGIN
- SearchForString := 2;
- Exit;
- END;
- Line := NumOfLines - ScreenLines;
- SearchForString := 0;
- END;
-
- (* ==================================================== *)
-
- FUNCTION DosShell(CONST Line : INTEGER) : INTEGER;
- VAR
- Attr : BYTE;
- i, y : INTEGER;
- name : STRING;
- BEGIN
- Attr := TextAttr;
- TextAttr := DosBoxColor;
- name := ParamStr(0); (* Programmname *)
- IF Pos('\', name) > 0 THEN (* Pfad abtrennen *)
- WHILE Pos('\', name) > 0 DO Delete(name, 1, 1);
- ClrScr;
- Dec(Name[0], 4); (* Endung abtrennen *)
- WriteLn(^J'Zurück zu ' + name + ' mit Exit'
- + #17#196#196#217#10);
- BlockCursor;
- SwapVectors;
- Exec(GetEnv('COMSPEC'), '');
- DosShell := DosError;
- SwapVectors;
- HideCursor;
- TextAttr := Attr;
- y := 1;
- FOR i := Line TO Line + Pred(ScreenLines) DO BEGIN
- Inc(y);
- OutTextXY(StrPas(README_TEXT[i]), TextAttr, y,
- FirstPosition);
- END;
- DisplayHeader('');
- END;
-
- (* ====================================================== *)
-
- VAR
- Key, ch : CHAR;
- LineCounter, y, OutPutLine : INTEGER;
- Found : BYTE;
- LineScroll, Done : BOOLEAN;
-
- BEGIN
- IF IOResult <> 0 THEN ;
-
- IF NumOfLines < 100 THEN (* Änderung 16.5.94 / jb *)
- MaxLineLen := 2
- ELSE IF NumOfLines < 1000 THEN
- MaxLineLen := 3
- ELSE IF NumOfLines < 10000 THEN
- MaxLineLen := 4
- ELSE
- MaxLineLen := 5;
-
- BIOSCursor := ActualCursor; (* global ! *)
- Monochrom := Byte(Ptr(Seg0040, $0049)^) = 7; (* HGC *)
- CheckBreak := FALSE; (* kein Abbruch *)
- DirectVideo := TRUE; (* schneller *)
- DoBeep := TRUE; (* Falls Ton unerwünscht := FALSE *)
- DefaultColor := TextAttr; (* Farben merken *)
- OldExitProc := ExitProc;
- ExitProc := @MyExitProc;
- HideCursor;
- ClrScr;
-
- IF Monochrom OR (Byte(Ptr(Seg0040, $49)^) = 2) THEN BEGIN
- StatusColor := $70; (* invertiert *)
- ErrorColor := $1F; (* weiß auf grau *)
- PrintColor := $10; (* invertiert *)
- SearchColor := $F0; (* invertiert + blinkend *)
- HelpColor := $0F; (* hell *)
- NormColor := $07; (* normal *)
- END; (* $01 = unterstrichen *)
-
- DosBoxColor := TextAttr;
- DisplayHeader('');
- DisplayFooter;
- TextAttr := NormColor;
- FOR y := 1 TO ScreenLines DO
- OutTextXY(StrPas(README_TEXT[y]), TextAttr, Succ(y),
- FirstPosition);
- LineCounter := 1;
- LastSearch := '';
-
- REPEAT
- Str(LineCounter, LCStr);
- WHILE Length(LCStr) < MaxLineLen DO LCStr := ' ' + LCStr;
- LCStr := 'Zeile ' + LCStr;
- DisplayHeader(LCStr);
- LineScroll := FALSE;
- Key := ReadKey;
- CASE UpCase(Key) OF
- 'T' : DoBeep := NOT DoBeep; (* Umschalter *)
- 'O' : BEGIN
- IF DosShell(LineCounter) <> 0 THEN BEGIN
- OutTextXY('Shell konnte nicht ausgeführt' +
- ' werden!', ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1500);
- END;
- DisplayFooter;
- END;
- 'W' : BEGIN (* immer weiter suchen ... *)
- IF LastSearch = '' THEN
- Found := SearchForString('', LineCounter, FALSE)
- ELSE
- Found := SearchForString(LastSearch, LineCounter,
- TRUE);
- ActualColor := TextAttr;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- OutPutLine := 1;
- IF Found = 1 THEN BEGIN
- OutTextXY('Textstelle gefunden!',
- StatusColor, 25, 1);
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := SearchColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := SearchColor;
- Delay(1000);
- END ELSE IF Found = 0 THEN BEGIN
- OutTextXY('Textstelle nicht gefunden!',
- ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1000);
- END ELSE BEGIN
- OutTextXY('Suche wurde abgebrochen',
- ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1000);
- END;
- TextAttr := ActualColor;
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := ActualColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := ActualColor;
- DisplayFooter;
- END;
- 'S' : BEGIN (* Immer neuen String suchen ... *)
- Found := SearchForString(LastSearch, LineCounter, FALSE);
- ActualColor := TextAttr;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- OutPutLine := 1;
- IF Found = 1 THEN BEGIN
- OutTextXY('Textstelle gefunden!',
- StatusColor, 25, 1);
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := SearchColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := SearchColor;
- Delay(1000);
- END ELSE IF Found = 0 THEN BEGIN
- OutTextXY('Textstelle nicht gefunden!',
- ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1000);
- END ELSE BEGIN
- OutTextXY('Suche wurde abgebrochen',
- ErrorColor, 25, 1);
- IF DoBeep THEN ErrorBeep(1000);
- END;
- TextAttr := ActualColor;
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := ActualColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := ActualColor;
- DisplayFooter;
- END;
- 'D': PrintText;
- 'L': BEGIN
- ActualColor := TextAttr;
- OutTextXY('Text wird endlos ge' +
- 'scrollt, Ende mit [Leertaste] ...',
- StatusColor, 25, 1);
- ScrollThruText(LineCounter);
- TextAttr := ActualColor;
- DisplayFooter;
- LineScroll := TRUE;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- END;
- '>': ChangeColor(Incr);
- '<': ChangeColor(Decr);
- 'Q', 'X': Key := #27; (* Ende *)
- #27: ; (* einfachste Möglichkeit *)
- (* um Beep auszuschließen *)
- ELSE IF Key <> #0 THEN IF DoBeep THEN ErrorBeep(0);
- END;
-
- IF Key = #0 THEN BEGIN
- Done := TRUE;
- IF NOT LineScroll THEN ch := ReadKey;
- CASE ch OF
- ';': Help; (* F1 *)
- '<': SaveToFile; (* F2 *)
- { 'M': BEGIN (* -> *)
- Inc(FirstPosition);
- END;
- 'K': BEGIN (* <- *)
- Dec(FirstPosition);
- END;}
- '-', 'D': Key := #27; (* Ende *)
- 'H': IF LineCounter > 1 THEN Dec(LineCounter)
- ELSE Done := FALSE;
- 'P': IF LineCounter<NumOfLines-Pred(ScreenLines)THEN
- Inc(LineCounter)
- ELSE
- Done := FALSE;
- 'G': IF LineCounter > 1 THEN LineCounter := 1
- ELSE Done := FALSE;
- 'O': IF LineCounter <
- NumOfLines - Pred(ScreenLines) THEN
- LineCounter := NumOfLines - Pred(ScreenLines)
- ELSE
- Done := FALSE;
- 'Q': IF LineCounter < (NumOfLines -
- Pred(ScreenLines) SHL 1) THEN
- Inc(LineCounter, ScreenLines)
- ELSE IF LineCounter = (NumOfLines -
- Pred(ScreenLines) SHL 1) THEN
- Done := FALSE
- ELSE
- LineCounter := NumOfLines - Pred(ScreenLines);
- 'I': IF LineCounter > (ScreenLines SHL 1) THEN
- Dec(LineCounter, ScreenLines)
- ELSE IF LineCounter = 1 THEN
- Done := FALSE
- ELSE
- LineCounter := 1;
- ELSE IF DoBeep THEN ErrorBeep(0); Done := FALSE;
- END;
- IF Done THEN BEGIN
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- END;
- END;
- UNTIL Key = #27;
- (* Restaurierungen werden in der Exitprozedur vorge- *)
- (* nommen! *)
- END.
-
- (* ====================================================== *)
- (* Ende von README.PAS *)
-