home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum8.lzh / PROGRAMME / MODULA / WINDOW / areaio.mod < prev    next >
Text File  |  1989-01-19  |  27KB  |  849 lines

  1. (*
  2. -------------------------------------------------------------------------------
  3. @@@@@@@@@@@@@@@@@@*)  IMPLEMENTATION  MODULE  AreaIO;  (*@@@@@@@@@@@@@@@@@@@@@@
  4. -------------------------------------------------------------------------------
  5. -------------------------------------------------------------------------------
  6. | Kurzbeschreibung   | formatierte Zahlenausgabe fuer Windowmodul Area        |
  7. ---------------------+---------------------------------------------------------
  8. | Programm - Version |  2.0   |   Text - Version        |   V#090             |
  9. ---------------------+--------+-----------------+-------+----------------------
  10. | Modulholder        |  WS    |   Urversion     |  WS   |   August 88         |
  11. ---------------------+---------------------------------------------------------
  12. | System - Version   | OS-9, Miele-Modula-2 3.5                               |
  13. ---------------------+---------------------------------------------------------
  14. | Copyright          | Freigegeben fuer nichtkommerzielle Nutzung             |
  15. |                    |  durch Teilnehmer am EFFO                              |
  16. ---------------------+---------------------------------------------------------
  17. | Hardware           | GEPARD 68010, 1 MByte RAM, 80Zeichen-Textkarte         |
  18. ---------------------+---------------------------------------------------------
  19. | besondere Importe  | Area                                                   |
  20. ---------------------+---------------------------------------------------------
  21. | Autoren            |  WS    | Werner Stehling, Seilerwis 3,                 |
  22. |                    |        | CH-8606 Greifensee, Tel. 01/256 42 21         |
  23. ---------------------+---------------------------------------------------------
  24. |   U P D A T E S    |                                                        |
  25. ----------------------                                                        |
  26. |   Datum   Version  Autor  Bemerkungen                                       |
  27. | --------  -------  -----  -----------                                       |
  28. | 10. 8.88    1.1      WS   dynamische Fensterverwaltung unter GDOS           |
  29. | 17. 8.88    1.1      WS   Prozeduren zur Zahlenausgabe                      |
  30. | 12.12.88    2.0      WS   Umstellung auf OS-9                               |
  31. | 15.12.88    2.0      WS   Aufteilung in Area und AreaIO                     |
  32. |                                                                             |
  33. -------------------------------------------------------------------------------
  34. | Modul-Beschreibung|   siehe Definition Modul                               |
  35. ----------------------                                                        |
  36. -------------------------------------------------------------------------------
  37. *)
  38.  
  39. FROM  SYSTEM    IMPORT  WORD, ADDRESS, SIZE, ADR;
  40. FROM  ConNum    IMPORT  AddrToStr, StrToAddr;
  41. FROM  ConReal   IMPORT  RealToStr, StrToReal;
  42. FROM  Strings   IMPORT  Concat, Length, Insert, SearchChar, Assign, Delete;
  43.  
  44. FROM  Area      IMPORT  maxx, CRKey, DelKey, BSKey, HTab, INSKey, UndoKey,
  45.                         LeftKey, RightKey, DownKey, UpKey, HomeKey, ESCKey,
  46.                         Write, WriteString, GetXY, GotoXY, GetAreaPar,
  47.                         DeleteOne, InsertChar, BusyRead;
  48. FROM  Math0     IMPORT  entier, real;
  49. FROM  Math1     IMPORT  lg, power;
  50.  
  51. CONST   maxstr = 39;
  52.  
  53. (*--------------------------------------------------------------------------*)
  54.         PROCEDURE  WriteStr (s : ARRAY OF CHAR; space : INTEGER);
  55. (*--------------------------------------------------------------------------*)
  56. (* auch alle Zahlenausgaben passieren hier                                  *)
  57.  
  58. VAR     i, k, l             : INTEGER;
  59.         xc, yc, dx, dy      : CARDINAL;
  60.  
  61. BEGIN
  62.   i := 0;
  63.   l := 0;
  64.   IF  space >= 1000  THEN
  65.     IF  space > 1000 THEN
  66.       k := space - 1000 - INTEGER (Length (s))
  67.     ELSE
  68.       GetXY (xc, yc);
  69.       GotoXY (0, yc);
  70.       GetAreaPar (NIL, xc, yc, dx, dy);
  71.       k := INTEGER (dx) - INTEGER (Length (s))
  72.     END;
  73.     IF  k > 0  THEN
  74.       i := k DIV 2;
  75.       l := k - i
  76.     END
  77.   ELSIF  space > 0  THEN
  78.     i := space - INTEGER (Length (s))
  79.   ELSIF  space < 0  THEN
  80.     l := -space - INTEGER (Length (s))
  81.   END;
  82.   WHILE  i > 0  DO
  83.     Write (' ');
  84.     i := i - 1
  85.   END;
  86.   WriteString (s);
  87.   WHILE  l > 0  DO
  88.     Write (' ');
  89.     l := l - 1
  90.   END;
  91. END WriteStr;
  92.  
  93. (*--------------------------------------------------------------------------*)
  94.         PROCEDURE  ZahlStr (val : ADDRESS; base : CARDINAL; digs : INTEGER;
  95.                                 prefix : CHAR; VAR s : ARRAY OF CHAR);
  96. (*--------------------------------------------------------------------------*)
  97.  
  98. VAR     s1      : ARRAY [0..maxstr] OF CHAR;
  99.         s2      : ARRAY [0.. 0] OF CHAR;
  100.         digits  : CARDINAL;
  101.  
  102. BEGIN
  103.   AddrToStr (val, base, s);
  104.   s2[0] := '0';
  105.   digits := 0;
  106.   IF  digs > 0  THEN
  107.     digits := CARDINAL (digs)
  108.   END;
  109.   WHILE  Length (s) < digits  DO
  110.     Assign (s, s1);
  111.     Concat (s2, s1, s)
  112.   END;
  113.   IF  prefix <> 0C  THEN
  114.     s2[0] := prefix;
  115.     Assign (s, s1);
  116.     Concat (s2, s1, s)
  117.   END;
  118. END  ZahlStr;
  119.  
  120. (*--------------------------------------------------------------------------*)
  121.         PROCEDURE  WriteZahl (val : ADDRESS; base : CARDINAL;
  122.                                 digs, space : INTEGER; prefix : CHAR);
  123. (*--------------------------------------------------------------------------*)
  124.  
  125. VAR     s   : ARRAY [0..maxstr] OF CHAR;
  126.  
  127. BEGIN
  128.   ZahlStr (val, base, digs, prefix, s);
  129.   WriteStr (s, space)
  130. END WriteZahl;
  131.  
  132. (*--------------------------------------------------------------------------*)
  133.         PROCEDURE  WriteCard (val : WORD; digs, space : INTEGER);
  134. (*--------------------------------------------------------------------------*)
  135.  
  136. BEGIN
  137.   WriteZahl (ADDRESS (val), 10, digs, space, 0C)
  138. END WriteCard;
  139.  
  140. (*--------------------------------------------------------------------------*)
  141.         PROCEDURE  WriteHex (val : WORD; digs, space : INTEGER);
  142. (*--------------------------------------------------------------------------*)
  143.  
  144. BEGIN
  145.   WriteZahl (ADDRESS (val), 16, digs, space, '$')
  146. END WriteHex;
  147.  
  148. (*--------------------------------------------------------------------------*)
  149.         PROCEDURE  WriteOct (val : WORD; digs, space : INTEGER);
  150. (*--------------------------------------------------------------------------*)
  151.  
  152. BEGIN
  153.   WriteZahl (ADDRESS (val), 8, digs, space, '&')
  154. END WriteOct;
  155.  
  156. (*--------------------------------------------------------------------------*)
  157.         PROCEDURE  WriteBin (val : WORD; digs, space : INTEGER);
  158. (*--------------------------------------------------------------------------*)
  159.  
  160.  
  161. BEGIN
  162.   WriteZahl (ADDRESS (val), 2, digs, space, '%')
  163. END WriteBin;
  164.  
  165. (*--------------------------------------------------------------------------*)
  166.         PROCEDURE  WriteInt (val : INTEGER; digs, space : INTEGER);
  167. (*--------------------------------------------------------------------------*)
  168.  
  169. VAR     s       : CHAR;
  170.  
  171. BEGIN
  172.   IF  val < 0  THEN
  173.     val := -val;
  174.     s := '-'
  175.   ELSE
  176.     s := 0C
  177.   END;
  178.   WriteZahl (ADDRESS (val), 10, digs, space, s)
  179. END WriteInt;
  180.  
  181. (*--------------------------------------------------------------------------*)
  182.         PROCEDURE  WriteLCard (val : ADDRESS; digs, space : INTEGER);
  183. (*--------------------------------------------------------------------------*)
  184.  
  185. BEGIN
  186.   WriteZahl (val, 10, digs, space, 0C)
  187. END WriteLCard;
  188.  
  189. (*--------------------------------------------------------------------------*)
  190.         PROCEDURE  WriteLHex (val : ADDRESS; digs, space : INTEGER);
  191. (*--------------------------------------------------------------------------*)
  192.  
  193. BEGIN
  194.   WriteZahl (val, 16, digs, space, '$')
  195. END WriteLHex;
  196.  
  197. (*--------------------------------------------------------------------------*)
  198.         PROCEDURE  WriteLBin (val : ADDRESS; digs, space : INTEGER);
  199. (*--------------------------------------------------------------------------*)
  200.  
  201. BEGIN
  202.   WriteZahl (val, 2, digs, space, '%')
  203. END WriteLBin;
  204.  
  205. (*--------------------------------------------------------------------------*)
  206.         PROCEDURE  WriteLInt (val : LONGINT; digs, space : INTEGER);
  207. (*--------------------------------------------------------------------------*)
  208.  
  209. VAR     s       : CHAR;
  210.  
  211. BEGIN
  212.   IF  val < 0  THEN
  213.     val := -val;
  214.     s := '-'
  215.   ELSE
  216.     s := 0C
  217.   END;
  218.   WriteZahl (val, 10, digs, space, s)
  219. END WriteLInt;
  220.  
  221. (*--------------------------------------------------------------------------*)
  222.         PROCEDURE  WriteReal (val : REAL; digs, space : INTEGER);
  223. (*--------------------------------------------------------------------------*)
  224.  
  225. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  226.  
  227. BEGIN
  228.   RealToStr (val, digs, s);
  229.   WriteStr (s, space)
  230. END WriteReal;
  231.  
  232. (*--------------------------------------------------------------------------*)
  233.         PROCEDURE  WriteFix (val : REAL; digs, space : INTEGER);
  234. (*--------------------------------------------------------------------------*)
  235.  
  236. BEGIN
  237.   WriteReal (val, ABS (digs), space)
  238. END WriteFix;
  239.  
  240. (*--------------------------------------------------------------------------*)
  241.         PROCEDURE  WriteFloat (val : REAL; digs, space : INTEGER);
  242. (*--------------------------------------------------------------------------*)
  243.  
  244. BEGIN
  245.   WriteReal (val, -ABS (digs), space)
  246. END WriteFloat;
  247.  
  248. (*--------------------------------------------------------------------------*)
  249.         PROCEDURE  EngPot (VAR val : REAL) : REAL;
  250. (*--------------------------------------------------------------------------*)
  251.  
  252. VAR     i       : REAL;
  253.         k       : INTEGER;
  254.  
  255. BEGIN
  256.   IF  val <> 0.0  THEN
  257.     i := lg (ABS (val))
  258.   ELSE
  259.     i := 0.0
  260.   END;
  261.   IF  i >= 0.0  THEN
  262.     k := entier (i + 0.5);
  263.     k := (k DIV 3) * 3
  264.   ELSE
  265.     k := entier (-i + 0.5);
  266.     k := -(k DIV 3 + 1) * 3
  267.   END;
  268.   i := real (k);
  269.   IF  k <> 0  THEN
  270.     val := val / power (10.0, i)
  271.   END;
  272.   RETURN i
  273. END  EngPot;
  274.  
  275. (*--------------------------------------------------------------------------*)
  276.       PROCEDURE  EngToStr (val : REAL; digs : INTEGER; VAR s : ARRAY OF CHAR);
  277. (*--------------------------------------------------------------------------*)
  278.  
  279. VAR     s1      : ARRAY [0..maxstr] OF CHAR;
  280.         se      : ARRAY [0..0] OF CHAR;
  281.         i       : REAL;
  282.         k       : CARDINAL;
  283.  
  284. BEGIN
  285.   se[0] := 'E';
  286.   i := EngPot (val);
  287.   RealToStr (val, ABS (digs), s);
  288.   IF  i <> 0.0  THEN
  289.     RealToStr (i, 0, s1);
  290.     Insert (se, s, Length (s));
  291.     IF  i > 0.0  THEN
  292.       se[0] := '+';
  293.       Insert (se, s, Length (s));
  294.     END;
  295.     Insert (s1, s, Length (s));
  296.   END
  297. END  EngToStr;
  298.  
  299. (*--------------------------------------------------------------------------*)
  300.         PROCEDURE  WriteEng (val : REAL; digs, space : INTEGER);
  301. (*--------------------------------------------------------------------------*)
  302.  
  303. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  304.  
  305. BEGIN
  306.   EngToStr (val, digs, s);
  307.   WriteStr (s, space)
  308. END  WriteEng;
  309.  
  310. (*--------------------------------------------------------------------------*)
  311.      PROCEDURE  OhmToStr (val : REAL; digs : INTEGER; VAR s : ARRAY OF CHAR);
  312. (*--------------------------------------------------------------------------*)
  313.  
  314. VAR     i       : REAL;
  315.         pos     : CARDINAL;
  316.         ch      : CHAR;
  317.         oldval  : REAL;
  318.  
  319. BEGIN
  320.   oldval := val;
  321.   i := EngPot (val);
  322.   IF  digs = 0  THEN
  323.     digs := 1
  324.   END;
  325.   RealToStr (val, ABS (digs), s);
  326.   CASE  entier (i)  OF
  327.     -18 :       ch := 'a'       |
  328.     -15 :       ch := 'f'       |
  329.     -12 :       ch := 'p'       |
  330.     -9  :       ch := 'n'       |
  331.     -6  :       ch := 'u'       |
  332.     -3  :       ch := 'm'       |
  333.     0   :       ch := '.'       |
  334.     3   :       ch := 'K'       |
  335.     6   :       ch := 'M'       |
  336.     9   :       ch := 'G'       |
  337.     12  :       ch := 'T'
  338.   ELSE
  339.     RealToStr (oldval, -ABS (digs), s);
  340.     ch := '.'
  341.   END;
  342.   IF  SearchChar ('.', s, 0, pos)  THEN
  343.     s[pos] := ch
  344.   END;
  345. END  OhmToStr;
  346.  
  347. (*--------------------------------------------------------------------------*)
  348.         PROCEDURE  WriteOhm (val : REAL; digs, space : INTEGER);
  349. (*--------------------------------------------------------------------------*)
  350.  
  351. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  352.  
  353. BEGIN
  354.   OhmToStr (val, digs, s);  
  355.   WriteStr (s, space)
  356. END WriteOhm;
  357.  
  358. (*--------------------------------------------------------------------------*)
  359.         PROCEDURE  ClearField (VAR s : ARRAY OF CHAR; space : CARDINAL);
  360. (*--------------------------------------------------------------------------*)
  361.  
  362. VAR     i, xc, yc, k   : CARDINAL;
  363.  
  364. BEGIN
  365.   GetXY (xc, yc);
  366.   k := CARDINAL (HIGH (s)) + 1;
  367.   IF  k > space  THEN
  368.     k := space
  369.   END;
  370.   FOR  i := 0  TO  k - 1  DO
  371.     s[i] := 0C
  372.   END;
  373.   FOR  i := 1  TO  space  DO
  374.     Write (' ')
  375.   END;
  376.   GotoXY (xc, yc)
  377. END ClearField;
  378.  
  379. (*--------------------------------------------------------------------------*)
  380.         PROCEDURE  ReadStr (VAR s : ARRAY OF CHAR; space : INTEGER) : CHAR;
  381. (*--------------------------------------------------------------------------*)
  382.  
  383. VAR     xc, len, axc, ayc, spac : CARDINAL;
  384.         eoiflag, insertmode     : BOOLEAN;
  385.         ch                      : CHAR;
  386.         ns                      : ARRAY [0..maxx] OF CHAR;
  387.         x0, y0, dy              : CARDINAL;
  388.         
  389.     (*----------------------------------------------------------------------*)
  390.         PROCEDURE  GotoX (xpos : CARDINAL);
  391.     (*----------------------------------------------------------------------*)
  392.     
  393.     BEGIN
  394.       xc := xpos;
  395.       GotoXY (axc+xc, ayc)
  396.     END  GotoX;
  397.     
  398.     (*----------------------------------------------------------------------*)
  399.         PROCEDURE  DeleteChar;
  400.     (*----------------------------------------------------------------------*)
  401.     VAR     i   : CARDINAL;
  402.     BEGIN
  403.       FOR  i := xc  TO  Length (ns)  DO
  404.         ns[i] := ns[i+1]
  405.       END;
  406.       DeleteOne  
  407.     END  DeleteChar;
  408.     
  409.     (*----------------------------------------------------------------------*)
  410.         PROCEDURE  GetChar;
  411.     (*----------------------------------------------------------------------*)
  412.     VAR     ss      : ARRAY [0..0] OF CHAR;
  413.     BEGIN
  414.       ss[0] := ch;
  415.       IF  insertmode  THEN
  416.         IF  (xc <= Length (ns)) AND (Length (ns) <= len)  THEN
  417.           InsertChar (1);
  418.           Insert (ss, ns, xc);
  419.           Write (ch);
  420.           INC (xc)
  421.         END
  422.       ELSE
  423.         ns[xc] := ch;
  424.         Write (ch);
  425.         INC (xc)
  426.       END;
  427.     END  GetChar;
  428.     
  429.     (*----------------------------------------------------------------------*)
  430.         PROCEDURE  Undo;
  431.     (*----------------------------------------------------------------------*)
  432.     BEGIN
  433.       ClearField (ns, len+1);
  434.       ClearField (ns, spac);
  435.       Assign (s, ns);
  436.       ns[len+1] := 0c;
  437.       GotoXY (axc, ayc);
  438.       WriteString (ns);
  439.       GotoXY (axc, ayc);
  440.     END  Undo;  
  441.  
  442.     (*----------------------------------------------------------------------*)
  443.  
  444. BEGIN
  445.   GetXY (axc, ayc);  
  446.   spac := ABS (space);
  447.   IF  spac > 1000  THEN
  448.     spac := spac - 1000
  449.   ELSIF  spac = 1000  THEN
  450.     axc := 0;
  451.     GotoXY (axc, ayc);
  452.     GetAreaPar (NIL, x0, y0, spac, dy)
  453.   END;
  454.   ClearField (ns, spac);
  455.   len := spac - 1;
  456.   Assign (s, ns);
  457.   WriteString (ns);
  458.   GotoX (0);
  459.   eoiflag := FALSE;
  460.   insertmode := FALSE;
  461.   REPEAT
  462.     BusyRead (ch);
  463.     CASE  ch  OF
  464.       DelKey    : DeleteChar                     |
  465.       BSKey     : IF xc > 0  THEN
  466.                     GotoX (xc-1);  DeleteChar
  467.                   END                            |
  468.       INSKey    : insertmode := NOT (insertmode) |
  469.       LeftKey   : IF xc > 0  THEN
  470.                     GotoX (xc-1)
  471.                   END                            |
  472.       RightKey  : IF  (xc < len) AND (xc < Length (ns))  THEN
  473.                     GotoX (xc+1)
  474.                   END                            |
  475.       DownKey,
  476.       UpKey,
  477.       CRKey     : eoiflag := TRUE                |
  478.       ESCKey    : Undo;
  479.                   eoiflag := TRUE                |
  480.       HomeKey   : ClearField (ns, len+1)         |
  481.       UndoKey   : Undo;
  482.     ELSE
  483.       IF  (xc >= 0) AND (xc <= len)  THEN
  484.         GetChar
  485.       END
  486.     END
  487.   UNTIL  eoiflag;
  488.   Assign (ns, s);
  489.   GotoX (0);
  490.   WriteStr (s, space);
  491.   RETURN  ch
  492. END  ReadStr;
  493.  
  494. (*--------------------------------------------------------------------------*)
  495.         PROCEDURE  ReadAddress (VAR val : ADDRESS; digs, space : INTEGER;
  496.                                     base: CARDINAL) : CHAR;
  497. (*--------------------------------------------------------------------------*)
  498.  
  499. VAR     s                       : ARRAY [0..maxstr] OF CHAR;
  500.         ch, prefix              : CHAR;
  501.         axc, ayc, nbase, lens   : CARDINAL;
  502.         ok                      : BOOLEAN;
  503.         nval                    : ADDRESS;
  504.         nspac                   : INTEGER;
  505.  
  506. BEGIN
  507.   GetXY (axc, ayc);
  508.   REPEAT
  509.     CASE  base  OF
  510.        2 :    prefix := '%'     |
  511.        8 :    prefix := '&'     |
  512.       10 :    prefix :=  0C     |
  513.       16 :    prefix := '$'
  514.     END;
  515.     ZahlStr (val, base, digs, prefix, s);
  516.     IF  space > 1000  THEN
  517.       nspac := 1000 - space
  518.     ELSE
  519.       nspac := -ABS (space)
  520.     END;
  521.     IF  INTEGER (Length (s)) > -nspac  THEN
  522.       nspac := -INTEGER (Length (s))
  523.     END;
  524.     ch := ReadStr (s, nspac);
  525.     WHILE  (s[0] <> 0C) AND (s[0] <= ' ')  DO
  526.       Delete (s, 0, 1)
  527.     END;
  528.     lens := Length (s) - 1;
  529.     WHILE  (s[0] <> 0C) AND (s[lens] <= ' ')  DO
  530.       Delete (s, lens, 1);
  531.       lens := Length (s) - 1
  532.     END;
  533.     CASE  s[0]  OF
  534.       '%' :   Delete (s, 0, 1);   nbase :=  2      |
  535.       '&' :   Delete (s, 0, 1);   nbase :=  8      |
  536.       '$' :   Delete (s, 0, 1);   nbase := 16
  537.     ELSE
  538.       nbase := 10;
  539.     END;
  540.     nval := 0;
  541.     ok := TRUE;
  542.     IF  Length (s) > 0  THEN
  543.       StrToAddr (s, nbase, nval, ok)
  544.     END;
  545.     GotoXY (axc, ayc)
  546.   UNTIL  ok;
  547.   val := nval;
  548.   WriteZahl (val, base, digs, space, prefix);
  549.   RETURN  ch
  550. END  ReadAddress;
  551.  
  552. (*--------------------------------------------------------------------------*)
  553.         PROCEDURE  ReadWord (VAR val : WORD; digs, space : INTEGER;
  554.                                  base: CARDINAL) : CHAR;
  555. (*--------------------------------------------------------------------------*)
  556.  
  557. VAR     ch  : CHAR;
  558.         lval: ADDRESS;
  559.         
  560. BEGIN
  561.   lval := ADDRESS (val);
  562.   ch := ReadAddress (lval, digs, space, base);
  563.   val := WORD (lval);
  564.   RETURN  ch
  565. END  ReadWord;
  566.  
  567. (*--------------------------------------------------------------------------*)
  568.         PROCEDURE  ReadCard (VAR val : WORD; digs, space : INTEGER) : CHAR;
  569. (*--------------------------------------------------------------------------*)
  570.  
  571. BEGIN
  572.   RETURN  ReadWord (val, digs, space, 10)
  573. END  ReadCard;
  574.  
  575. (*--------------------------------------------------------------------------*)
  576.         PROCEDURE  ReadHex (VAR val : WORD; digs, space : INTEGER) : CHAR;
  577. (*--------------------------------------------------------------------------*)
  578.  
  579. BEGIN
  580.   RETURN  ReadWord (val, digs, space, 16)
  581. END  ReadHex;
  582.  
  583. (*--------------------------------------------------------------------------*)
  584.         PROCEDURE  ReadOct (VAR val : WORD; digs, space : INTEGER) : CHAR;
  585. (*--------------------------------------------------------------------------*)
  586.  
  587. BEGIN
  588.   RETURN  ReadWord (val, digs, space, 8)
  589. END  ReadOct;
  590.  
  591. (*--------------------------------------------------------------------------*)
  592.         PROCEDURE  ReadBin (VAR val : WORD; digs, space : INTEGER) : CHAR;
  593. (*--------------------------------------------------------------------------*)
  594.  
  595. BEGIN
  596.   RETURN  ReadWord (val, digs, space, 2)
  597. END  ReadBin;
  598.  
  599. (*--------------------------------------------------------------------------*)
  600.         PROCEDURE  ReadInt (VAR val : INTEGER; digs, space : INTEGER) : CHAR;
  601. (*--------------------------------------------------------------------------*)
  602.  
  603. VAR     ch  : CHAR;
  604.         lval: LONGINT;
  605.  
  606. BEGIN
  607.   lval := LONGINT (val);
  608.   ch := ReadLInt (lval, digs, space);
  609.   val := WORD (lval);
  610.   RETURN  ch
  611. END  ReadInt;
  612.  
  613. (*--------------------------------------------------------------------------*)
  614.         PROCEDURE  ReadLCard (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
  615. (*--------------------------------------------------------------------------*)
  616.  
  617. BEGIN
  618.   RETURN  ReadAddress (val, digs, space, 10)
  619. END  ReadLCard;
  620.  
  621. (*--------------------------------------------------------------------------*)
  622.         PROCEDURE  ReadLHex (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
  623. (*--------------------------------------------------------------------------*)
  624.  
  625. BEGIN
  626.   RETURN  ReadAddress (val, digs, space, 16)
  627. END  ReadLHex;
  628.  
  629. (*--------------------------------------------------------------------------*)
  630.         PROCEDURE  ReadLBin (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
  631. (*--------------------------------------------------------------------------*)
  632.  
  633. BEGIN
  634.   RETURN  ReadAddress (val, digs, space, 2)
  635. END  ReadLBin;
  636.  
  637. (*--------------------------------------------------------------------------*)
  638.         PROCEDURE  ReadLInt (VAR val : LONGINT; digs, space : INTEGER) : CHAR;
  639. (*--------------------------------------------------------------------------*)
  640.  
  641. VAR     s                       : ARRAY [0..maxstr] OF CHAR;
  642.         ch, prefix, nsig        : CHAR;
  643.         axc, ayc, nbase, lens   : CARDINAL;
  644.         ok                      : BOOLEAN;
  645.         nval                    : ADDRESS;
  646.         nspac                   : INTEGER;
  647.  
  648. BEGIN
  649.   GetXY (axc, ayc);
  650.   REPEAT
  651.     IF  val < 0  THEN
  652.       prefix := '-';
  653.       nval := ADDRESS (-val)
  654.     ELSE
  655.       prefix := 0C;
  656.       nval := ADDRESS (val)
  657.     END;
  658.     ZahlStr (nval, 10, digs, prefix, s);
  659.     IF  space > 1000  THEN
  660.       nspac := 1000 - space
  661.     ELSE
  662.       nspac := -ABS (space)
  663.     END;
  664.     IF  INTEGER (Length (s)) > -nspac  THEN
  665.       nspac := -INTEGER (Length (s))
  666.     END;
  667.     ch := ReadStr (s, nspac);
  668.     WHILE  (s[0] <> 0C) AND (s[0] <= ' ')  DO
  669.       Delete (s, 0, 1)
  670.     END;
  671.     lens := Length (s) - 1;
  672.     WHILE  (s[0] <> 0C) AND (s[lens] <= ' ')  DO
  673.       Delete (s, lens, 1);
  674.       lens := Length (s) - 1
  675.     END;
  676.     IF  s[0] = '-'  THEN
  677.       Delete (s, 0, 1);
  678.       nsig := '-'
  679.     ELSIF  s[0] = '+'  THEN
  680.       Delete (s, 0, 1);
  681.       nsig := 0C
  682.     ELSE
  683.       nsig := 0C
  684.     END;
  685.     nval := 0;
  686.     ok := TRUE;
  687.     IF  Length (s) > 0  THEN
  688.       StrToAddr (s, 10, nval, ok);
  689.     END;
  690.     GotoXY (axc, ayc)
  691.   UNTIL  ok;
  692.       IF  nsig = '-'  THEN
  693.         val := -LONGINT (nval)
  694.       ELSE
  695.         val :=  LONGINT (nval)
  696.       END;
  697.   WriteZahl (nval, 10, digs, space, nsig);
  698.   RETURN  ch
  699. END  ReadLInt;
  700.  
  701. (*--------------------------------------------------------------------------*)
  702.         PROCEDURE  ReadFix (VAR val : REAL; digs, space : INTEGER) : CHAR;
  703. (*--------------------------------------------------------------------------*)
  704.  
  705. BEGIN
  706.   RETURN  ReadReal (val, ABS (digs), space)
  707. END  ReadFix;
  708.  
  709. (*--------------------------------------------------------------------------*)
  710.         PROCEDURE  ReadFloat (VAR val : REAL; digs, space : INTEGER) : CHAR;
  711. (*--------------------------------------------------------------------------*)
  712.  
  713. BEGIN
  714.   RETURN  ReadReal (val, -ABS (digs), space)
  715. END  ReadFloat;
  716.  
  717. (*--------------------------------------------------------------------------*)
  718.         PROCEDURE  ReadRealS (VAR val : REAL; VAR s : ARRAY OF CHAR;
  719.                                   digs, space : INTEGER) : CHAR;
  720. (*--------------------------------------------------------------------------*)
  721.  
  722. VAR     ch                  : CHAR;
  723.         axc, ayc, lens      : CARDINAL;
  724.         ok                  : BOOLEAN;
  725.         nval                : REAL;
  726.         nspac               : INTEGER;
  727.         s1                  : ARRAY [0..maxstr] OF CHAR;
  728.  
  729. BEGIN
  730.   GetXY (axc, ayc);
  731.   REPEAT
  732.     IF  space > 1000  THEN
  733.       nspac := 1000 - space
  734.     ELSE
  735.       nspac := -ABS (space)
  736.     END;
  737.     IF  INTEGER (Length (s)) > -nspac  THEN
  738.       nspac := -INTEGER (Length (s))
  739.     END;
  740.     ch := ReadStr (s, nspac);
  741.     WHILE  (s[0] <> 0C) AND (s[0] <= ' ')  DO
  742.       Delete (s, 0, 1)
  743.     END;
  744.     lens := Length (s) - 1;
  745.     WHILE  (s[0] <> 0C) AND (s[lens] <= ' ')  DO
  746.       Delete (s, lens, 1);
  747.       lens := Length (s) - 1
  748.     END;
  749.     StrToReal (s, nval, ok);
  750.     IF  NOT ok  THEN
  751.       Assign (s, s1);
  752.       StrToOhm (s1, nval, ok)
  753.     END;
  754.     GotoXY (axc, ayc)
  755.   UNTIL  ok;
  756.   val := nval;
  757.   RETURN  ch
  758. END  ReadRealS;
  759.  
  760. (*--------------------------------------------------------------------------*)
  761.         PROCEDURE  ReadReal (VAR val : REAL; digs, space : INTEGER) : CHAR;
  762. (*--------------------------------------------------------------------------*)
  763.  
  764. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  765.         ch      : CHAR;
  766.  
  767. BEGIN
  768.   RealToStr (val, digs, s);
  769.   ch := ReadRealS (val, s, digs, space);
  770.   WriteReal (val, digs, space);
  771.   RETURN  ch
  772. END  ReadReal;
  773.  
  774. (*--------------------------------------------------------------------------*)
  775.         PROCEDURE  ReadEng (VAR val : REAL; digs, space : INTEGER) : CHAR;
  776. (*--------------------------------------------------------------------------*)
  777.  
  778. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  779.         ch      : CHAR;
  780.  
  781. BEGIN
  782.   EngToStr (val, digs, s);
  783.   ch := ReadRealS (val, s, digs, space);
  784.   WriteEng (val, digs, space);
  785.   RETURN  ch
  786. END  ReadEng;
  787.  
  788. (*--------------------------------------------------------------------------*)
  789.         PROCEDURE  StrToOhm (VAR s : ARRAY OF CHAR; VAR val : REAL;
  790.                                   VAR ok : BOOLEAN);
  791. (*--------------------------------------------------------------------------*)
  792.  
  793. VAR     pos     : CARDINAL;
  794.  
  795.     (*----------------------------------------------------------------------*)
  796.         PROCEDURE  OhmConv (VAR s, exp : ARRAY OF CHAR);
  797.     (*----------------------------------------------------------------------*)
  798.     BEGIN
  799.       s[pos] := '.';
  800.       Concat (s, exp, s)
  801.     END  OhmConv;
  802.     (*----------------------------------------------------------------------*)
  803.     
  804. BEGIN
  805.   IF    SearchChar ('a', s, 0, pos)  THEN
  806.     OhmConv (s, 'E-18')
  807.   ELSIF SearchChar ('f', s, 0, pos)  THEN
  808.     OhmConv (s, 'E-15')
  809.   ELSIF SearchChar ('p', s, 0, pos)  THEN
  810.     OhmConv (s, 'E-12')
  811.   ELSIF SearchChar ('n', s, 0, pos)  THEN
  812.     OhmConv (s, 'E-9')
  813.   ELSIF SearchChar ('u', s, 0, pos)  THEN
  814.     OhmConv (s, 'E-6')
  815.   ELSIF SearchChar ('m', s, 0, pos)  THEN
  816.     OhmConv (s, 'E-3')
  817.   ELSIF SearchChar ('K', s, 0, pos)  THEN
  818.     OhmConv (s, 'E+3')
  819.   ELSIF SearchChar ('M', s, 0, pos)  THEN
  820.     OhmConv (s, 'E+6')
  821.   ELSIF SearchChar ('G', s, 0, pos)  THEN
  822.     OhmConv (s, 'E+9')
  823.   ELSIF SearchChar ('T', s, 0, pos)  THEN
  824.     OhmConv (s, 'E+12')
  825.   END;
  826.   StrToReal (s, val, ok)
  827. END  StrToOhm;
  828.  
  829. (*--------------------------------------------------------------------------*)
  830.         PROCEDURE  ReadOhm (VAR val : REAL; digs, space : INTEGER) : CHAR;
  831. (*--------------------------------------------------------------------------*)
  832.  
  833. VAR     s       : ARRAY [0..maxstr] OF CHAR;
  834.         ch      : CHAR;
  835.  
  836. BEGIN
  837.   OhmToStr (val, digs, s);
  838.   ch := ReadRealS (val, s, digs, space);
  839.   WriteOhm (val, digs, space);
  840.   RETURN  ch
  841. END  ReadOhm;
  842.  
  843. (*--------------------------------------------------------------------------*)
  844.   
  845. BEGIN
  846. END  AreaIO.
  847.  
  848.  
  849.