home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / misc / safeio.ada < prev    next >
Encoding:
Text File  |  1988-05-03  |  9.5 KB  |  266 lines

  1.  
  2. -------- SIMTEL20 Ada Software Repository Prologue ------------
  3. --                                                           -*
  4. -- Unit name    : generic package SAFE_IO
  5. -- Version      : 1.0
  6. -- Author       : John A. Anderson
  7. --              : TEXAS INSTRUMENTS MS 8006
  8. --              : P.O. BOX 801
  9. --              : MCKINNEY, TEXAS   75069
  10. -- DDN Address  : ANDERSON%TI-EG@CSNET-RELAY
  11. -- Copyright    : (c) 1984 John A. Anderson
  12. -- Date created :  OCTOBER  2, 1984
  13. -- Release date :  NOVEMBER 27, 1984
  14. -- Last update  :  ANDERSON Wed Nov 27, 1984
  15. --                                                           -*
  16. ---------------------------------------------------------------
  17. --                                                           -*
  18. -- Keywords     :  INPUT/OUTPUT
  19. --
  20. -- Abstract     :  This generic package allows the user to
  21. ----------------:  input data types from the keyboard
  22. ----------------:  while checking the input for errors. (Proper
  23. ----------------:  Type:  syntax and ranges.)
  24. ----------------:  A procedure for checking input of characters
  25. ----------------:  for a proper subrange of the character set is
  26. ----------------:  provided.
  27. ----------------:  When an error is encountered, an error message
  28. ----------------:  is displayed and the user is allowed to reenter.
  29. ----------------:  Output routines are provided to allow the user
  30. ----------------:  to do I/O with only one instantiation.  Screen
  31. ----------------:  manipulation (i.e. NEW_LINE) should be done with
  32. ----------------:  TEXT_IO directly.
  33. ----------------:  Instantiations require a FIELD_WIDTH which
  34. ----------------:  specifies the maximum field width for the input
  35. ----------------:  of the corresponding type.
  36. --                                                           -*
  37. ------------------ Revision history ---------------------------
  38. --                                                           -*
  39. -- DATE         VERSION    AUTHOR                  HISTORY
  40. -- 11/27/84      1.0    Anderson        Initial Release
  41. --                                                           -*
  42. ------------------ Distribution and Copyright -----------------
  43. --                                                           -*
  44. -- This prologue must be included in all copies of this software.
  45. --
  46. -- This software is copyright by the author.
  47. --
  48. -- This software is released to the Ada community.
  49. -- This software is released to the Public Domain (note:
  50. --   software released to the Public Domain is not subject
  51. --   to copyright protection).
  52. -- Restrictions on use or distribution:  NONE
  53. --                                                           -*
  54. ------------------ Disclaimer ---------------------------------
  55. --                                                           -*
  56. -- This software and its documentation are provided "AS IS" and
  57. -- without any expressed or implied warranties whatsoever.
  58. -- No warranties as to performance, merchantability, or fitness
  59. -- for a particular purpose exist.
  60. --
  61. -- Because of the diversity of conditions and hardware under
  62. -- which this software may be used, no warranty of fitness for
  63. -- a particular purpose is offered.  The user is advised to
  64. -- test the software thoroughly before relying on it.  The user
  65. -- must assume the entire risk and liability of using this
  66. -- software.
  67. --
  68. -- In no event shall any person or organization of people be
  69. -- held responsible for any direct, indirect, consequential
  70. -- or inconsequential damages or lost profits.
  71. --                                                           -*
  72. -------------------END-PROLOGUE--------------------------------
  73.  
  74. with TEXT_IO;
  75. package SAFE_IO is
  76.  
  77.     generic
  78.         FIELD_WIDTH : INTEGER;
  79.         type ITEM is range <>;
  80.     package INTEGER_IO is
  81.         procedure GET (ELEMENT : out ITEM);
  82.         procedure PUT (ELEMENT : ITEM);
  83.     end INTEGER_IO;
  84.  
  85.     generic
  86.         FIELD_WIDTH : INTEGER;
  87.         type ITEM is (<>);
  88.     package ENUMERATION_IO is
  89.         procedure GET (ELEMENT : out ITEM);
  90.         procedure PUT (ELEMENT : ITEM);
  91.     end ENUMERATION_IO;
  92.  
  93.     generic
  94.         FIELD_WIDTH : INTEGER;
  95.         type ITEM is delta <>;
  96.     package FIXED_IO is
  97.         procedure GET (ELEMENT : out ITEM);
  98.         procedure PUT (ELEMENT : ITEM);
  99.     end FIXED_IO;
  100.  
  101.     generic
  102.         FIELD_WIDTH : INTEGER;
  103.         type ITEM is digits <>;
  104.     package FLOAT_IO is
  105.         procedure GET (ELEMENT : out ITEM);
  106.         procedure PUT (ELEMENT : ITEM);
  107.     end FLOAT_IO;
  108.  
  109.     generic
  110.         FIRST : CHARACTER;
  111.         LAST  : CHARACTER;
  112.     procedure GET_CHAR (ELEMENT : out CHARACTER);
  113.  
  114. end SAFE_IO;
  115.  
  116.  
  117. package body SAFE_IO is
  118.  
  119.     procedure GET_CHAR (ELEMENT : out CHARACTER) is
  120.         subtype ITEM is CHARACTER range FIRST .. LAST;
  121.         LOCAL : ITEM;
  122.     begin
  123.         MAIN:
  124.         loop
  125.             begin
  126.                 TEXT_IO.GET (LOCAL);
  127.                 ELEMENT := LOCAL;
  128.                 exit;
  129.             exception
  130.                 when TEXT_IO.DATA_ERROR =>
  131.                     TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter:");
  132.                     TEXT_IO.SKIP_LINE;
  133.                 when CONSTRAINT_ERROR =>
  134.                     TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter");
  135.             end;
  136.         end loop MAIN;
  137.     end GET_CHAR;
  138.  
  139.     package body INTEGER_IO is
  140.         package NORM_IO is new TEXT_IO.INTEGER_IO (ITEM);
  141.         procedure GET (ELEMENT : out ITEM) is
  142.             subtype MYSTRING is STRING (1 .. FIELD_WIDTH);
  143.             SOMETHING : MYSTRING;
  144.             LAST      : INTEGER;
  145.         begin
  146.             MAIN:
  147.             loop
  148.                 begin
  149.                     SOMETHING := (1 .. FIELD_WIDTH => ' ');
  150.                     TEXT_IO.GET_LINE (SOMETHING, LAST);
  151.                     ELEMENT := ITEM'VALUE (SOMETHING);
  152.                     exit;
  153.                 exception
  154.                     when CONSTRAINT_ERROR =>
  155.                         TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter:");
  156.                 end;
  157.             end loop MAIN;
  158.         end GET;
  159.  
  160.         procedure PUT (ELEMENT : ITEM) is
  161.         begin
  162.             NORM_IO.PUT (ELEMENT);
  163.         end PUT;
  164.     end INTEGER_IO;
  165.  
  166.     package body ENUMERATION_IO is
  167.         package NORM_IO is new TEXT_IO.ENUMERATION_IO (ITEM);
  168.         procedure GET (ELEMENT : out ITEM) is
  169.             subtype MYSTRING is STRING (1 .. FIELD_WIDTH);
  170.             SOMETHING : MYSTRING;
  171.             LAST      : INTEGER;
  172.         begin
  173.             MAIN:
  174.             loop
  175.                 begin
  176.                     SOMETHING := (1 .. FIELD_WIDTH => ' ');
  177.                     TEXT_IO.GET_LINE (SOMETHING, LAST);
  178.                     ELEMENT := ITEM'VALUE (SOMETHING);
  179.                     exit;
  180.                 exception
  181.                     when CONSTRAINT_ERROR =>
  182.                         TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter:");
  183.                 end;
  184.             end loop MAIN;
  185.         end GET;
  186.  
  187.         procedure PUT (ELEMENT : ITEM) is
  188.         begin
  189.             NORM_IO.PUT (ELEMENT);
  190.         end PUT;
  191.     end ENUMERATION_IO;
  192.  
  193.     package body FIXED_IO is
  194.         package NORM_IO is new TEXT_IO.FIXED_IO (ITEM);
  195.         procedure GET (ELEMENT : out ITEM) is
  196.             subtype MYSTRING is STRING (1 .. FIELD_WIDTH);
  197.             SOMETHING : MYSTRING;
  198.             LAST1     : INTEGER;
  199.             LAST2     : INTEGER;
  200.             EXTRA_CHARACTERS : exception;
  201.         begin
  202.             MAIN:
  203.             loop
  204.                 begin
  205.                     SOMETHING := (1 .. FIELD_WIDTH => ' ');
  206.                     TEXT_IO.GET_LINE (SOMETHING, LAST1);
  207.                     NORM_IO.GET (SOMETHING, ELEMENT, LAST2);
  208.                     if LAST1 > LAST2 then
  209.                         for INDEX in (LAST2 + 1) .. LAST1 loop
  210.                             if SOMETHING (INDEX) /= ' ' then
  211.                                 raise EXTRA_CHARACTERS;
  212.                             end if;
  213.                         end loop;
  214.                     end if;
  215.                     exit;
  216.                 exception
  217.                     when others =>
  218.                         TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter:");
  219.                 end;
  220.             end loop MAIN;
  221.         end GET;
  222.  
  223.         procedure PUT (ELEMENT : ITEM) is
  224.         begin
  225.             NORM_IO.PUT (ELEMENT);
  226.         end PUT;
  227.     end FIXED_IO;
  228.  
  229.     package body FLOAT_IO is
  230.         package NORM_IO is new TEXT_IO.FLOAT_IO (ITEM);
  231.         procedure GET (ELEMENT : out ITEM) is
  232.             subtype MYSTRING is STRING (1 .. FIELD_WIDTH);
  233.             SOMETHING : MYSTRING;
  234.             LAST1     : INTEGER;
  235.             LAST2     : INTEGER;
  236.             EXTRA_CHARACTERS : exception;
  237.         begin
  238.             MAIN:
  239.             loop
  240.                 begin
  241.                     SOMETHING := (1 .. FIELD_WIDTH => ' ');
  242.                     TEXT_IO.GET_LINE (SOMETHING, LAST1);
  243.                     NORM_IO.GET (SOMETHING, ELEMENT, LAST2);
  244.                     if LAST1 > LAST2 then
  245.                         for INDEX in (LAST2 + 1) .. LAST1 loop
  246.                             if SOMETHING (INDEX) /= ' ' then
  247.                                 raise EXTRA_CHARACTERS;
  248.                             end if;
  249.                         end loop;
  250.                     end if;
  251.                     exit;
  252.                 exception
  253.                     when others =>
  254.                         TEXT_IO.PUT_LINE ("ERROR, Please Re-Enter:");
  255.                 end;
  256.             end loop MAIN;
  257.         end GET;
  258.  
  259.         procedure PUT (ELEMENT : ITEM) is
  260.         begin
  261.             NORM_IO.PUT (ELEMENT);
  262.         end PUT;
  263.     end FLOAT_IO;
  264. end SAFE_IO;
  265.  
  266.