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

  1.  
  2. -- This is an attempt to create a file with at least one of each
  3. -- kind of Ada statement, structure, lexical item, operator, etc.
  4. --
  5. -- The problem is the need for some ordering so that completeness can
  6. -- be checked and excessive redundancy prevented. The LRM chapter order
  7. -- is not convenient for Ada that can be compiled.
  8. --
  9. pragma LIST ( ON ) ;
  10.  
  11. package ALL_STATEMENTS_PACKAGE is
  12.  
  13.   task ALL_STATEMENTS_TASK is
  14.     entry ALL_STATEMENTS_ENTRY_1 ;
  15.     entry ALL_STATEMENTS_ENTRY_2 ( PARAM_1 : STRING ;
  16.                                    PARAM_2 : INTEGER ) ;
  17.     entry ALL_STATEMENTS_ENTRY_3 ;
  18.     entry ALL_STATEMENTS_ENTRY_4 ( PARAM_1 : STRING ;
  19.                                    PARAM_2 : FLOAT ) ;
  20.   end ALL_STATEMENTS_TASK ;
  21.  
  22.   task type ALL_STATEMENTS_TASK_TYPE is
  23.     entry ALL_STATEMENTS_ENTRY_1_TYPE ;
  24.   end ALL_STATEMENTS_TASK_TYPE ;
  25.  
  26.   function FUNCTION_IN_PACKAGE return INTEGER ;
  27.  
  28.   function FUNCTION_WITH_ARGUMENTS_IN_PACKAGE ( A , B : INTEGER ;
  29.                                                 C , D : FLOAT ) return BOOLEAN
  30.      ;
  31.  
  32.   procedure PROCEDURE_IN_PACKAGE ;
  33.  
  34.   procedure PROCEDURE_WITH_ARGUMENTS_IN_PACKAGE ( LONG_PARAMETER_NAME : FLOAT
  35.      ;
  36.                                                   SHORT : INTEGER ) ;
  37.   NUMBER_1 : INTEGER := 12 ;
  38.   NUMBER_2 : constant := 1E6 ;
  39.   NUMBER_3 : constant INTEGER := 23_456 ;
  40.   NUMBER_4 : INTEGER := 0_0_0 ;
  41.   NUMBER_5 : FLOAT := 12.0 ;
  42.   NUMBER_6 : constant := 1.0E+6 ;
  43.   NUMBER_7 : constant FLOAT := - 314_159.26E-0_5 ;
  44.   NUMBER_8 : constant := 2#101_101# + 16#FF# - 0_016#AB# ;
  45.   NUMBER_9 : constant := 16#F.F_F#E-2 + 2.0 ;
  46.   type MINE is limited private ;
  47. private
  48.   type MINE is new BOOLEAN ;
  49.   subtype MY_BOOLEAN is BOOLEAN ;
  50.   subtype MY_INT is INTEGER range - 5 .. 3 ;
  51.   type GENDER is ( M , F ) ;
  52.   type PERSON ( SEX : GENDER ) ;
  53.   type PERSON_NAME is access PERSON ;
  54.   type DATE is new INTEGER ;
  55.   type PERSON ( SEX : GENDER ) is
  56.     record
  57.       NAME : STRING ( 1 .. 20 ) ;
  58.       BIRTH : DATE ;
  59.       AGE : INTEGER range 0 .. 130 ;
  60.       case SEX is
  61.         when M =>
  62.           WIFE : PERSON_NAME ( SEX => F ) ;
  63.         when F =>
  64.           HUSBAND : PERSON_NAME ( SEX => M ) ;
  65.       end case ;
  66.     end record ;
  67.   JOHN , PAUL : PERSON_NAME := new PERSON ( SEX => M ) ;
  68.   JANE : PERSON_NAME := new PERSON ( SEX => F ) ;
  69.   ME : PERSON_NAME renames JANE ;
  70.   YOU : PERSON ( SEX => F ) := ME.all ;
  71.   type REP_RECORD is
  72.     record
  73.       I : INTEGER range - 63 .. 63 ;
  74.     end record ;
  75.  
  76. --  for REP_RECORD use
  77. --    record at mod 4 ;
  78. --      I at 0 range 0 .. 7 ;
  79. --    end record ;
  80.   OBJECT_REP_REC : REP_RECORD ;
  81.   I : INTEGER := OBJECT_REP_REC.I ;
  82.   MY_ERROR : exception ;
  83.   ANOTHER_ERROR : exception renames MY_ERROR ;
  84.   ARRAY_OBJECT : array ( INTEGER( - 1 ) .. 1) of FLOAT := ( - 1.0 , 0.0 , 1.0
  85.      ) ;
  86.  
  87.   package MY_PACKAGE is  -- dummy for following  renames
  88.  
  89.     function MY_FUNCTION return INTEGER ;
  90.  
  91.     procedure MY_PROCEDURE ;
  92.   end MY_PACKAGE ;
  93.  
  94.   package NEW_NAME renames MY_PACKAGE ; use NEW_NAME ;
  95.  
  96.   function ANOTHER_FUNCTION return INTEGER renames MY_FUNCTION ;
  97.  
  98.   procedure ANOTHER_PROCEDURE renames MY_PROCEDURE ;
  99. end ALL_STATEMENTS_PACKAGE ;
  100.  
  101. with TEXT_IO ; use TEXT_IO ;
  102.  
  103. package body ALL_STATEMENTS_PACKAGE is
  104.  
  105.   task body ALL_STATEMENTS_TASK is
  106.   begin
  107.     loop
  108.       select
  109.         when I > 2 =>
  110.           accept ALL_STATEMENTS_ENTRY_1 do
  111.             PUT_LINE ( " accepted 1" ) ;
  112.           end ALL_STATEMENTS_ENTRY_1 ;
  113.           I := I + 1 ;
  114.       or
  115.         when I >= 3 =>
  116.           accept ALL_STATEMENTS_ENTRY_2 ( PARAM_1 : STRING ;
  117.                                           PARAM_2 : INTEGER ) do
  118.             PUT_LINE ( " accepted 2" ) ;
  119.           end ALL_STATEMENTS_ENTRY_2 ;
  120.           accept ALL_STATEMENTS_ENTRY_3 ;  -- no "do"
  121.           accept ALL_STATEMENTS_ENTRY_4 ( PARAM_1 : STRING ;
  122.                                           PARAM_2 : FLOAT ) ;
  123.           I := I + 1 ;
  124.       or
  125.         terminate ;
  126.       end select ;
  127.     end loop ;
  128.   exception
  129.     when CONSTRAINT_ERROR =>
  130.       PUT_LINE ( " too bad " ) ;
  131.   end ALL_STATEMENTS_TASK ;
  132.  
  133.   task body ALL_STATEMENTS_TASK_TYPE is
  134.   begin
  135.     select
  136.       accept ALL_STATEMENTS_ENTRY_1_TYPE do
  137.         PUT_LINE ( " accepted " ) ;
  138.       end ALL_STATEMENTS_ENTRY_1_TYPE ;
  139.       abort ALL_STATEMENTS_TASK ;
  140.     else
  141.       null ;
  142.     end select ;
  143.     select
  144.       accept ALL_STATEMENTS_ENTRY_1_TYPE do
  145.         PUT_LINE ( " accepted " ) ;
  146.       end ALL_STATEMENTS_ENTRY_1_TYPE ;
  147.     or
  148.       delay 3.5 ;
  149.     end select ;
  150.   exception
  151.     when CONSTRAINT_ERROR =>
  152.       PUT_LINE ( " too bad " ) ;
  153.   end ALL_STATEMENTS_TASK_TYPE ;
  154.  
  155.   function FUNCTION_IN_PACKAGE return INTEGER is
  156.     B : BOOLEAN ;
  157.     I : INTEGER ;
  158.   begin
  159.     I := abs ( I mod 1 ) rem 1 ;
  160.     B := B or ( B and( not( B xor B ))) ;
  161.     return ( 1 +( 2 * 3 / 4 ) ** ( 3 )) ;
  162.   exception
  163.     when CONSTRAINT_ERROR =>
  164.       raise PROGRAM_ERROR ;
  165.     when others =>
  166.       raise STORAGE_ERROR ;
  167.   end FUNCTION_IN_PACKAGE ;
  168.  
  169.   function FUNCTION_WITH_ARGUMENTS_IN_PACKAGE ( A , B : INTEGER ;
  170.                                                 C , D : FLOAT ) return BOOLEAN
  171.      is
  172.     AA : INTEGER := - 1 ;
  173.     LONG_EXPRESSION : INTEGER := A + A + A + A + A + A + A + A + B + B + B +
  174.        INTEGER ( C ) + INTEGER ( D ) ;
  175.   begin
  176.     raise CONSTRAINT_ERROR ;
  177.   exception
  178.     when NUMERIC_ERROR =>
  179.       raise TASKING_ERROR ;
  180.     when others =>
  181.       return TRUE ;
  182.   end FUNCTION_WITH_ARGUMENTS_IN_PACKAGE ;
  183.  
  184.   procedure PROCEDURE_IN_PACKAGE is
  185.   begin
  186.     return ;
  187.   exception
  188.     when others =>
  189.       return ;
  190.   end PROCEDURE_IN_PACKAGE ;
  191.  
  192.   procedure PROCEDURE_WITH_ARGUMENTS_IN_PACKAGE ( LONG_PARAMETER_NAME : FLOAT
  193.      ;
  194.                                                   SHORT : INTEGER ) is
  195.   begin
  196.     null ;
  197.   end PROCEDURE_WITH_ARGUMENTS_IN_PACKAGE ;
  198.  
  199.   package body MY_PACKAGE is  -- dummy for following  renames
  200.  
  201.     function MY_FUNCTION return INTEGER is
  202.     begin
  203.       return 1 ;
  204.     end MY_FUNCTION ;
  205.  
  206.     procedure MY_PROCEDURE is
  207.     begin
  208.       null ;
  209.     end MY_PROCEDURE ;
  210.   end MY_PACKAGE ;
  211. begin
  212.   I := I + 1 ;
  213. exception
  214.   when CONSTRAINT_ERROR =>
  215.     PUT_LINE ( " woopse " ) ;
  216.     if I = 1 then
  217.       I := 2 ;
  218.       if I /= 1 then
  219.         case I is
  220.           when 1 =>
  221.             I := 2 ;
  222.           when 2 | 3 =>
  223.             I := 3 ;
  224.             if 1 > 2 and then
  225.                2 >= 3 then
  226.               raise NUMERIC_ERROR ;
  227.             elsif 2 < 1 or else
  228.                3 <= 2 then
  229.               raise NUMERIC_ERROR ;
  230.             end if ;
  231.           when others =>
  232.             I := 4 ;
  233.         end case ;
  234.       elsif I = 2 then
  235.         I := 4 ;
  236.       else
  237.         I := 3 ;
  238.       end if ;
  239.     end if ;
  240. end ALL_STATEMENTS_PACKAGE ;
  241.  
  242. with ALL_STATEMENTS_PACKAGE ;
  243.  
  244. procedure Z000021 ;
  245.  
  246. procedure ALL_STATEMENTS_PROCEDURE_2 ( I : INTEGER ;
  247.                                        J : INTEGER := 2 ) ;
  248. with ALL_STATEMENTS_PROCEDURE_2 ;
  249. with TEXT_IO ; use TEXT_IO ;
  250.  
  251. procedure Z000021 is
  252.   I : INTEGER := 2 ;
  253.  
  254.   procedure DEEP is separate ;
  255.  
  256.   function SEA return INTEGER is separate ;
  257.  
  258.   task FISH is
  259.   end FISH ;
  260.  
  261.   task body FISH is separate ;
  262.  
  263.   package BAG is
  264.  
  265.   end BAG ;
  266.  
  267.   package body BAG is separate ;
  268.  
  269. begin
  270.   ALL_STATEMENTS_PROCEDURE_2 ( J => 1 , I => 2 ) ;
  271.   BLOCK_NAME_1 :
  272.   begin
  273.     null ;
  274.   end BLOCK_NAME_1 ;
  275.   BLOCK_NAME_2 :
  276.   declare
  277.  
  278.     package INT_IO is new INTEGER_IO ( INTEGER ) ;
  279.  
  280.     use INT_IO ;
  281.     S : STRING ( 1 .. 4 ) ;
  282.   begin
  283.     NESTED_BLOCK_NAME :
  284.     declare
  285.  
  286.       package I_IO is new INTEGER_IO ( INTEGER ) ;
  287.  
  288.     begin
  289.       null ;
  290.     end NESTED_BLOCK_NAME ;
  291.     S := 'A' & "BC" & 'D' ;
  292.   exception
  293.     when CONSTRAINT_ERROR =>
  294.       PUT_LINE ( " ouch " ) ;
  295.       WHILE_NAME :
  296.       while S /= "----" loop
  297.         S := "-" & "--" & "-" ;
  298.       end loop WHILE_NAME ;
  299.   end BLOCK_NAME_2 ;
  300.   FOR_NAME :
  301.   for I in 1 .. 2 loop
  302.     null ;
  303.   end loop FOR_NAME ;
  304.   PUT_LINE ( " into LOOP_NAME_1 " ) ;
  305.   LOOP_NAME_1 :
  306.   loop
  307.     LOOP_NAME_2 :
  308.     loop
  309.       LOOP_NAME_3 :
  310.       for J in reverse 3 .. 4 loop
  311.         LOOP_NAME_4 :
  312.         loop
  313.           exit ;
  314.         end loop LOOP_NAME_4 ;
  315.         exit LOOP_NAME_2 ;
  316.       end loop LOOP_NAME_3 ;
  317.       exit when I = 3 ;
  318.     end loop LOOP_NAME_2 ;
  319.     exit LOOP_NAME_1 when I = 2 ;
  320.   end loop LOOP_NAME_1 ;
  321.   goto GOTO_LABEL ;
  322. << GOTO_LABEL >>
  323.   abort FISH ;
  324.   PUT_LINE ( " Z000021 finished " ) ;
  325. end Z000021 ;
  326.  
  327. function ALL_STATEMENTS_FUNCTION_1 return INTEGER ;
  328. with Z000021 ;
  329. generic
  330.   type FORMAL_TYPE_1 is private ;
  331.   type FORMAL_TYPE_2 is limited private ;
  332.   type FORMAL_TYPE_3 is ( <> ) ;
  333.   type FORMAL_TYPE_4 is range <> ;
  334.   type FORMAL_TYPE_5 is digits <> ;
  335.   type FORMAL_TYPE_6 is delta <> ;
  336.   type FORMAL_TYPE_7 is array ( FORMAL_TYPE_3 ) of FORMAL_TYPE_4 ;
  337.   type FORMAL_TYPE_8 is access FORMAL_TYPE_7 ;
  338.  
  339. -- the operator symblols on the next 3 functions are formal generic parameters
  340.   with function "+" ( DUMMY_1 , DUMMY_2 : FORMAL_TYPE_1 ) return FORMAL_TYPE_1
  341.      is <> ;
  342.   with function "+" ( DUMMY_1 , DUMMY_2 : FORMAL_TYPE_5 ) return FORMAL_TYPE_5
  343.      is "-" ;
  344.   with function "+" ( DUMMY_1 , DUMMY_2 : FORMAL_TYPE_1 ) return FORMAL_TYPE_6
  345.      ;
  346.   with procedure FORMAL_PROC_1 ( DUMMY_1 : out FORMAL_TYPE_4 ;
  347.                                  DUMMY_2 : in FORMAL_TYPE_6 ) is <> ;
  348.   with procedure FORMAL_PROC_2 is Z000021 ;
  349.   with procedure FORMAL_PROC_3 ( DUMMY_1 : out FORMAL_TYPE_4 ;
  350.                                  DUMMY_2 : in FORMAL_TYPE_5 ) ;
  351.  
  352. procedure ALL_STATEMENTS_GENPROC ( PARAM : in out FORMAL_TYPE_1 ) ;
  353.  
  354. procedure ALL_STATEMENTS_GENPROC ( PARAM : in out FORMAL_TYPE_1 ) is
  355.   A : FORMAL_TYPE_1 := PARAM ;
  356. begin
  357.   PARAM := PARAM + A ;
  358. end ALL_STATEMENTS_GENPROC ;
  359.  
  360. generic
  361.   type FORMAL_1 is private ;
  362.   with function "+" ( DUMMY_1 , DUMMY_2 : FORMAL_1 ) return FORMAL_1 is <> ;
  363.  
  364. function ALL_STATEMENTS_GENFUNC ( PARAM : FORMAL_1 ) return FORMAL_1 ;
  365.  
  366. function ALL_STATEMENTS_GENFUNC ( PARAM : FORMAL_1 ) return FORMAL_1 is
  367.   A : FORMAL_1 := PARAM ;
  368. begin
  369.   return PARAM + A ;
  370. end ALL_STATEMENTS_GENFUNC ;
  371.  
  372. generic
  373.  
  374. package ALL_STATEMENTS_GENPACK is
  375.  
  376. end ALL_STATEMENTS_GENPACK ;
  377.  
  378. package body ALL_STATEMENTS_GENPACK is
  379.  
  380. begin
  381.   null ;
  382. exception
  383.   when others =>
  384.     raise PROGRAM_ERROR ;
  385. end ALL_STATEMENTS_GENPACK ;
  386.  
  387. separate ( Z000021 )
  388.  
  389. procedure DEEP is
  390. begin
  391.   null ;
  392. exception
  393.   when others =>
  394.     null ;
  395. end DEEP ;
  396.  
  397. separate ( Z000021 )
  398.  
  399. function SEA return INTEGER is
  400. begin
  401.   return 1 ;
  402. end SEA ;
  403.  
  404. with ALL_STATEMENTS_GENFUNC ;
  405. with ALL_STATEMENTS_GENPACK , ALL_STATEMENTS_GENPROC ;
  406. separate ( Z000021 )
  407.  
  408. task body FISH is
  409.  
  410.   function INSTANTIATE_FUNCTION is new ALL_STATEMENTS_GENFUNC ( INTEGER , "-"
  411.      ) ;
  412.  
  413.   package INSTANTIATE_PACKAGE is new ALL_STATEMENTS_GENPACK ;
  414.  
  415.   use INSTANTIATE_PACKAGE ;
  416.   type BOOLEAN_ARRAY_OF_INTEGER is array ( BOOLEAN ) of INTEGER ;
  417.   type ACCESS_TO_ARRAY is access BOOLEAN_ARRAY_OF_INTEGER ;
  418.   subtype INT is INTEGER range 5 .. 7 ;
  419.   type FIX is delta 0.01 range - 1.0 .. 1.0 ;
  420.   MY_FIXED : FIX := FIX'LAST ;
  421. --  type FLT is digits 4 range - 0.01 .. 0.01 ;
  422.   subtype FLT is FLOAT range - 0.01 .. 0.01 ;
  423.  
  424.   procedure DUMMY_PROC ( A : out INT ;
  425.                          B : in FIX ) is
  426.   begin
  427.     A := INTEGER ( B ) ;
  428.   end DUMMY_PROC ;
  429.  
  430.   procedure DUMMY_PROC_2 ( A : out INT ;
  431.                            B : in FLT ) is
  432.   begin
  433.     A := INTEGER ( B ) ;
  434.   end DUMMY_PROC_2 ;
  435.  
  436.   function SUM ( LEFT , RIGHT : INTEGER ) return FIX ;
  437.  
  438.   procedure INSTANTIATE_PROCEDURE is new ALL_STATEMENTS_GENPROC ( INTEGER ,
  439.      INTEGER , BOOLEAN , INTEGER , FLOAT , FIX , BOOLEAN_ARRAY_OF_INTEGER ,
  440.      ACCESS_TO_ARRAY , "+" , "*" , SUM , DUMMY_PROC , FORMAL_PROC_3 =>
  441.      DUMMY_PROC_2 ) ;
  442.  
  443.   function SUM ( LEFT , RIGHT : INTEGER ) return FIX is
  444.   begin
  445.     return FIX ( LEFT ) + FIX ( RIGHT ) + FIX'FIRST ;
  446.   end SUM ;
  447. begin
  448.   PUT_LINE ( " gone fishing " ) ;
  449.   MY_FIXED := SUM ( 1 , -1 ) ;
  450.   PUT_LINE ( " end FISH " ) ;
  451. end FISH ;
  452.  
  453. separate ( Z000021 )
  454.  
  455. package body BAG is
  456.  
  457. -- someone was left holding an empty bag
  458. begin
  459.   PUT_LINE ( " in the bag " ) ;
  460. end BAG ;
  461.  
  462. with TEXT_IO ; use TEXT_IO ;
  463.  
  464. procedure ALL_STATEMENTS_PROCEDURE_2 ( I : INTEGER ;
  465.                                        J : INTEGER := 2 ) is
  466. begin
  467.   PUT_LINE ( " ALL_STATEMENTS_PROCEDURE_2 " ) ;
  468. end ALL_STATEMENTS_PROCEDURE_2 ;
  469.