home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 08_09 / turboin.inc < prev    next >
Encoding:
Text File  |  1988-05-17  |  10.4 KB  |  285 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   TURBOIN.INC                          *)
  3. (*       Eingabe-Routinen für Turbo-Pascal 3.0            *)
  4. (*                                                        *)
  5. (*   (C) 1988 by Hans Jürgen Rauscher & PASCAL Int.       *)
  6. (* ------------------------------------------------------ *)
  7.  
  8.               (*  Typ für Paramter der Eingabe-Routinen   *)
  9. TYPE tIOParameter = RECORD
  10.                       mark  : BOOLEAN;
  11.                       line  : CHAR;
  12.                       int   : RECORD
  13.                                 sign : BOOLEAN;
  14.                                 exp  : BOOLEAN;
  15.                               END;
  16.                       real  : RECORD
  17.                                 sign : BOOLEAN;
  18.                                 exp  : BOOLEAN;
  19.                               END;
  20.                       error : BOOLEAN;
  21.                       errnr : INTEGER;
  22.                     END;
  23.  
  24.                (* Typ für Integerzahlen-Konvertierungen   *)
  25.      StrInt       = STRING[8];
  26.  
  27.      StrReal      = STRING[40];  (* Typ für Realzahlen    *)
  28.  
  29.      StrString    = STRING[255]; (* Typ für Stringübergabe*)
  30.  
  31. VAR IO : tIOParameter;
  32.               (* enthält Parameter für Eingaberoutinen    *)
  33.  
  34. PROCEDURE Init;    (* initialisiert IO mit Default-Werten *)
  35.  
  36. BEGIN
  37.   With IO DO BEGIN
  38.     mark     := TRUE;  line     := '_';
  39.     With int DO BEGIN
  40.       sign := TRUE;  exp  := TRUE;
  41.     END;
  42.     With real DO BEGIN
  43.       sign := TRUE;  exp  := TRUE;
  44.     END;
  45.     error    := FALSE; errnr    := 0;
  46.   END;
  47. END;
  48.  
  49. PROCEDURE ReadString(VAR Str: StrString; Len: INTEGER);
  50.           (* liest einen String Str mit der Länge Len ein *)
  51.  
  52. CONST backspace = #8;
  53.       return    = #13;
  54.  
  55. VAR ch        : CHAR;
  56.     vstring   : StrString;
  57.     counter   : INTEGER;
  58.     chcounter : INTEGER;
  59.  
  60. BEGIN
  61.   vstring := '';
  62.   counter := 0;
  63.   IF Len > 255 THEN Len := 255;
  64.   IF IO.mark = TRUE THEN BEGIN
  65.     FOR chcounter := 1 TO Len DO Write(IO.line);
  66.     FOR chcounter := 1 TO Len DO Write(backspace);
  67.   END;
  68.   REPEAT
  69.     Read(Kbd, ch);
  70.     IF ch IN [#32..#255, backspace] THEN BEGIN
  71.       IF counter IN [0..Len + 1] THEN BEGIN
  72.         CASE ch OF
  73.           #32..#255: IF counter IN [0..Len - 1] THEN BEGIN
  74.                        Write(ch);
  75.                        vstring := vstring + ch;
  76.                        counter := Succ(counter);
  77.                      END;
  78.           backspace: IF counter IN [1..Len + 1] THEN BEGIN
  79.                        Write(backspace);
  80.                        IF IO.mark = TRUE THEN Write(IO.line)
  81.                        ELSE Write(' ');
  82.                        Write(backspace);
  83.                        Delete(vstring, counter, 1);
  84.                        counter := Pred(counter);
  85.                      END;
  86.         END;
  87.       END;
  88.     END;
  89.   UNTIL ch = return;
  90.   Str := vstring;  IO.error := FALSE;  IO.errnr := 0;
  91. END;
  92.  
  93. PROCEDURE ReadInt(VAR Int:INTEGER; Len:INTEGER);
  94.       (* liest eine Integerzahl Int mit der Länge Len ein *)
  95.  
  96. CONST backspace = #8;
  97.       return    = #13;
  98.  
  99. VAR ch        : CHAR;       sign      : BOOLEAN;
  100.     exponent  : BOOLEAN;    vstring   : StrInt;
  101.     counter   : INTEGER;    error     : INTEGER;
  102.     value     : INTEGER;    chcounter : INTEGER;
  103.     epos      : INTEGER;    expvalue  : INTEGER;
  104.  
  105. BEGIN
  106.   sign     := FALSE;  exponent := FALSE;
  107.   vstring  := '';     counter  := 0;
  108.   IF Len > 8 THEN Len := 8;
  109.   IF IO.mark = TRUE THEN BEGIN
  110.     FOR chcounter := 1 TO Len DO Write(IO.line);
  111.     FOR chcounter := 1 TO Len DO Write(backspace);
  112.   END;
  113.   REPEAT
  114.     Read(Kbd, ch);
  115.     IF ch IN ['0'..'9', '+', '-', 'e', 'E',
  116.                                        backspace] THEN BEGIN
  117.       IF counter IN [0..Len + 1] THEN BEGIN
  118.         CASE ch OF
  119.           '0'..'9': IF counter IN [0..Len - 1] THEN BEGIN
  120.                       Write(ch);
  121.                       vstring := vstring + ch;
  122.                       counter := Succ(counter);
  123.                     END;
  124.           '+','-' : IF counter = 0 THEN BEGIN
  125.                       IF (IO.int.sign = TRUE) AND
  126.                                    (sign = FALSE) THEN BEGIN
  127.                         Write(ch);
  128.                         vstring := ch;
  129.                         sign := TRUE;
  130.                         counter := Succ(counter);
  131.                       END;
  132.                     END;
  133.           'e', 'E': IF counter IN [1..Len - 1] THEN BEGIN
  134.                       IF (IO.int.exp = TRUE) AND
  135.                          (exponent = FALSE) AND
  136.                          ((vstring[1] IN ['0'..'9']) OR
  137.                          ((vstring[1] IN ['+', '-']) AND
  138.                          (counter > 1))) THEN BEGIN
  139.                         write(ch);
  140.                         vstring := vstring + ch;
  141.                         exponent := TRUE;
  142.                         counter := Succ(counter);
  143.                       END;
  144.                     END;
  145.         backspace : IF counter IN [1..Len + 1] THEN BEGIN
  146.                       IF vstring[counter] IN ['+', '-'] THEN
  147.                         sign := FALSE;
  148.                         Write(backspace);
  149.                         IF IO.mark = TRUE THEN
  150.                           Write(IO.line)
  151.                         ELSE Write(' ');
  152.                         Write(backspace);
  153.                         Delete(vstring, counter, 1);
  154.                         counter := Pred(counter);
  155.                       END;
  156.         END;
  157.       END;
  158.     END;
  159.   UNTIL ch = return;
  160.  
  161.   IF vstring = '' THEN vstring := '0';
  162.   IF vstring[1] = '+' THEN Delete(vstring, 1, 1);
  163.   IF (Pos('e', vstring) > 0) OR
  164.      (Pos('E', vstring) > 0) THEN BEGIN
  165.     epos := (Pos('e', vstring) OR Pos('E', vstring));
  166.     Val(Copy(vstring, epos + 1, Length(vstring)),
  167.              expvalue, error);
  168.     Delete(vstring, epos, Length(vstring) - epos + 1);
  169.     FOR chcounter := 1 TO expvalue DO
  170.       vstring := vstring + '0';
  171.   END;
  172.   Val(vstring, value, error);
  173.   IF error = 0 THEN Int := value ELSE Int := 0;
  174.   IO.error := (error > 0);
  175.   IO.errnr := error;
  176. END;
  177.  
  178. PROCEDURE ReadReal(VAR Reel:REAL; Len:INTEGER);
  179.         (* liest eine Realzahl Reel mit der Länge Len ein *)
  180.  
  181. CONST backspace = #8;
  182.       return    = #13;
  183.  
  184. VAR ch        : CHAR;       sign      : BOOLEAN;
  185.     point     : BOOLEAN;    exponent  : BOOLEAN;
  186.     expsign   : BOOLEAN;    vstring   : StrReal;
  187.     counter   : INTEGER;    error     : INTEGER;
  188.     value     : REAL;       chcounter : INTEGER;
  189.  
  190. BEGIN
  191.   sign      := FALSE;  point     := FALSE;
  192.   exponent  := FALSE;  expsign   := FALSE;
  193.   vstring   := '';     counter   := 0;
  194.   IF Len > 40 THEN Len := 40;
  195.   IF IO.mark = TRUE THEN BEGIN
  196.     FOR chcounter := 1 TO Len DO Write(IO.line);
  197.     FOR chcounter := 1 TO Len DO Write(backspace);
  198.   END;
  199.   REPEAT
  200.     Read(Kbd, ch);
  201.     IF ch IN ['0'..'9', '+', '-',
  202.               '.', 'e', 'E', backspace] THEN BEGIN
  203.       IF counter IN [0..Len + 1] THEN BEGIN
  204.         CASE ch OF
  205.           '0'..'9': IF counter IN [0..Len - 1] THEN BEGIN
  206.                       Write(ch);
  207.                       vstring := vstring + ch;
  208.                       counter := Succ(counter);
  209.                     END;
  210.          '+', '-' : IF counter = 0 THEN BEGIN
  211.                       IF (IO.real.sign = TRUE) AND
  212.                          (sign = FALSE) THEN  BEGIN
  213.                         Write(ch);
  214.                         vstring := ch;
  215.                         sign := TRUE;
  216.                         counter := Succ(counter);
  217.                       END; END
  218.                     ELSE BEGIN
  219.                       IF (IO.real.exp = TRUE) AND
  220.                          (expsign = FALSE) AND
  221.                          (exponent = TRUE) AND
  222.                          (vstring[counter] IN ['e', 'E'])
  223.                          THEN BEGIN
  224.                         Write(ch);
  225.                         vstring := vstring + ch;
  226.                         expsign := TRUE;
  227.                         counter := Succ(counter);
  228.                       END;
  229.                     END;
  230.               '.'   : IF counter IN [1..Len - 1] THEN BEGIN
  231.                         IF vstring[counter] IN ['0'..'9']
  232.                            THEN BEGIN
  233.                           IF point = FALSE THEN BEGIN
  234.                             write(ch);
  235.                             vstring := vstring + ch;
  236.                             point := TRUE;
  237.                             counter := Succ(counter);
  238.                           END;
  239.                         END;
  240.                       END;
  241.              'e', 'E' : IF counter IN [1..Len-1] THEN BEGIN
  242.                           IF (IO.real.exp = TRUE) AND
  243.                              (exponent = FALSE) AND
  244.                              ((vstring[1] IN ['0'..'9'])
  245.                              OR ((vstring[1] IN
  246.                              ['+', '-', '.']) AND
  247.                              (counter >1))) THEN BEGIN
  248.                             write(ch);
  249.                             vstring := vstring + ch;
  250.                             exponent := TRUE;
  251.                             counter := Succ(counter);
  252.                           END;
  253.                         END;
  254.               backspace : IF counter IN
  255.                              [1..Len + 1] THEN BEGIN
  256.                             CASE vstring[counter] OF
  257.                               '+', '-' : IF counter = 1 THEN
  258.                                            sign := FALSE
  259.                                          ELSE
  260.                                            expsign := FALSE;
  261.                               '.'      : point := FALSE;
  262.                               'e', 'E' : exponent := FALSE;
  263.                             END;
  264.                             Write(backspace);
  265.                             IF IO.mark = TRUE THEN
  266.                               Write(IO.line)
  267.                             ELSE Write(' ');
  268.                             Write(backspace);
  269.                             Delete(vstring, counter, 1);
  270.                             counter := Pred(counter);
  271.                           END;
  272.             END;
  273.           END;
  274.       END;
  275.   UNTIL ch = return;
  276.  
  277.   IF vstring = '' THEN vstring := '0';
  278.   IF vstring[1] = '+' THEN Delete(vstring, 1, 1);
  279.   Val(vstring, value, error);
  280.   IF error = 0 THEN Reel := value ELSE Reel := 0;
  281.   IO.error := (error > 0);
  282.   IO.errnr := error;
  283. END;
  284. (* ------------------------------------------------------ *)
  285. (*                Ende von TURBOINC.INC                   *)