home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TURBOIN.INC *)
- (* Eingabe-Routinen für Turbo-Pascal 3.0 *)
- (* *)
- (* (C) 1988 by Hans Jürgen Rauscher & PASCAL Int. *)
- (* ------------------------------------------------------ *)
-
- (* Typ für Paramter der Eingabe-Routinen *)
- TYPE tIOParameter = RECORD
- mark : BOOLEAN;
- line : CHAR;
- int : RECORD
- sign : BOOLEAN;
- exp : BOOLEAN;
- END;
- real : RECORD
- sign : BOOLEAN;
- exp : BOOLEAN;
- END;
- error : BOOLEAN;
- errnr : INTEGER;
- END;
-
- (* Typ für Integerzahlen-Konvertierungen *)
- StrInt = STRING[8];
-
- StrReal = STRING[40]; (* Typ für Realzahlen *)
-
- StrString = STRING[255]; (* Typ für Stringübergabe*)
-
- VAR IO : tIOParameter;
- (* enthält Parameter für Eingaberoutinen *)
-
- PROCEDURE Init; (* initialisiert IO mit Default-Werten *)
-
- BEGIN
- With IO DO BEGIN
- mark := TRUE; line := '_';
- With int DO BEGIN
- sign := TRUE; exp := TRUE;
- END;
- With real DO BEGIN
- sign := TRUE; exp := TRUE;
- END;
- error := FALSE; errnr := 0;
- END;
- END;
-
- PROCEDURE ReadString(VAR Str: StrString; Len: INTEGER);
- (* liest einen String Str mit der Länge Len ein *)
-
- CONST backspace = #8;
- return = #13;
-
- VAR ch : CHAR;
- vstring : StrString;
- counter : INTEGER;
- chcounter : INTEGER;
-
- BEGIN
- vstring := '';
- counter := 0;
- IF Len > 255 THEN Len := 255;
- IF IO.mark = TRUE THEN BEGIN
- FOR chcounter := 1 TO Len DO Write(IO.line);
- FOR chcounter := 1 TO Len DO Write(backspace);
- END;
- REPEAT
- Read(Kbd, ch);
- IF ch IN [#32..#255, backspace] THEN BEGIN
- IF counter IN [0..Len + 1] THEN BEGIN
- CASE ch OF
- #32..#255: IF counter IN [0..Len - 1] THEN BEGIN
- Write(ch);
- vstring := vstring + ch;
- counter := Succ(counter);
- END;
- backspace: IF counter IN [1..Len + 1] THEN BEGIN
- Write(backspace);
- IF IO.mark = TRUE THEN Write(IO.line)
- ELSE Write(' ');
- Write(backspace);
- Delete(vstring, counter, 1);
- counter := Pred(counter);
- END;
- END;
- END;
- END;
- UNTIL ch = return;
- Str := vstring; IO.error := FALSE; IO.errnr := 0;
- END;
-
- PROCEDURE ReadInt(VAR Int:INTEGER; Len:INTEGER);
- (* liest eine Integerzahl Int mit der Länge Len ein *)
-
- CONST backspace = #8;
- return = #13;
-
- VAR ch : CHAR; sign : BOOLEAN;
- exponent : BOOLEAN; vstring : StrInt;
- counter : INTEGER; error : INTEGER;
- value : INTEGER; chcounter : INTEGER;
- epos : INTEGER; expvalue : INTEGER;
-
- BEGIN
- sign := FALSE; exponent := FALSE;
- vstring := ''; counter := 0;
- IF Len > 8 THEN Len := 8;
- IF IO.mark = TRUE THEN BEGIN
- FOR chcounter := 1 TO Len DO Write(IO.line);
- FOR chcounter := 1 TO Len DO Write(backspace);
- END;
- REPEAT
- Read(Kbd, ch);
- IF ch IN ['0'..'9', '+', '-', 'e', 'E',
- backspace] THEN BEGIN
- IF counter IN [0..Len + 1] THEN BEGIN
- CASE ch OF
- '0'..'9': IF counter IN [0..Len - 1] THEN BEGIN
- Write(ch);
- vstring := vstring + ch;
- counter := Succ(counter);
- END;
- '+','-' : IF counter = 0 THEN BEGIN
- IF (IO.int.sign = TRUE) AND
- (sign = FALSE) THEN BEGIN
- Write(ch);
- vstring := ch;
- sign := TRUE;
- counter := Succ(counter);
- END;
- END;
- 'e', 'E': IF counter IN [1..Len - 1] THEN BEGIN
- IF (IO.int.exp = TRUE) AND
- (exponent = FALSE) AND
- ((vstring[1] IN ['0'..'9']) OR
- ((vstring[1] IN ['+', '-']) AND
- (counter > 1))) THEN BEGIN
- write(ch);
- vstring := vstring + ch;
- exponent := TRUE;
- counter := Succ(counter);
- END;
- END;
- backspace : IF counter IN [1..Len + 1] THEN BEGIN
- IF vstring[counter] IN ['+', '-'] THEN
- sign := FALSE;
- Write(backspace);
- IF IO.mark = TRUE THEN
- Write(IO.line)
- ELSE Write(' ');
- Write(backspace);
- Delete(vstring, counter, 1);
- counter := Pred(counter);
- END;
- END;
- END;
- END;
- UNTIL ch = return;
-
- IF vstring = '' THEN vstring := '0';
- IF vstring[1] = '+' THEN Delete(vstring, 1, 1);
- IF (Pos('e', vstring) > 0) OR
- (Pos('E', vstring) > 0) THEN BEGIN
- epos := (Pos('e', vstring) OR Pos('E', vstring));
- Val(Copy(vstring, epos + 1, Length(vstring)),
- expvalue, error);
- Delete(vstring, epos, Length(vstring) - epos + 1);
- FOR chcounter := 1 TO expvalue DO
- vstring := vstring + '0';
- END;
- Val(vstring, value, error);
- IF error = 0 THEN Int := value ELSE Int := 0;
- IO.error := (error > 0);
- IO.errnr := error;
- END;
-
- PROCEDURE ReadReal(VAR Reel:REAL; Len:INTEGER);
- (* liest eine Realzahl Reel mit der Länge Len ein *)
-
- CONST backspace = #8;
- return = #13;
-
- VAR ch : CHAR; sign : BOOLEAN;
- point : BOOLEAN; exponent : BOOLEAN;
- expsign : BOOLEAN; vstring : StrReal;
- counter : INTEGER; error : INTEGER;
- value : REAL; chcounter : INTEGER;
-
- BEGIN
- sign := FALSE; point := FALSE;
- exponent := FALSE; expsign := FALSE;
- vstring := ''; counter := 0;
- IF Len > 40 THEN Len := 40;
- IF IO.mark = TRUE THEN BEGIN
- FOR chcounter := 1 TO Len DO Write(IO.line);
- FOR chcounter := 1 TO Len DO Write(backspace);
- END;
- REPEAT
- Read(Kbd, ch);
- IF ch IN ['0'..'9', '+', '-',
- '.', 'e', 'E', backspace] THEN BEGIN
- IF counter IN [0..Len + 1] THEN BEGIN
- CASE ch OF
- '0'..'9': IF counter IN [0..Len - 1] THEN BEGIN
- Write(ch);
- vstring := vstring + ch;
- counter := Succ(counter);
- END;
- '+', '-' : IF counter = 0 THEN BEGIN
- IF (IO.real.sign = TRUE) AND
- (sign = FALSE) THEN BEGIN
- Write(ch);
- vstring := ch;
- sign := TRUE;
- counter := Succ(counter);
- END; END
- ELSE BEGIN
- IF (IO.real.exp = TRUE) AND
- (expsign = FALSE) AND
- (exponent = TRUE) AND
- (vstring[counter] IN ['e', 'E'])
- THEN BEGIN
- Write(ch);
- vstring := vstring + ch;
- expsign := TRUE;
- counter := Succ(counter);
- END;
- END;
- '.' : IF counter IN [1..Len - 1] THEN BEGIN
- IF vstring[counter] IN ['0'..'9']
- THEN BEGIN
- IF point = FALSE THEN BEGIN
- write(ch);
- vstring := vstring + ch;
- point := TRUE;
- counter := Succ(counter);
- END;
- END;
- END;
- 'e', 'E' : IF counter IN [1..Len-1] THEN BEGIN
- IF (IO.real.exp = TRUE) AND
- (exponent = FALSE) AND
- ((vstring[1] IN ['0'..'9'])
- OR ((vstring[1] IN
- ['+', '-', '.']) AND
- (counter >1))) THEN BEGIN
- write(ch);
- vstring := vstring + ch;
- exponent := TRUE;
- counter := Succ(counter);
- END;
- END;
- backspace : IF counter IN
- [1..Len + 1] THEN BEGIN
- CASE vstring[counter] OF
- '+', '-' : IF counter = 1 THEN
- sign := FALSE
- ELSE
- expsign := FALSE;
- '.' : point := FALSE;
- 'e', 'E' : exponent := FALSE;
- END;
- Write(backspace);
- IF IO.mark = TRUE THEN
- Write(IO.line)
- ELSE Write(' ');
- Write(backspace);
- Delete(vstring, counter, 1);
- counter := Pred(counter);
- END;
- END;
- END;
- END;
- UNTIL ch = return;
-
- IF vstring = '' THEN vstring := '0';
- IF vstring[1] = '+' THEN Delete(vstring, 1, 1);
- Val(vstring, value, error);
- IF error = 0 THEN Reel := value ELSE Reel := 0;
- IO.error := (error > 0);
- IO.errnr := error;
- END;
- (* ------------------------------------------------------ *)
- (* Ende von TURBOINC.INC *)