home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / prog1 / ada-tutr.lzh / PRINT.ME < prev    next >
Text File  |  1988-12-21  |  87KB  |  1,963 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.                                      Welcome  to
  22.                                    A D A - T U T R
  23.                               The Interactive Ada Tutor
  24.                                by John J. Herro, Ph.D.
  25.                            Software Innovations Technology
  26.  
  27.                          These are the printed course notes.
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.                                Ver. 1.20, 21 Dec. 1988
  44.  
  45.                             Copyright 1988  John J. Herro
  46.  
  47.                            Software Innovations Technology
  48.                     1083 Mandarin Dr. NE, Palm Bay, FL 32905-4706
  49.                                     (407)951-0233
  50.  
  51.  
  52.                          You may make copies of these notes,
  53.                          in printed or machine-readable form.
  54.  
  55.                        You may also copy the computer program.
  56.                             Please see page 1 for details.
  57.  
  58.  
  59.                                                                       Page  i
  60.  
  61.                                  TABLE OF CONTENTS
  62.  
  63.  
  64.        Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   i
  65.        Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . .  ii
  66.        Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . .   1
  67.        Registration and Licenses - What is Shareware? . . . . . . . . . .   2
  68.        Before You Run ADA-TUTR on Your PC . . . . . . . . . . . . . . . .   3
  69.        The Ada Reserved Words . . . . . . . . . . . . . . . . . . . . . .   4
  70.        Steps for Outside Assignment 1, Preparing to Run Ada . . . . . . .   5
  71.        Listings of HELLO.ADA and ADD.ADA  . . . . . . . . . . . . . . . .   6
  72.        Listing of TRITEST.ADA . . . . . . . . . . . . . . . . . . . . . .   7
  73.        Steps for Outside Assignment 2, Exercise in Enumeration Types  . .   9
  74.        Listing of NEXTDATE.ADA  . . . . . . . . . . . . . . . . . . . . .  10
  75.        Steps for Outside Assignment 3, Exercise in Records  . . . . . . .  11
  76.        Listing of FIBTEST.ADA . . . . . . . . . . . . . . . . . . . . . .  12
  77.        Steps for Outside Assignment 4, Exercise in Recursion  . . . . . .  13
  78.        Simplified Specification for TEXT_IO . . . . . . . . . . . . . . .  14
  79.        Listings of Procedure FILECOPY and Function EXISTS . . . . . . . .  16
  80.        Requirements for the Program LEDIT . . . . . . . . . . . . . . . .  17
  81.        Steps for Outside Assignment 5, Writing a Simple Line Editor . . .  22
  82.        How to Test LEDIT  . . . . . . . . . . . . . . . . . . . . . . . .  23
  83.        Listing of LEDIT.ANS . . . . . . . . . . . . . . . . . . . . . . .  26
  84.        Listing of TASKING.DUM . . . . . . . . . . . . . . . . . . . . . .  30
  85.        Steps for Outside Assignment 6, Exercise in Tasking  . . . . . . .  31
  86.        Output from TASKING.EXE After Modification of TASKING.ADA  . . . .  32
  87.        Listing of TASKING.ANS . . . . . . . . . . . . . . . . . . . . . .  33
  88.  
  89.        Appendix A:  Special Offer to Companies, Schools, Etc. . . . . . .  34
  90.        Appendix B:  Note to Compiler Companies  . . . . . . . . . . . . .  35
  91.        Appendix C:  Some Ada Compilers Available for the PC . . . . . . .  36
  92.        Appendix D:  Do You Need a Screen Editor / Word Processor? . . . .  38
  93.        Appendix E:  Installing ADA-TUTR on Other Computers  . . . . . . .  39
  94.        Appendix F:  We Listen!  New Features of ADA-TUTR  . . . . . . . .  44
  95.        Appendix G:  Disclaimer of Warranty  . . . . . . . . . . . . . . .  45
  96.  
  97.                                                                       Page ii
  98.  
  99.                                   ACKNOWLEDGEMENTS
  100.  
  101.        The following trademarks are used in these notes and in the
  102.        accompanying files:
  103.  
  104.                AdaStarter       Meridian Software Systems, Inc.
  105.                AdaVantage       Meridian Software Systems, Inc.
  106.                Alsys Ada        Alsys, Inc.
  107.                IBM              International Business Machines Corp.
  108.                IntegrAda        Aetech, Inc.
  109.                Janus/Ada        R & R Software, Inc.
  110.                PC-Write         Quicksoft
  111.                TeleGen          Telesoft Corporation
  112.                Turbo Pascal     Borland International
  113.                UNIX             AT & T
  114.                VAX              Digital Equipment Corporation
  115.                VMS              Digital Equipment Corporation
  116.  
  117.        The file ONECHAR.C was sent to us by Mr. David Hill, 7549 Wynford
  118.        Street, Salt Lake City, UT 84121.  We're very grateful to Mr. Hill for
  119.        giving us permission to include it in ADA-TUTR.  This file, used with
  120.        UNIX.ADA, makes it possible to run the Tutor on UNIX based machines
  121.        without having to strike ENTER after each response.  See pages 39-43.
  122.  
  123.        The programs in this version of ADA-TUTR were compiled with Meridian
  124.        AdaStarter, and the .EXE files contain Meridian's runtime.
  125.  
  126.                                                                       Page  1
  127.  
  128.                                     INTRODUCTION
  129.  
  130.        ADA-TUTR, the Interactive Ada Tutor, will make you an excellent Ada
  131.        programmer in minimum time.  You'll learn good Ada program design
  132.        techniques, not just Ada syntax.  ADA-TUTR runs on PCs as well as
  133.        large mainframes.  On PCs an Ada compiler is helpful, but not
  134.        required.  The PC needs a hard disk, and can have a monochrome or a
  135.        color monitor.
  136.  
  137.        These printed notes aren't meant to be a complete course, or even a
  138.        summary, of Ada.  They merely accompany the program ADA-TUTR, which is
  139.        a complete course.  You can't "study" these printed notes alone.  For
  140.        now, just read through page 3.
  141.  
  142.        ADA-TUTR lets you learn at your own pace.  So that you don't feel
  143.        pressured, ADA-TUTR doesn't keep track of the number of right and
  144.        wrong answers.  It simply tells you whether your answers are correct,
  145.        and why.  Also, there's no time limit for answering the questions or
  146.        completing the Outside Assignments.
  147.  
  148.        Because I want every programmer to have a chance to learn the best
  149.        programming language, I made ADA-TUTR available very inexpensively as
  150.        Shareware.  Shareware isn't the same as public domain, and ADA-TUTR
  151.        isn't free.  But you may TRY it for free, and register or buy a
  152.        license only if you use it.  Please see pages 2 and 34 for details.
  153.  
  154.        Whether or not you use ADA-TUTR and register (or buy a license),
  155.        you're encouraged to make unmodified copies and give them away.
  156.        Please put ADA-TUTR on computer bulletin boards, distribute copies at
  157.        club meetings, give them to companies, etc.  You may charge a small
  158.        fee to copy the program, provided you make it clear that the fee is
  159.        only for the copy, and doesn't pay for the Shareware.  (Companies that
  160.        copy Shareware usually charge about $2 to $10 per diskette.)  Bulletin
  161.        boards may carry ADA-TUTR even if they charge for access.  Please
  162.        contact us for permission to include ADA-TUTR with commercial
  163.        products, such as Ada compilers (see page 35).  You may use file
  164.        compression, library, and archive programs on ADA-TUTR; we won't
  165.        interpret that as "modifying" the program.  You may also add your own
  166.        files.  (The files included with ADA-TUTR are briefly described in
  167.        ED.DIR.)  If you register, you can earn substantial money distributing
  168.        ADA-TUTR; please see page 2 for details.
  169.  
  170.        Ada will become more and more important, since the Department of
  171.        Defense mandated its use in mission-critical systems, and is now
  172.        making it very hard to obtain waivers.  Although learning Ada takes
  173.        real effort, you'll be able to write software that's more reliable
  174.        and easier to modify a month or a year later.
  175.  
  176.        New features of this version of ADA-TUTR are described on page 44.
  177.        Please send me your comments and suggestions.  I wish you success
  178.        using ADA-TUTR!
  179.  
  180.        John J. Herro, Ph.D., Software Innovations Technology
  181.        1083 Mandarin Drive NE, Palm Bay, FL 32905-4706   (407)951-0233
  182.  
  183.                                                                       Page  2
  184.  
  185.                    REGISTRATION AND LICENSES - WHAT IS SHAREWARE?
  186.  
  187.        Shareware is a way of marketing a program.  It lets you try the
  188.        program before spending money for it.  If you decide to use the
  189.        program, you send a small payment to register your copy or buy a
  190.        license.  We give you several incentives to do so, explained below.
  191.        You're on your honor; you know whether you're "using" ADA-TUTR or
  192.        only "trying" it.
  193.  
  194.        To use ADA-TUTR, individuals register as described below.  Companies,
  195.        schools, and other organizations can register each individual who
  196.        uses the program, or buy a Multi-User License as described on page 34.
  197.  
  198.        INDIVIDUALS:  Register your copy for only $25.  When you register,
  199.        please give us the serial number from the ADA-TUTR opening screen.
  200.        We'll assign you a new serial number.  Then run CHANGESN to put your
  201.        new number into the program, and give copies to individuals, schools,
  202.        companies, clubs, computer bulletin boards, etc.  We'll send you a
  203.        commission of $5 for each individual who registers from one of your
  204.        copies, and TEN PERCENT for each Multi-User License sold from one of
  205.        your copies!  As you can see from page 34, you can earn up to $240 per
  206.        license sold!  Commissions are paid quarterly.  If you like, print the
  207.        file AD.TXT and use copies as an advertisement.
  208.  
  209.        Registration includes the right to use ADA-TUTR as long as you like,
  210.        and it includes technical support for one year.  While you have
  211.        technical support, we'll inform you of any important updates to
  212.        ADA-TUTR, and send you updated copies for only $5 each ($10 if you
  213.        prefer a 3.5" diskette, free if you send us a blank, formatted, 360K
  214.        5.25" diskette or 720K 3.5" diskette with a stamped, addressed
  215.        diskette mailer).  We're planning a major update of ADA-TUTR with the
  216.        next revision (9X) of the Ada language.  You can renew technical
  217.        support for only $10 a year.  Even if you don't renew, you'll continue
  218.        to receive commissions.
  219.  
  220.        When you register, you may order the current version of ADA-TUTR, with
  221.        your serial number.  The price is $5 for a 5.25" diskette, $10 for a
  222.        3.5" diskette, or free with your formatted diskette and a stamped,
  223.        addressed diskette mailer.  If you would like an order form or a price
  224.        list, please print the file INVOICE.TXT.
  225.  
  226.        We offer a Customization Kit that lets you edit, add, and delete
  227.        ADA-TUTR screens, questions, etc. (even whole topics), producing a new
  228.        ADA-TUTR.DAT file.  Please see page 34 for details.  Note that the
  229.        Customization Kit is not Shareware.
  230.  
  231.        We sell anywhere in the Free World.  Outside the U.S., please remit in
  232.        U.S. funds and contact us about extra postal charges on diskettes.
  233.  
  234.  
  235.        COMPANIES, SCHOOLS, AND OTHER ORGANIZATIONS:  Please see our special
  236.        offer for Multi-User Licenses, on page 34.
  237.  
  238.                                                                       Page  3
  239.  
  240.                          BEFORE YOU RUN ADA-TUTR ON YOUR PC
  241.  
  242.        Give the command TYPE READ.ME on your PC.  If one word appears
  243.        brighter than the rest, you can skip this page.  However, if your
  244.        screen shows strange characters like "[1m", you need to read this.
  245.  
  246.        ADA-TUTR uses ANSI (American National Standards Institute) escape
  247.        sequences for highlighting, cursor positioning, reverse video, etc.
  248.        Before ADA-TUTR will work correctly on a PC, you must install the
  249.        device driver ANSI.SYS.  To install ANSI.SYS, do the following:
  250.  
  251.        1.  If there's a file CONFIG.SYS in the root directory of the disk
  252.            from which you boot, type it and look for a line saying
  253.            "DEVICE=ANSI.SYS" (without the quotes), in either upper or lower
  254.            case.  If that line is not present, add it to CONFIG.SYS anywhere
  255.            in the file, using an ordinary text editor or word processor in
  256.            the non-document mode.  If there's no CONFIG.SYS file, create one
  257.            containing the single line "DEVICE=ANSI.SYS" (without the quotes).
  258.  
  259.        2.  If there's no file ANSI.SYS in your root directory, copy ANSI.SYS
  260.            from from your system distribution diskette to the root directory
  261.            of the disk from which you boot.
  262.  
  263.        3.  Reboot the computer.  ADA-TUTR should then work correctly.
  264.  
  265.                                                                       Page  4
  266.  
  267.                               THE ADA RESERVED WORDS
  268.  
  269.        The 63 reserved words are listed in the Language Reference Manual in
  270.        section 2.9, and are repeated here for convenience.
  271.  
  272.          abort         declare        generic      of             select
  273.          abs           delay          goto         or             separate
  274.          accept        delta                       others         subtype
  275.          access        digits         if           out
  276.          all           do             in                          task
  277.          and                          is           package        terminate
  278.          array                                     pragma         then
  279.          at            else                        private        type
  280.                        elsif          limited      procedure
  281.                        end            loop
  282.          begin         entry                       raise          use
  283.          body          exception                   range
  284.                        exit           mod          record         when
  285.                                                    rem            while
  286.                                       new          renames        with
  287.          case          for            not          return
  288.          constant      function       null         reverse        xor
  289.  
  290.                                                                       Page  5
  291.  
  292.                 STEPS FOR OUTSIDE ASSIGNMENT 1, PREPARING TO RUN ADA
  293.  
  294.        For the first Outside Assignment, learn enough about your Ada compiler
  295.        to compile and run the two simple programs HELLO.ADA and ADD.ADA.
  296.        Obviously, you have to do this before you can do the remaining Outside
  297.        Assignments.
  298.  
  299.        1.  Compile HELLO.ADA.  On most systems, after the Ada compiler is
  300.        installed and your library is created, this only involves typing
  301.        ADA HELLO or ADA HELLO.ADA.  On some systems, the compiler is invoked
  302.        from a menu or "APSE" (Ada Programming Support Environment).
  303.  
  304.        2.  Link, giving the name of the main program, HELLO.  This usually
  305.        involves typing LINK HELLO or BIND HELLO, perhaps with some options.
  306.        On one system, the command is BAMP HELLO, for Build Ada Main Program!
  307.  
  308.        3.  Run the program.  If your Ada compiler produces native code on a
  309.        PC, it created a file HELLO.EXE, and this step simply involves typing
  310.        HELLO.  On other systems, the command RUN HELLO is appropriate.  On
  311.        some systems, you have to invoke an interpreter to run the program.
  312.  
  313.        4.  Now compile, link, and run ADD.ADA.
  314.  
  315.        If your compiler implements a subset of Ada, you may have to modify
  316.        the programs in this and later Outside Assignments to get them to
  317.        compile.  Some compilers don't allow "separate" compilation (used in
  318.        later assignments), and you'll have to include the "separate"
  319.        subprograms inside the main program and compile them as one.  Some
  320.        compilers don't allow generic instantiation, and have another way of
  321.        displaying integers.  In that case, you'll have to modify ADD.ADA.  If
  322.        you're using a validated compiler, you won't have to worry about any
  323.        of this, because all of the Outside Assignments are written in
  324.        standard Ada.
  325.  
  326.                                                                       Page  6
  327.  
  328.        HELLO.ADA
  329.        ---------
  330.  
  331.        with TEXT_IO; use TEXT_IO;
  332.        procedure HELLO is
  333.        begin
  334.           PUT_LINE("Hello!");
  335.        end HELLO;
  336.  
  337.  
  338.  
  339.        ADD.ADA
  340.        -------
  341.  
  342.        with TEXT_IO; use TEXT_IO;
  343.        procedure ADD is
  344.           package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  345.        begin
  346.           PUT(2 + 2);
  347.           NEW_LINE;
  348.        end ADD;
  349.  
  350.                                                                       Page 7
  351.  
  352.        TRITEST.ADA
  353.        -----------
  354.  
  355.        with TEXT_IO; use TEXT_IO;
  356.        procedure TRITEST is
  357.           PASSED : BOOLEAN := TRUE;
  358.           type TRIANGLE is (EQUILATERAL, ISOSCELES, SCALENE, NOT_A_TRIANGLE);
  359.           function TRITYPE(LEN1, LEN2, LEN3 : in INTEGER) return TRIANGLE
  360.                                                                  is separate;
  361.           procedure COMPARE(A, B, C: in INTEGER; RIGHT_ANSWER : in TRIANGLE)
  362.                                                                  is separate;
  363.        begin
  364.           COMPARE( 3,  4,  5, SCALENE);
  365.           COMPARE( 6,  3,  4, SCALENE);
  366.           COMPARE( 4,  3,  6, SCALENE);
  367.           COMPARE( 3,  3,  3, EQUILATERAL);
  368.           COMPARE( 3,  3,  4, ISOSCELES);
  369.           COMPARE( 3,  4,  3, ISOSCELES);
  370.           COMPARE( 4,  3,  3, ISOSCELES);
  371.           COMPARE( 7,  7,  4, ISOSCELES);
  372.           COMPARE( 7,  4,  7, ISOSCELES);
  373.           COMPARE( 4,  7,  7, ISOSCELES);
  374.           COMPARE( 1,  1,  1, EQUILATERAL);
  375.           COMPARE( 0,  4,  4, NOT_A_TRIANGLE);
  376.           COMPARE( 4,  0,  4, NOT_A_TRIANGLE);
  377.           COMPARE( 4,  4,  0, NOT_A_TRIANGLE);
  378.           COMPARE( 0,  4,  3, NOT_A_TRIANGLE);
  379.           COMPARE( 3,  0,  4, NOT_A_TRIANGLE);
  380.           COMPARE( 4,  3,  0, NOT_A_TRIANGLE);
  381.           COMPARE(-1,  4,  4, NOT_A_TRIANGLE);
  382.           COMPARE( 4, -1,  4, NOT_A_TRIANGLE);
  383.           COMPARE( 4,  4, -1, NOT_A_TRIANGLE);
  384.           COMPARE(-1,  4,  3, NOT_A_TRIANGLE);
  385.           COMPARE( 3, -1,  4, NOT_A_TRIANGLE);
  386.           COMPARE( 4,  3, -1, NOT_A_TRIANGLE);
  387.           COMPARE( 2,  4,  6, NOT_A_TRIANGLE);
  388.           COMPARE( 1,  3,  2, NOT_A_TRIANGLE);
  389.           COMPARE( 3,  1,  2, NOT_A_TRIANGLE);
  390.           COMPARE( 1,  2,  4, NOT_A_TRIANGLE);
  391.           COMPARE( 1,  4,  2, NOT_A_TRIANGLE);
  392.           COMPARE( 4,  1,  2, NOT_A_TRIANGLE);
  393.           COMPARE( 0,  0,  0, NOT_A_TRIANGLE);
  394.           COMPARE( 0,  0,  4, NOT_A_TRIANGLE);
  395.           COMPARE( 0,  4,  0, NOT_A_TRIANGLE);
  396.           COMPARE( 4,  0,  0, NOT_A_TRIANGLE);
  397.           COMPARE( 3,  3,  7, NOT_A_TRIANGLE);
  398.           COMPARE( 3,  7,  3, NOT_A_TRIANGLE);
  399.           COMPARE( 6,  3,  3, NOT_A_TRIANGLE);
  400.           COMPARE(-3, -4, -5, NOT_A_TRIANGLE);
  401.           if PASSED then
  402.              PUT_LINE("Congratulations, you completed the assignment!");
  403.           end if;
  404.        end TRITEST;
  405.                                   -- continued --
  406.  
  407.                                                                       Page  8
  408.  
  409.        separate(TRITEST)
  410.        procedure COMPARE(A, B, C: in INTEGER; RIGHT_ANSWER : in TRIANGLE) is
  411.           package INT_IO is new INTEGER_IO(INTEGER); use INT_IO;
  412.           package TRI_IO is new ENUMERATION_IO(TRIANGLE); use TRI_IO;
  413.           MY_ANSWER : TRIANGLE := TRITYPE(A, B, C);
  414.        begin
  415.           if MY_ANSWER /= RIGHT_ANSWER then
  416.              PUT("Sides:");
  417.              PUT(A, WIDTH => 3);
  418.              PUT(B, WIDTH => 3);
  419.              PUT(C, WIDTH => 3);
  420.              PUT("   My answer: ");
  421.              PUT(MY_ANSWER, WIDTH => 14);
  422.              PUT("   Right answer: ");
  423.              PUT(RIGHT_ANSWER);
  424.              NEW_LINE;
  425.              PASSED := FALSE;
  426.           end if;
  427.        end COMPARE;
  428.  
  429.                                                                       Page  9
  430.  
  431.            STEPS FOR OUTSIDE ASSIGNMENT 2, EXERCISE IN ENUMERATION TYPES
  432.  
  433.        1.  Compile the test driver TRITEST.ADA.  Also, make a copy of the
  434.            dummy solution by typing COPY TRITYPE.DUM TRITYPE.ADA.  You need
  435.            do this step only once.
  436.  
  437.        2.  Edit TRITYPE.ADA to become your real solution.  You can skip this
  438.            step the first time through, to see error messages from the test
  439.            driver.
  440.  
  441.        3.  Compile your solution TRITYPE.ADA.  If there are compiler errors,
  442.            go back to step 2.
  443.  
  444.        4.  Link with the name of the main program TRITEST.  Then execute.  If
  445.            the test driver prints error messages, go back to step 2.
  446.  
  447.        5.  When the message "Congratulations, you completed the assignment!"
  448.            is printed, you'll have a chance to compare your solution with
  449.            ours.
  450.  
  451.                                                                       Page 10
  452.  
  453.        NEXTDATE.ADA
  454.        ------------
  455.  
  456.        with TEXT_IO; use TEXT_IO;
  457.        procedure NEXTDATE is
  458.           type MONTH_TYPE is
  459.              (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC);
  460.           subtype DAY_SUBTYPE is INTEGER range 1 .. 31;
  461.           type DATE is
  462.              record
  463.                 DAY   : DAY_SUBTYPE;
  464.                 MONTH : MONTH_TYPE;
  465.                 YEAR  : POSITIVE;
  466.              end record;
  467.           PASSED : BOOLEAN := TRUE;
  468.           function TOMORROW(TODAY : in DATE) return DATE is separate;
  469.  
  470.           procedure DISPLAY (S : in STRING; D : in DATE) is
  471.              package INT_IO is new INTEGER_IO(INTEGER); use INT_IO;
  472.           begin
  473.              PUT(S);
  474.              PUT(D.DAY, WIDTH => 3);
  475.              PUT(" " & MONTH_TYPE'IMAGE(D.MONTH));
  476.              PUT(D.YEAR, WIDTH => 5);
  477.              NEW_LINE;
  478.           end DISPLAY;
  479.           procedure COMPARE(TODAY, RIGHT_ANSWER : in DATE) is
  480.              MY_ANSWER : DATE := TOMORROW(TODAY);
  481.           begin
  482.              if MY_ANSWER /= RIGHT_ANSWER then
  483.                 DISPLAY("Today:       ", TODAY);
  484.                 DISPLAY("My answer:   ", MY_ANSWER);
  485.                 DISPLAY("Right answer:", RIGHT_ANSWER);
  486.                 NEW_LINE;
  487.                 PASSED := FALSE;
  488.              end if;
  489.           end COMPARE;
  490.        begin
  491.           COMPARE((12,DEC,1815), (13,DEC,1815)); -- ordinary date
  492.           COMPARE(( 3,FEB,1986), ( 4,FEB,1986)); -- ordinary date in Feb.
  493.           COMPARE((30,JUN,1981), ( 1,JUL,1981)); -- last day of 30-day month
  494.           COMPARE((30,SEP,3999), ( 1,OCT,3999)); -- last day of 30-day month
  495.           COMPARE((31,MAR,1876), ( 1,APR,1876)); -- last day of 31-day month
  496.           COMPARE((31,AUG,1984), ( 1,SEP,1984)); -- last day of 31-day month
  497.           COMPARE((31,DEC,1966), ( 1,JAN,1967)); -- last day of year
  498.           COMPARE((28,FEB,1980), (29,FEB,1980)); -- leap year
  499.           COMPARE((28,FEB,1600), (29,FEB,1600)); -- century leap year
  500.           COMPARE((28,FEB,2200), ( 1,MAR,2200)); -- century non-leap year
  501.           COMPARE((28,FEB,1982), ( 1,MAR,1982)); -- non-leap year
  502.           COMPARE((29,FEB,1980), ( 1,MAR,1980)); -- leap day in leap year
  503.           if PASSED then
  504.              PUT_LINE("Congratulations, you completed the assignment!");
  505.           end if;
  506.        end NEXTDATE;
  507.  
  508.                                                                       Page 11
  509.  
  510.                 STEPS FOR OUTSIDE ASSIGNMENT 3, EXERCISE IN RECORDS
  511.  
  512.        1.  Compile the test driver NEXTDATE.ADA.  Also, make a copy of the
  513.            dummy solution by typing COPY TOMORROW.DUM TOMORROW.ADA.  You need
  514.            do this step only once.
  515.  
  516.        2.  Edit TOMORROW.ADA to become your real solution.  You can skip this
  517.            step the first time through, to see error messages from the test
  518.            driver.
  519.  
  520.        3.  Compile TOMORROW.ADA.  If there are compiler errors, go back to
  521.            step 2.
  522.  
  523.        4.  Link with the name of the main program NEXTDATE.  Then execute.
  524.            If the test driver prints error messages, go back to step 2.
  525.  
  526.        5.  When the message "Congratulations, you completed the assignment!"
  527.            is printed, you'll have a chance to compare your solution with
  528.            ours.
  529.  
  530.                                                                       Page 12
  531.  
  532.        FIBTEST.ADA
  533.        -----------
  534.  
  535.        with TEXT_IO; use TEXT_IO;
  536.        procedure FIBTEST is
  537.           PASSED : BOOLEAN := TRUE;
  538.           function FIB(N : in POSITIVE) return POSITIVE is separate;
  539.           procedure COMPARE (N : in POSITIVE; RIGHT_ANSWER : in POSITIVE) is
  540.              package INT_IO is new INTEGER_IO(INTEGER); use INT_IO;
  541.              MY_ANSWER : POSITIVE := FIB(N);
  542.           begin
  543.              if MY_ANSWER /= RIGHT_ANSWER then
  544.                 PUT("N:");  PUT(N);
  545.                 PUT("          My answer:");  PUT(MY_ANSWER);
  546.                 PUT("          Right answer:");  PUT(RIGHT_ANSWER);
  547.                 NEW_LINE;
  548.                 PASSED := FALSE;
  549.              end if;
  550.           end COMPARE;
  551.        begin
  552.           COMPARE(1,1);
  553.           COMPARE(2,1);
  554.           COMPARE(3,2);
  555.           COMPARE(4,3);
  556.           COMPARE(5,5);
  557.           COMPARE(6,8);
  558.           COMPARE(7,13);
  559.           COMPARE(10,55);
  560.           COMPARE(15,610);
  561.           COMPARE(20,6765);
  562.           if PASSED then
  563.              PUT_LINE("Congratulations, you completed the assignment!");
  564.           end if;
  565.        end FIBTEST;
  566.  
  567.                                                                       Page 13
  568.  
  569.                STEPS FOR OUTSIDE ASSIGNMENT 4, EXERCISE IN RECURSION
  570.  
  571.        1.  Compile the test driver FIBTEST.ADA.  Also, make a copy of the
  572.            dummy solution by typing COPY FIB.DUM FIB.ADA.  You need do this
  573.            step only once.
  574.  
  575.        2.  Edit FIB.ADA to become your real solution.  You can skip this step
  576.            the first time through, to see error messages from the test
  577.            driver.
  578.  
  579.        3.  Compile FIB.ADA.  If there are compiler errors, go back to step 2.
  580.  
  581.        4.  Link with the name of the main program FIBTEST.  Then execute.  If
  582.            the test driver prints error messages, go back to step 2.
  583.  
  584.        5.  When the message "Congratulations, you completed the assignment!"
  585.            is printed, you'll have a chance to compare your solution with
  586.            ours.
  587.  
  588.                                                                       Page 14
  589.  
  590.        SIMPLIFIED SPECIFICATION FOR TEXT_IO
  591.        ------------------------------------
  592.  
  593.        package TEXT_IO is
  594.           type FILE_TYPE is limited private;
  595.  
  596.           type FILE_MODE is (IN_FILE, OUT_FILE);
  597.           type COUNT is ... (a user-defined type similar to INTEGER);
  598.           STATUS_ERROR, MODE_ERROR, NAME_ERROR, END_ERROR : exception;
  599.  
  600.           procedure CREATE      (FILE : in out FILE_TYPE;
  601.                                  MODE : in FILE_MODE := OUT_FILE;
  602.                                  NAME : in STRING);
  603.  
  604.           procedure OPEN        (FILE : in out FILE_TYPE;
  605.                                  MODE : in FILE_MODE;
  606.                                  NAME : in STRING);
  607.  
  608.           procedure CLOSE       (FILE : in out FILE_TYPE);
  609.           procedure DELETE      (FILE : in out FILE_TYPE);
  610.           procedure NEW_LINE    (SPACING : in COUNT := 1);
  611.           procedure NEW_LINE    (FILE : in FILE_TYPE;
  612.                                  SPACING : in COUNT := 1);
  613.           procedure SKIP_LINE   (SPACING : in COUNT := 1);
  614.           procedure SKIP_LINE   (FILE : in FILE_TYPE;
  615.                                  SPACING : in COUNT := 1);
  616.           function  END_OF_FILE (FILE : in FILE_TYPE) return BOOLEAN;
  617.           procedure PUT         (ITEM : in CHARACTER);
  618.           procedure PUT         (FILE : in FILE_TYPE; ITEM : in CHARACTER);
  619.           procedure GET         (ITEM : out CHARACTER);
  620.           procedure GET         (FILE : in FILE_TYPE; ITEM : out CHARACTER);
  621.           procedure PUT         (ITEM : in STRING);
  622.           procedure PUT         (FILE : in FILE_TYPE; ITEM : in STRING);
  623.           procedure PUT_LINE    (ITEM : in STRING);
  624.           procedure PUT_LINE    (FILE : in FILE_TYPE; ITEM : in STRING);
  625.           procedure GET_LINE    (ITEM : out STRING; LAST : out NATURAL);
  626.           procedure GET_LINE    (FILE : in FILE_TYPE;
  627.                                  ITEM : out STRING;
  628.                                  LAST : out NATURAL);
  629.           generic
  630.              type NUM is range <>;
  631.           package INTEGER_IO is
  632.              procedure GET (ITEM : out NUM);
  633.              procedure GET (FILE : in FILE_TYPE; ITEM : out NUM);
  634.              procedure PUT (ITEM  : in NUM;
  635.                             WIDTH : in INTEGER := ...;
  636.                             BASE  : in INTEGER := 10);
  637.              procedure PUT (FILE  : in FILE_TYPE;
  638.                             ITEM  : in NUM;
  639.                             WIDTH : in INTEGER := ...;
  640.                             BASE  : in INTEGER := 10);
  641.           end INTEGER_IO;
  642.  
  643.                                   -- continued --
  644.  
  645.                                                                       Page 15
  646.  
  647.           generic
  648.              type NUM is digits <>;
  649.           package FLOAT_IO is
  650.              procedure GET (ITEM : out NUM);
  651.              procedure GET (FILE : in FILE_TYPE; ITEM : out NUM);
  652.              procedure PUT (ITEM : in NUM;
  653.                             FORE : in INTEGER := 2;
  654.                             AFT  : in INTEGER := ...;
  655.                             EXP  : in INTEGER := 3);
  656.              procedure PUT (FILE : in FILE_TYPE;
  657.                             ITEM : in NUM;
  658.                             FORE : in INTEGER := 2;
  659.                             AFT  : in INTEGER := ...;
  660.                             EXP  : in INTEGER := 3);
  661.           end FLOAT_IO;
  662.  
  663.           generic
  664.              type ENUM is (<>);
  665.           package ENUMERATION_IO is
  666.              procedure GET (ITEM : out ENUM);
  667.              procedure GET (FILE : in FILE_TYPE; ITEM : out ENUM);
  668.              procedure PUT (ITEM : in ENUM; WIDTH : in INTEGER := 0);
  669.              procedure PUT (FILE : in FILE_TYPE;
  670.                             ITEM : in ENUM; WIDTH : in INTEGER := 0);
  671.           end ENUMERATION_IO;
  672.  
  673.        private
  674.  
  675.           type FILE_TYPE is ... (implementation dependent);
  676.  
  677.        end TEXT_IO;
  678.  
  679.                                                                       Page 16
  680.  
  681.        Program to copy a simple text file:
  682.        -----------------------------------
  683.  
  684.        with TEXT_IO; use TEXT_IO;
  685.        procedure FILECOPY is
  686.           F1, F2 : FILE_TYPE;
  687.           S      : STRING(1 .. 80);
  688.           LEN    : INTEGER;
  689.        begin
  690.           PUT("Input file: ");  GET_LINE(S, LEN);
  691.           OPEN(FILE => F1, MODE => IN_FILE, NAME => S(1 .. LEN));
  692.           PUT("Output file: ");  GET_LINE(S, LEN);
  693.           CREATE(FILE => F2, MODE => OUT_FILE, NAME => S(1 .. LEN));
  694.           while not END_OF_FILE(F1) loop
  695.              GET_LINE(F1, S, LEN);
  696.              PUT_LINE(F2, S(1 .. LEN));
  697.           end loop;
  698.           CLOSE(F1);
  699.           CLOSE(F2);
  700.        end FILECOPY;
  701.  
  702.  
  703.  
  704.        Function to test if a text file exists:
  705.        ---------------------------------------
  706.  
  707.        with TEXT_IO; use TEXT_IO;
  708.        function EXISTS(FILE_NAME : in STRING) return BOOLEAN is
  709.           F      : FILE_TYPE;
  710.           ANSWER : BOOLEAN := TRUE;
  711.        begin
  712.           begin
  713.              OPEN(F, IN_FILE, FILE_NAME);
  714.              CLOSE(F);
  715.           exception
  716.              when NAME_ERROR => ANSWER := FALSE;
  717.           end;
  718.           return ANSWER;
  719.        end EXISTS;
  720.  
  721.                                                                       Page 17
  722.  
  723.                         REQUIREMENTS FOR THE PROGRAM LEDIT
  724.  
  725.        This assignment will give you practice in writing a program of greater
  726.        complexity than the previous programs you've written.  Imagine that
  727.        your screen editor is unavailable to a particular user, perhaps
  728.        because he's dialing your computer from a remote location, and your
  729.        screen editor writes directly to the screen.  You want to write a very
  730.        simple line editor, LEDIT, that could be used in such circumstances.
  731.        While your computer already has a line editor called EDLIN, it's
  732.        difficult to learn to use.  LEDIT will take almost no effort to learn.
  733.        The only commands are LIST and EXIT!  The line editor edits by means
  734.        of line numbers, similar to the Basic language.
  735.  
  736.        The user begins each line of text that he types with a line number
  737.        from 1 to 29999.  Line numbers must be integers.  The upper limit
  738.        29999 was chosen so that the simple type INTEGER could be used - in
  739.        any implementation of Ada.   Regardless of the order in which lines
  740.        are typed, LEDIT maintains a linked list of lines in order by number.
  741.        Also, line numbers may be preceded by any number of spaces.  For
  742.        example, if the user types
  743.  
  744.        40 -- This is a comment.
  745.           20 begin
  746.        10 with TEXT_IO; use TEXT_IO;
  747.              30 end ADD;
  748.  
  749.        and then types LIST, the editor will type
  750.  
  751.           10 with TEXT_IO; use TEXT_IO;
  752.           20 begin
  753.           30 end ADD;
  754.           40 -- This is a comment.
  755.  
  756.        To INSERT lines, the user merely types lines with intermediate line
  757.        numbers.  For example, if he types
  758.  
  759.        15 procedure HELLO is
  760.  
  761.        and then types LIST, LEDIT will type
  762.  
  763.           10 with TEXT_IO; use TEXT_IO;
  764.           15 procedure HELLO is
  765.           20 begin
  766.           30 end ADD;
  767.           40 -- This is a comment.
  768.  
  769.        To REPLACE an existing line, the user merely types a line with the
  770.        same line number as the line to be replaced.  For example, if he typed
  771.  
  772.        15 procedure ADD is
  773.        LIST
  774.  
  775.  
  776.                                   -- continued --
  777.  
  778.                                                                       Page 18
  779.  
  780.        LEDIT would then show
  781.  
  782.           10 with TEXT_IO; use TEXT_IO;
  783.           15 procedure ADD is
  784.           20 begin
  785.           30 end ADD;
  786.           40 -- This is a comment.
  787.  
  788.        Finally, to DELETE a line, the user merely types the number of the
  789.        line to be deleted, followed immediately by a carriage return.  Typing
  790.  
  791.        40
  792.        LIST
  793.  
  794.        would then produce
  795.  
  796.           10 with TEXT_IO; use TEXT_IO;
  797.           15 procedure ADD is
  798.           20 begin
  799.           30 end ADD;
  800.  
  801.        Thus the user can INSERT, REPLACE, and DELETE lines, all by line
  802.        numbers, without learning any commands.  Note that in this simple
  803.        editor there is no "cursor" or "current line."
  804.  
  805.        The space is not required after the line number.  These two lines have
  806.        exactly the same effect:
  807.  
  808.        20 begin
  809.        20begin
  810.  
  811.        Of course, if the text of the line begins with a digit, a space will
  812.        be required to separate it from the line number.  In any event, LEDIT
  813.        always leaves one blank space after the line number when LISTing, for
  814.        readability.  It always allows exactly five spaces for the line number
  815.        itself.
  816.  
  817.        However, any EXTRA spaces typed after the line number are significant.
  818.        The three lines below each contain three EXTRA spaces after the line
  819.        number, for a total of four spaces.
  820.  
  821.        24    PUT(2 + 2);
  822.        26    NEW_LINE;
  823.        18    package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  824.  
  825.        They have the effect of indenting the text three spaces.  LIST now
  826.        shows
  827.  
  828.  
  829.                                   -- continued --
  830.  
  831.                                                                       Page 19
  832.  
  833.           10 with TEXT_IO; use TEXT_IO;
  834.           15 procedure ADD is
  835.           18    package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  836.           20 begin
  837.           24    PUT(2 + 2);
  838.           26    NEW_LINE;
  839.           30 end ADD;
  840.  
  841.        Although typing a line number followed immediately by a carriage
  842.        return deletes a line (if there is a line by that number), typing a
  843.        line number followed by a single space causes an empty line to be
  844.        introduced into the file.  For example, typing 12 followed by a single
  845.        space and a carriage return would then cause LIST to type
  846.  
  847.           10 with TEXT_IO; use TEXT_IO;
  848.           12
  849.           15 procedure ADD is
  850.           18    package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  851.           20 begin
  852.           24    PUT(2 + 2);
  853.           26    NEW_LINE;
  854.           30 end ADD;
  855.  
  856.        When LEDIT is run, it prompts for the names of the input and output
  857.        files.  If the input file exists, LEDIT prints "File found" and reads
  858.        the file into its linked list, assigning line numbers starting with 10
  859.        and incrementing by 10.  If the file does not exist, LEDIT prints
  860.        "File not found," and the linked list is initially empty.  In any
  861.        event, LEDIT creates an output file.  When the EXIT command is given,
  862.        LEDIT writes the contents of the linked list to the output file.  In
  863.        doing so, LEDIT removes the line numbers and the first blank after
  864.        each line number.
  865.  
  866.        In the example above, let us assume that the user typed ADD.ADA for an
  867.        output file name.  When he types EXIT, the new file ADD.ADA created by
  868.        LEDIT will contain:
  869.  
  870.        with TEXT_IO; use TEXT_IO;
  871.  
  872.        procedure ADD is
  873.           package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  874.        begin
  875.           PUT(2 + 2);
  876.           NEW_LINE;
  877.        end ADD;
  878.  
  879.        (Note that the file contains one empty line.)  Your program is not
  880.        allowed to add any trailing blanks of its own in the output file.  If
  881.        the user again runs LEDIT and specifies ADD.ADA as an input file, the
  882.        editor will type "File found" and read the file.  LIST will show
  883.  
  884.  
  885.                                   -- continued --
  886.  
  887.                                                                       Page 20
  888.  
  889.           10 with TEXT_IO; use TEXT_IO;
  890.           20
  891.           30 procedure ADD is
  892.           40    package MY_INT_IO is new INTEGER_IO(INTEGER); use MY_INT_IO;
  893.           50 begin
  894.           60    PUT(2 + 2);
  895.           70    NEW_LINE;
  896.           80 end ADD;
  897.  
  898.        When he EXITs, the new file will contain modified text.  The old file
  899.        will still be present until it is deleted.
  900.  
  901.        The two commands LIST and EXIT must be accepted in either upper or
  902.        lower case, but for simplicity, they need not be accepted in a mixture
  903.        of cases.  They may be preceded by any number of spaces.  The LIST
  904.        command must be accepted in any of the following forms:
  905.  
  906.        LIST            (Lists all lines, if any, otherwise does nothing.)
  907.        list 30         (Lists line 30, if it exists.)
  908.        list 25 - 35    (Lists all lines between 25 and 35 inclusive, if any.)
  909.        LIST - 35       (Lists all lines numbered 35 or less, if any.)
  910.        list 25 -       (Lists all lines numbered 25 or more, if any.)
  911.  
  912.        Furthermore, all spaces are optional in the LIST command provided that
  913.        LIST is written solid, so that LIST25-35 is equivalent to the third
  914.        example above.  Any other forms of LIST should be flagged as an error.
  915.        In particular, all of these should give error messages:
  916.  
  917.        LIST -
  918.        list 2A
  919.        LIST 30 - 50 -
  920.        list 30 - -50
  921.        list 30-A
  922.        LIST XYZ
  923.  
  924.        The EXIT command must stand alone; unlike LIST, EXIT is never followed
  925.        by anything.  Except for the LIST and EXIT commands, every line typed
  926.        must begin with a number between 1 and 29999.  (Of course, the user
  927.        should be able to type just a carriage return with no effect.)  LEDIT
  928.        should check that line numbers are in range when adding or replacing
  929.        lines.  The LIST command need not check the range of the line numbers,
  930.        because it should be impossible to create lines with improper numbers.
  931.        Your program need not handle input files so long that 29999 would be
  932.        exceeded when it assigns line numbers starting at 10 with an increment
  933.        of 10.
  934.  
  935.        Your LEDIT must prompt for input and output file names at the start,
  936.        and it may print a prompt for each line that the user types.  You may
  937.        assume some maximum length for an input line (e.g., 80), and assume
  938.        that no file will have lines longer than the maximum.  You may also
  939.        assume that no file will have special characters like form feeds.
  940.  
  941.  
  942.                                   -- continued --
  943.  
  944.                                                                       Page 21
  945.  
  946.        For simplicity, there's no way to edit a line except by retyping it.
  947.        Also, there's no way to copy or move a line or a block of lines, and
  948.        no way to delete a block of lines except one line at a time.  There's
  949.        no RENUMBER command.  The user can renumber the entire file starting
  950.        at 10 with an increment of 10 by EXITing and then rerunning LEDIT.
  951.        There's no AUTO command to make the editor type the line numbers
  952.        automatically while text is being typed from the keyboard, and there's
  953.        no means of recovering from a system crash that occurs during an edit.
  954.        Additionally, there's no way to search for a string, or replace one
  955.        string with another.  These features would all be desirable, but we
  956.        feel that Outside Assignment 5 is challenging as it stands.
  957.  
  958.        You're encouraged to use of Ada's "separate" compilation feature, so
  959.        that you don't have to recompile the entire program when developing a
  960.        module.
  961.  
  962.        As a point of reference, our solution to this assignment consists of
  963.        about 180 lines of code on four pages.  If you have any questions
  964.        about what LEDIT should do, you can compile and run our solution,
  965.        which is in LEDIT.ANS.
  966.  
  967.        The following declarations are offered by way of suggestion only, and
  968.        you should use them only if you feel comfortable with them:
  969.  
  970.             MAX_LENGTH : constant INTEGER := 80;
  971.             type TEXT is
  972.                record
  973.                   LEN : INTEGER range 0 .. MAX_LENGTH;
  974.                   VAL : STRING(1 .. MAX_LENGTH);
  975.                end record;
  976.  
  977.             type LINK;
  978.             type P is access LINK;
  979.             type LINK is
  980.                record
  981.                   NUM  : POSITIVE;
  982.                   LINE : TEXT;
  983.                   NEXT : P;
  984.                end record;
  985.  
  986.             function STR(T : in TEXT) return STRING;
  987.  
  988.        In our solution, we used type TEXT as above.  However, we didn't write
  989.        a TEXT_HANDLER package, because it didn't seem to be needed.  We used
  990.        a one-page main program with several "separate" subprograms.
  991.  
  992.                                                                       Page 22
  993.  
  994.            STEPS FOR OUTSIDE ASSIGNMENT 5, WRITING A SIMPLE LINE EDITOR
  995.  
  996.        1.  Carefully read the requirements starting on page 17 of these
  997.            notes.  Take your time.
  998.  
  999.        2.  Write the Ada code, compile, and link.  Call the main program
  1000.            LEDIT.  If you have any questions about what LEDIT should do, you
  1001.            can compile and run our solution, which is in LEDIT.ANS.
  1002.  
  1003.        3.  Refer to pages 23-25 of these notes for instructions on testing
  1004.            your line editor.  If any tests are failed, go back to step 2.
  1005.  
  1006.        4.  When all the tests are passed, you've completed the assignment and
  1007.            will have a chance to compare your solution with ours.
  1008.  
  1009.                                                                       Page 23
  1010.  
  1011.                                  HOW TO TEST LEDIT
  1012.  
  1013.        1.  Run LEDIT and give the name of an input file that doesn't exist.
  1014.        LEDIT should say "File not found."  Give another name of a file that
  1015.        doesn't exist for an output file.
  1016.  
  1017.        2.  Type "LIST" (without the quotes) to make sure that LEDIT can
  1018.        handle the LIST command when no text has been entered.
  1019.  
  1020.        3.  Type "EXI".  The program should NOT exit.  If it exits, it's
  1021.        probably because the "T" was left in the input buffer from the LIST
  1022.        command.  Your program is checking the first four characters of the
  1023.        input buffer without checking the length of the typed command.
  1024.  
  1025.        4.  Type "ABC".  The program should print a message about an illegal
  1026.        or unrecognized command, or syntax error.
  1027.  
  1028.        5.  Type "0X" (zero followed by X).  The program should reject this
  1029.        line, printing a message about an invalid line number.  Type "0 X".
  1030.        The same thing should happen.  Try "30000X", then "30000 X", and then
  1031.        "3000000000 X".  The program should reject these, as well.
  1032.  
  1033.        6.  Type "-1 X" and "-1X".  The program should reject these lines,
  1034.        printing a message either about an unrecognized command (or syntax
  1035.        error), or an invalid line number.
  1036.  
  1037.        7.  Type a simple carriage return.  There should be no effect, except
  1038.        for any prompt being repeated.
  1039.  
  1040.        8.  Type the following exactly as shown.  Note that lines 1000 and 100
  1041.        each contain four spaces:
  1042.  
  1043.        30 X
  1044.        1 The
  1045.        29999 ZZZZZZZZ
  1046.        1000    used
  1047.        100    is
  1048.        10000 to test
  1049.           30file --
  1050.        1 This
  1051.            29999 LEDIT.
  1052.  
  1053.        9.  Type "list".  You should see the following, lined up exactly as
  1054.        shown.  There should be exactly five spaces for the line numbers.
  1055.  
  1056.            1 This
  1057.           30 file --
  1058.          100    is
  1059.         1000    used
  1060.        10000 to test
  1061.        29999 LEDIT.
  1062.  
  1063.  
  1064.                                   -- continued --
  1065.  
  1066.                                                                       Page 24
  1067.  
  1068.        10.  Try a line of text beginning with a number: "20000 123 45".  Then
  1069.        type "   LIST" with three leading spaces.  You should see
  1070.  
  1071.            1 This
  1072.           30 file --
  1073.          100    is
  1074.         1000    used
  1075.        10000 to test
  1076.        20000 123 45
  1077.        29999 LEDIT.
  1078.  
  1079.        11.  Insert an empty line by typing "15000 ".  Then type "LIST".  You
  1080.        should see
  1081.  
  1082.            1 This
  1083.           30 file --
  1084.          100    is
  1085.         1000    used
  1086.        10000 to test
  1087.        15000
  1088.        20000 123 45
  1089.        29999 LEDIT.
  1090.  
  1091.        12.  Type "EXIT ABC".  LEDIT should print a error message and NOT
  1092.        exit.  The requirements say that the EXIT command must stand alone.
  1093.  
  1094.        13.  Type "   exit".  LEDIT should exit, and you should have a new
  1095.        file with the output file name you gave in step 1.  Type the file with
  1096.        the TYPE command.  You should see exactly this, starting in column 1:
  1097.  
  1098.        This
  1099.        file --
  1100.           is
  1101.           used
  1102.        to test
  1103.  
  1104.        123 45
  1105.        LEDIT.
  1106.  
  1107.        14.  Run LEDIT again, using for an input file the name of the OUTPUT
  1108.        file you specified in step 1.  This time the program should say "File
  1109.        found."  Choose yet another name for an output file for this step.
  1110.        Type "list".  You should see the following, exactly as shown:
  1111.  
  1112.           10 This
  1113.           20 file --
  1114.           30    is
  1115.           40    used
  1116.           50 to test
  1117.           60
  1118.           70 123 45
  1119.           80 LEDIT.
  1120.  
  1121.                                   -- continued --
  1122.  
  1123.                                                                       Page 25
  1124.  
  1125.        15.  Type "  LIST 30".  You should see only line 30.  Type
  1126.        "list25-45".  You should see only lines 30 and 40.  Type "LIST  - 40".
  1127.        You should see lines 10 through 40.  Type "list35 -".  You should see
  1128.        lines 40 through 80.  Type "list 15".  The program should either do
  1129.        nothing or print a message that line 15 doesn't exist.  Try
  1130.        "list 30000" and "list 3000000000".  Again, the program should either
  1131.        do nothing or print an error message.  Now type "list" and check that
  1132.        the result is the same as in step 14.
  1133.  
  1134.        16.  Try each of the following.  In each case, LEDIT should print an
  1135.        error message:
  1136.  
  1137.        LIST -
  1138.        list 2A
  1139.        list 30 - 50 -
  1140.        list 30 - -50
  1141.           list 30-A
  1142.        LIST XYZ
  1143.  
  1144.        17.  Type "70" to delete line 70.  Type "LIST".  You should see
  1145.  
  1146.           10 This
  1147.           20 file --
  1148.           30    is
  1149.           40    used
  1150.           50 to test
  1151.           60
  1152.           80 LEDIT.
  1153.  
  1154.        18.  Delete line 60.  Do not list.  Now delete line 80 and list.  You
  1155.        should see
  1156.  
  1157.           10 This
  1158.           20 file --
  1159.           30    is
  1160.           40    used
  1161.           50 to test
  1162.  
  1163.        19.  Delete line 10 and list.  You should see lines 20 through 50
  1164.        above.  Delete line 50 and list.  You should see lines 20 through 40.
  1165.        Delete line 30 and list.  You should see lines 20 and 40.  Delete line
  1166.        40 and list.  You should see only line 20.  Delete line 20 and list.
  1167.        The result should be the same as in step 2.  Type "EXIT".
  1168.  
  1169.        20.  If your program passed all these tests, sincere congratulations!
  1170.        You've completed a difficult assignment.  We hope that you feel
  1171.        comfortable with Ada now.  If you like, you can compare your solution
  1172.        with ours, starting on page 26 of these notes.  When you go back to
  1173.        ADA-TUTR, you'll learn to write your own generic packages, procedures,
  1174.        and functions.
  1175.  
  1176.                                                                       Page 26
  1177.  
  1178.        LEDIT.ANS
  1179.        ---------
  1180.  
  1181.        -- Our solution to Outside Assignment 5:
  1182.        with TEXT_IO; use TEXT_IO;
  1183.        procedure LEDIT is
  1184.  
  1185.           MAX_LENGTH              : constant := 80;
  1186.           MAX_LINE_NUMBER         : constant := 29_999;
  1187.           type TEXT is
  1188.              record
  1189.                 LEN : INTEGER range 0 .. MAX_LENGTH := 0;
  1190.                 VAL : STRING(1 .. MAX_LENGTH);
  1191.              end record;
  1192.           type LINK;
  1193.           type P is access LINK;
  1194.           type LINK is
  1195.              record
  1196.                 NUM  : POSITIVE;
  1197.                 LINE : TEXT;
  1198.                 NEXT : P;
  1199.              end record;
  1200.           HEAD                    : P := new LINK;
  1201.           TEMP                    : P;
  1202.           INPUT_FILE, OUTPUT_FILE : FILE_TYPE;
  1203.           INPUT                   : TEXT;
  1204.           FINISHED                : BOOLEAN := FALSE;
  1205.           LINE_NUM                : NATURAL := 10;
  1206.  
  1207.           function  STR(T : in TEXT) return STRING is separate;
  1208.           procedure READ_INPUT_FILE is separate;
  1209.           procedure DO_COMMAND is separate;
  1210.        begin
  1211.           PUT("Input file: ");  GET_LINE(INPUT.VAL, INPUT.LEN);
  1212.           READ_INPUT_FILE;
  1213.           PUT("Output file: ");  GET_LINE(INPUT.VAL, INPUT.LEN);
  1214.           CREATE(OUTPUT_FILE, NAME => STR(INPUT));
  1215.  
  1216.           -- Get and process commands.
  1217.           while not FINISHED loop
  1218.              PUT("> ");  GET_LINE(INPUT.VAL, INPUT.LEN);
  1219.              DO_COMMAND;
  1220.           end loop;
  1221.  
  1222.           -- Write the output file.
  1223.           TEMP := HEAD.NEXT;     -- Skip unused link at start of linked list.
  1224.           while TEMP /= null loop
  1225.              PUT_LINE(OUTPUT_FILE, STR(TEMP.LINE));    -- Write line of text.
  1226.              TEMP := TEMP.NEXT;                             -- Get next link.
  1227.           end loop;
  1228.           CLOSE(OUTPUT_FILE);
  1229.        end LEDIT;
  1230.  
  1231.                                   -- continued --
  1232.  
  1233.                                                                       Page 27
  1234.  
  1235.        separate(LEDIT)
  1236.        function STR(T : in TEXT) return STRING is
  1237.        begin
  1238.           return T.VAL(1 .. T.LEN);
  1239.        end STR;
  1240.  
  1241.        separate (LEDIT)
  1242.        procedure READ_INPUT_FILE is
  1243.        begin     -- If the input file exists, print a message and read it in.
  1244.           OPEN(INPUT_FILE, IN_FILE, STR(INPUT));
  1245.           PUT_LINE("File found.");
  1246.           TEMP := HEAD;
  1247.           while not END_OF_FILE(INPUT_FILE) loop
  1248.              GET_LINE(INPUT_FILE, INPUT.VAL, INPUT.LEN);      -- Read a line.
  1249.              TEMP.NEXT := new LINK'(LINE_NUM, INPUT, null);   -- Add to list.
  1250.              TEMP := TEMP.NEXT;              -- Advance pointer to next link.
  1251.              LINE_NUM := LINE_NUM + 10;
  1252.           end loop;
  1253.           CLOSE(INPUT_FILE);
  1254.        exception    -- If the input file doesn't exist, just print a message.
  1255.           when NAME_ERROR => PUT_LINE("File not found.");
  1256.        end READ_INPUT_FILE;
  1257.  
  1258.        separate(LEDIT)
  1259.        procedure DO_COMMAND is
  1260.           procedure DELETE_FIRST_CHARACTER(T : in out TEXT) is separate;
  1261.           procedure GET_LEADING_INTEGER(N : out NATURAL) is separate;
  1262.           procedure STRIP_LEADING_SPACES_FROM_INPUT is separate;
  1263.           procedure ADD_DELETE_REPLACE_LINE is separate;
  1264.           procedure LIST is separate;
  1265.        begin
  1266.           STRIP_LEADING_SPACES_FROM_INPUT;
  1267.           if STR(INPUT) = "exit" or STR(INPUT) = "EXIT" then
  1268.              FINISHED := TRUE;
  1269.           elsif INPUT.LEN >= 4 and (INPUT.VAL(1 .. 4) = "list" or
  1270.                                       INPUT.VAL(1 .. 4) = "LIST") then
  1271.              LIST;
  1272.           elsif INPUT.LEN > 0 and INPUT.VAL(1) not in '0' .. '9' then
  1273.              PUT_LINE("Unrecognized command.");
  1274.           elsif INPUT.LEN > 0 then
  1275.              GET_LEADING_INTEGER(LINE_NUM);
  1276.              if LINE_NUM not in 1 .. MAX_LINE_NUMBER then
  1277.                 PUT_LINE("Illegal line number.");
  1278.              else
  1279.                 ADD_DELETE_REPLACE_LINE;
  1280.              end if;
  1281.           end if;
  1282.        exception
  1283.           when NUMERIC_ERROR | CONSTRAINT_ERROR =>
  1284.              PUT_LINE("Line number too large.");
  1285.        end DO_COMMAND;
  1286.  
  1287.  
  1288.                                   -- continued --
  1289.  
  1290.                                                                       Page 28
  1291.  
  1292.        separate(LEDIT.DO_COMMAND)
  1293.        procedure ADD_DELETE_REPLACE_LINE is
  1294.           INP : TEXT := INPUT;
  1295.        begin
  1296.           if INP.LEN > 0 and INP.VAL(1) = ' ' then  -- Treat "9x" like "9 x".
  1297.              DELETE_FIRST_CHARACTER(INP);
  1298.           end if;
  1299.           TEMP := HEAD;     -- Find where this number belongs in linked list.
  1300.           while TEMP /= null and then TEMP.NEXT /= null and then
  1301.                                       TEMP.NEXT.NUM <= LINE_NUM loop
  1302.              if TEMP.NEXT.NUM = LINE_NUM then
  1303.                 TEMP.NEXT := TEMP.NEXT.NEXT;                  -- Delete line.
  1304.              else
  1305.                 TEMP := TEMP.NEXT;           -- Advance to next link in list.
  1306.              end if;
  1307.           end loop;
  1308.           if INPUT.LEN > 0 then                                  -- Add line.
  1309.              TEMP.NEXT := new LINK'(LINE_NUM, INP, TEMP.NEXT);
  1310.           end if;
  1311.        end ADD_DELETE_REPLACE_LINE;
  1312.  
  1313.        separate(LEDIT.DO_COMMAND)
  1314.        procedure DELETE_FIRST_CHARACTER(T : in out TEXT) is
  1315.        begin
  1316.           T.VAL(1 .. T.LEN - 1) := T.VAL(2 .. T.LEN);
  1317.           T.LEN := T.LEN - 1;
  1318.        end DELETE_FIRST_CHARACTER;
  1319.  
  1320.        separate(LEDIT.DO_COMMAND)
  1321.        procedure GET_LEADING_INTEGER(N : out NATURAL) is
  1322.           ANS: INTEGER := 0;
  1323.        begin
  1324.           while INPUT.LEN > 0 and INPUT.VAL(1) in '0' .. '9' loop
  1325.              ANS := ANS*10 + CHARACTER'POS(INPUT.VAL(1)) -CHARACTER'POS('0');
  1326.              DELETE_FIRST_CHARACTER(INPUT);
  1327.           end loop;
  1328.           N := ANS;
  1329.        end GET_LEADING_INTEGER;
  1330.  
  1331.        separate(LEDIT.DO_COMMAND)
  1332.        procedure STRIP_LEADING_SPACES_FROM_INPUT is
  1333.        begin
  1334.           while INPUT.LEN > 0 and INPUT.VAL(1) = ' ' loop
  1335.              DELETE_FIRST_CHARACTER(INPUT);
  1336.           end loop;
  1337.        end STRIP_LEADING_SPACES_FROM_INPUT;
  1338.  
  1339.  
  1340.                                   -- continued --
  1341.  
  1342.                                                                       Page 29
  1343.  
  1344.        separate(LEDIT.DO_COMMAND)
  1345.        procedure LIST is
  1346.           package IIO is new INTEGER_IO(INTEGER); use IIO;
  1347.           START, FINISH : NATURAL;
  1348.           VALID         : BOOLEAN := TRUE;
  1349.        begin
  1350.           INPUT.LEN := INPUT.LEN - 4;      -- Delete the name of the command.
  1351.           INPUT.VAL(1 .. INPUT.LEN) := INPUT.VAL(5 .. INPUT.LEN + 4);
  1352.           STRIP_LEADING_SPACES_FROM_INPUT;
  1353.           if INPUT.LEN = 0 then          -- For "LIST" alone, list all lines.
  1354.              START := 0;
  1355.              FINISH := MAX_LINE_NUMBER + 1;
  1356.           else
  1357.              GET_LEADING_INTEGER(START);          -- Get number after "LIST".
  1358.              STRIP_LEADING_SPACES_FROM_INPUT;
  1359.              if INPUT.LEN = 0 then         -- For "LIST n", list only line n.
  1360.                 FINISH := START;
  1361.              elsif INPUT.VAL(1) /= '-' then        -- Else "-" must follow n.
  1362.                 VALID := FALSE;
  1363.              else
  1364.                 DELETE_FIRST_CHARACTER(INPUT);             -- Delete the "-".
  1365.                 STRIP_LEADING_SPACES_FROM_INPUT;
  1366.                 GET_LEADING_INTEGER(FINISH);         -- Get number after "-".
  1367.                 STRIP_LEADING_SPACES_FROM_INPUT;
  1368.                 if FINISH = 0 and START = 0 then     -- "LIST -" isn't valid.
  1369.                    VALID := FALSE;
  1370.                 elsif FINISH = 0 then  -- For "LIST n -", list n through end.
  1371.                    FINISH := MAX_LINE_NUMBER + 1;
  1372.                 end if;
  1373.                 VALID := VALID  and  INPUT.LEN = 0;   -- No trailing garbage.
  1374.              end if;
  1375.           end if;
  1376.           if not VALID then
  1377.              PUT_LINE("Illegal syntax for LIST.");
  1378.           else
  1379.              TEMP := HEAD.NEXT;  -- Skip unused link at start of linked list.
  1380.              while TEMP /= null and then TEMP.NUM <= FINISH loop
  1381.                 if TEMP.NUM >= START then
  1382.                    PUT(TEMP.NUM, WIDTH => 5);  -- Print line number, width 5.
  1383.                    PUT_LINE(' ' & STR(TEMP.LINE));     -- Print text of line.
  1384.                 end if;
  1385.                 TEMP := TEMP.NEXT;                          -- Get next link.
  1386.              end loop;
  1387.           end if;
  1388.        exception
  1389.           when NUMERIC_ERROR | CONSTRAINT_ERROR =>
  1390.              PUT_LINE("Line number too large in LIST.");
  1391.        end LIST;
  1392.  
  1393.                                                                       Page 30
  1394.  
  1395.        TASKING.DUM
  1396.        -----------
  1397.  
  1398.        with text_io, calendar; use text_io, calendar;
  1399.        procedure tasking is
  1400.           interval        : constant duration := 5.0;
  1401.           total_intervals : constant positive := 9;
  1402.           start_time      : constant time := clock;
  1403.           quitting_time   : constant time := start_time +
  1404.                                                     total_intervals*interval;
  1405.           next_time       : time := start_time;
  1406.           task type tick is
  1407.              entry make_noise;
  1408.              entry shutdown;
  1409.           end tick;
  1410.           t               : tick;
  1411.           task body tick is
  1412.              quit : boolean := false;
  1413.           begin
  1414.              while not quit loop
  1415.                 select
  1416.                    accept make_noise do
  1417.                       put_line("Tick!");
  1418.                    end make_noise;
  1419.                 or
  1420.                    accept shutdown;
  1421.                    quit := true;
  1422.                 end select;
  1423.              end loop;
  1424.           end tick;
  1425.        begin
  1426.           while next_time < quitting_time loop
  1427.              t.make_noise;
  1428.              next_time := next_time + interval;
  1429.              delay next_time - clock; new_line;
  1430.           end loop;
  1431.           t.shutdown;
  1432.        end tasking;
  1433.  
  1434.                                                                       Page 31
  1435.  
  1436.                 STEPS FOR OUTSIDE ASSIGNMENT 6, EXERCISE IN TASKING
  1437.  
  1438.        1.  Make a copy of TASKING.DUM by typing COPY TASKING.DUM TASKING.ADA.
  1439.            Compile, link, and execute the program to make sure it prints
  1440.            "Tick!" nine times.
  1441.  
  1442.        2.  Edit TASKING.ADA to become your solution.  Make your changes in
  1443.            upper case.
  1444.  
  1445.        3.  Compile TASKING.ADA, link, and execute.
  1446.  
  1447.        4.  Compare your output with page 32 of these notes.  If there are any
  1448.            errors, go back to step 2.
  1449.  
  1450.        5.  When your output agrees with these notes, you've finished the
  1451.            assignment and will have a chance to compare your solution with
  1452.            ours.
  1453.  
  1454.                                                                       Page 32
  1455.  
  1456.              OUTPUT FROM TASKING.EXE AFTER MODIFICATION OF TASKING.ADA
  1457.  
  1458.        C>tasking
  1459.        Task number 1 is starting.
  1460.        Task number 2 is starting.
  1461.        Task number 3 is starting.
  1462.  
  1463.  
  1464.        Task number 1 is starting.
  1465.  
  1466.        Task number 2 is starting.
  1467.  
  1468.        Task number 1 is starting.
  1469.        Task number 3 is starting.
  1470.  
  1471.  
  1472.        Task number 1 is starting.
  1473.        Task number 2 is starting.
  1474.  
  1475.  
  1476.        Task number 1 is starting.
  1477.        Task number 3 is starting.
  1478.  
  1479.  
  1480.        C>
  1481.  
  1482.                                                                       Page 33
  1483.  
  1484.        TASKING.ANS
  1485.        -----------
  1486.  
  1487.        -- Our solution to Outside Assignment 6:
  1488.        with text_io, calendar; use text_io, calendar;
  1489.        procedure tasking is
  1490.           interval        : constant duration := 5.0;
  1491.           total_intervals : constant positive := 9;
  1492.           start_time      : constant time := clock;
  1493.           quitting_time   : constant time := start_time +
  1494.                                                     total_intervals*interval;
  1495.           next_time       : time := start_time;
  1496.           task type tick is
  1497.              ENTRY IDENTIFY(TASK_NUMBER : IN NATURAL);
  1498.              entry shutdown;
  1499.           end tick;
  1500.           T               : ARRAY(1 .. 3) OF TICK;
  1501.           PERIOD          : CONSTANT ARRAY(T'RANGE) OF POSITIVE := (2, 3, 4);
  1502.           TIMER           : ARRAY(T'RANGE) OF NATURAL := (OTHERS => 0);
  1503.           task body tick is
  1504.              quit : boolean := false;
  1505.           begin
  1506.              while not quit loop
  1507.                 select
  1508.                    ACCEPT IDENTIFY(TASK_NUMBER : IN NATURAL) DO
  1509.                       PUT_LINE("Task number" & INTEGER'IMAGE(TASK_NUMBER) &
  1510.                            " is starting.");
  1511.                    END IDENTIFY;
  1512.                 or
  1513.                    accept shutdown;
  1514.                    quit := true;
  1515.                 end select;
  1516.              end loop;
  1517.           end tick;
  1518.        begin
  1519.           while next_time < quitting_time loop
  1520.              FOR I IN T'RANGE LOOP
  1521.                 IF TIMER(I) = 0 THEN
  1522.                    T(I).IDENTIFY(I);
  1523.                    TIMER(I) := PERIOD(I);
  1524.                 END IF;
  1525.                 TIMER(I) := TIMER(I) - 1;
  1526.              END LOOP;
  1527.              next_time := next_time + interval;
  1528.              delay next_time - clock; new_line;
  1529.           end loop;
  1530.           FOR I IN T'RANGE LOOP
  1531.              T(I).SHUTDOWN;
  1532.           END LOOP;
  1533.        end tasking;
  1534.  
  1535.                                                                       Page 34
  1536.  
  1537.                APPENDIX A:  SPECIAL OFFER TO COMPANIES, SCHOOLS, ETC.
  1538.  
  1539.        ADA-TUTR can be of great benefit to your company, school, or other
  1540.        organization.  We let you try ADA-TUTR before paying for it, and you
  1541.        may install ADA-TUTR on your mainframes as well as your PCs!
  1542.        Instructions are on page 39.  If you decide to use the program, you
  1543.        could register each individual user, as described on page 2.  But if
  1544.        you have more than 18 users, you can save money by buying a Multi-User
  1545.        License, as described here.  You're on your honor; you know whether
  1546.        you're "using" ADA-TUTR or only "trying" it.  Multi-User Licenses are
  1547.        reasonably priced, as follows:
  1548.  
  1549.            Number of Users:   Price of License:
  1550.  
  1551.               Up to  100         only  $450       A license may always be
  1552.               Up to  500         only  $725       upgraded for only the
  1553.               Up to 2000         only  $950       difference in price.
  1554.               Unlimited          only $2400
  1555.  
  1556.        A Multi-User License gives the specified number of people the right to
  1557.        use ADA-TUTR as long as you like, on all your computers (from small
  1558.        PCs to large mainframes), at all your locations.  (Note: If 100 people
  1559.        use ADA-TUTR now and 100 others use it later, that counts as 200
  1560.        users, not 100.)  Sales commissions are NOT paid to Multi-User
  1561.        Licensees.  Send $5 extra for a copy of the latest version of ADA-TUTR
  1562.        on a 5.25" diskette, $10 extra if you prefer a 3.5" diskette.
  1563.  
  1564.        A Multi-User License includes one year of technical support, which can
  1565.        be renewed for only 10% of the price of the license per year.  While
  1566.        you have technical support, we'll inform you of any important updates
  1567.        to ADA-TUTR, and send you an updated copy on a 5.25" diskette for only
  1568.        $5 ($10 for a 3.5" diskette).  The update is free if you send your own
  1569.        blank, formatted, diskette and a stamped, addressed diskette mailer.
  1570.        We're planning a major update of ADA-TUTR with the next revision (9X)
  1571.        of the Ada language.
  1572.  
  1573.        Please print the file INVOICE.TXT, or use your own form.  When
  1574.        ordering, please give us the serial number from the opening screen of
  1575.        your copy of ADA-TUTR.  With Shareware, you never have to worry about
  1576.        software piracy, because your people are ENCOURAGED to copy and
  1577.        distribute the program!  If you prefer, however, a conventional
  1578.        (non-Shareware) version of ADA-TUTR is available at the same prices.
  1579.  
  1580.        If you buy a license, we'll be happy to do minor customization of
  1581.        ADA-TUTR for you at no charge.  For example, we can add your company
  1582.        name to the opening screen.  If you'd like major customization,
  1583.        contact us for terms, or buy our Customization Kit for $195.  Using
  1584.        any text editor on a PC or mainframe, this kit lets you edit, add, and
  1585.        delete screens, questions, etc. (even whole topics), producing a new
  1586.        ADA-TUTR.DAT file.  It's not Shareware, but you may copy it for use
  1587.        throughout your organization as required.
  1588.  
  1589.        We sell anywhere in the Free World.  Outside the U.S., please remit in
  1590.        U.S. funds and contact us about extra postal charges on diskettes.
  1591.  
  1592.                                                                       Page 35
  1593.  
  1594.                       APPENDIX B:  NOTE TO COMPILER COMPANIES
  1595.  
  1596.        A commercial version of ADA-TUTR is available, without the Shareware
  1597.        notices and without the list of Ada compilers.  You can greatly
  1598.        increase the sales appeal and value of your Ada compiler by including
  1599.        the commercial version of ADA-TUTR with your product.  Please contact
  1600.        us for terms.
  1601.  
  1602.                                                                       Page 36
  1603.  
  1604.                 APPENDIX C:  SOME ADA COMPILERS AVAILABLE FOR THE PC
  1605.  
  1606.        Here's a brief list of Ada compilers available for the IBM PC and
  1607.        compatibles.  For this course, an Ada compiler is helpful, but not
  1608.        required.  There are six Outside Assignments; most of them ask you to
  1609.        write and compile a short Ada program.  If you don't have access to an
  1610.        Ada compiler, just skip the Outside Assignments.
  1611.  
  1612.        As of this writing (December, 1988), we have no financial interest in
  1613.        any company mentioned here.  (That may change; see the note to
  1614.        compiler companies on page 35.)  If you know of an Ada compiler for
  1615.        the PC that you think should be on this list, please contact us.
  1616.  
  1617.        1.  At the low end of the scale is Augusta.  This compiler is in the
  1618.            public domain, and can be found on many computer bulletin boards.
  1619.            It's a very small subset of Ada with no packages.  It translates
  1620.            Ada to a P-code, and then interprets the P-code.  Some of the
  1621.            syntax is non-standard, such as "elseif" where Ada uses "elsif."
  1622.            Older versions of Augusta require Turbo Pascal.
  1623.  
  1624.        2.  ADA/Ed-C is a full Ada "translator" available from NYUADA Project,
  1625.            New York University, 251 Mercer St., New York, NY  10012, for $95.
  1626.            Phone 212-460-7482.  It translates Ada to an intermediate code and
  1627.            then interprets.  On a PC/XT, programs larger than a few hundred
  1628.            lines run out of memory, but on a PC/AT, the translator passes all
  1629.            the tests of the validation suite.  Although this is a full Ada,
  1630.            no utility packages are provided.
  1631.  
  1632.        3.  AdaVantage is sold by Meridian Software, Inc., 23141 Verdugo Dr.,
  1633.            Suite 105, Laguna Hills, CA  92653.  Phone 800-221-2522 (in CA,
  1634.            714-380-9800).  It's validated and produces native code; no
  1635.            interpreter is needed.  The full-sized version is $795.  However,
  1636.            an "AdaStarter" version which compiles small programs is sold
  1637.            for $95 through Programmer's Connection, 7249 Wipple Ave. NW,
  1638.            North Canton, OH  44720, phone 800-336-1166.  Utility packages are
  1639.            extra on both compilers.
  1640.  
  1641.        4.  Lattice Corp., 2500 S. Highland Ave., Suite 300, Lombard, IL
  1642.            60148, will, in mid 1989, offer a validated Ada compiler with an
  1643.            intermediate code interpreter for about $100.  Phone 312-916-1600.
  1644.            Lattice Ada will have a full Ada Programming Support Environment
  1645.            (APSE) with a source code symbolic debugger, and utility packages
  1646.            will be included.  A compiler that also produces native code will
  1647.            follow later at higher cost.
  1648.  
  1649.        5.  Janus/Ada is now validated, and is sold by R & R Software, Box
  1650.            1512, Madison, WI  53701, for $129.  Phone 800-722-3248.  Utility
  1651.            packages are available at considerable extra expense.  Janus/Ada
  1652.            produces native code.
  1653.  
  1654.  
  1655.                                   -- continued --
  1656.  
  1657.                                                                       Page 37
  1658.  
  1659.        6.  IntegrAda is sold by Aetech, Inc., 380 Stevens Ave., Solana Beach,
  1660.            CA  92075, for $495, including utility packages.  Phone
  1661.            619-755-1277.  The compiler is validated and produces native code.
  1662.  
  1663.        7.  At the high end of the scale is Alsys Ada, sold by Alsys, Inc.,
  1664.            1432 Main St., Waltham, MA  02154, for $3300.  Phone 617-890-0030.
  1665.            It's a validated Ada that requires a PC/AT (or compatible), but
  1666.            can produce native code for the PC/XT.  The price includes an
  1667.            extra memory board for the AT.
  1668.  
  1669.                                                                       Page 38
  1670.  
  1671.              APPENDIX D:  DO YOU NEED A SCREEN EDITOR / WORD PROCESSOR?
  1672.  
  1673.        The Outside Assignments will be much easier if you have a good screen
  1674.        editor.  We've looked at many, and found PC-Write, a Shareware program
  1675.        by Quicksoft of Seattle, WA to be the best screen editor as well as
  1676.        word processor.  There's lots of on-line help, and the 50000-word
  1677.        spelling checker can be turned on for editing letters and documents,
  1678.        and off for editing source code.  We liked the idea of having to learn
  1679.        only ONE program for both kinds of editing.  Unlike ADA-TUTR, PC-Write
  1680.        runs only on PCs and compatibles, not on mainframes, etc.
  1681.  
  1682.        We have no connection with Quicksoft, except for being a registered
  1683.        user of PC-Write.  However, we'll be happy to send you a free copy of
  1684.        the latest version of that excellent program, if you send us THREE
  1685.        blank, formatted, 360K 5.25" diskettes or TWO 720K 3.5" diskettes, and
  1686.        a stamped, addressed diskette mailer.  Or send us $15 for three 5.25"
  1687.        diskettes, or $20 for two 3.5" diskettes.  The diskettes or fee covers
  1688.        only our expenses; you must register your copy of PC-Write with
  1689.        Quicksoft if you use it after a free trial.  We're sorry, but we're
  1690.        not allowed to send copies of PC-Write outside North America.
  1691.  
  1692.        If you do use PC-Write to edit Ada programs, you may find the file
  1693.        ED.ADA, included with ADA-TUTR, to be helpful.  It allows typing many
  1694.        Ada reserved words with a single keystroke.  For example, you can type
  1695.        "procedure" by striking Alt-P.  See the file ED.ADA for more details.
  1696.        PC-Write will automatically invoke ED.ADA whenever you edit a file
  1697.        with the extension .ADA.
  1698.  
  1699.                                                                       Page 39
  1700.  
  1701.                 APPENDIX E:  INSTALLING ADA-TUTR ON OTHER COMPUTERS
  1702.  
  1703.        Because source code is included with ADA-TUTR, you can install
  1704.        ADA-TUTR on almost any computer that has an Ada compiler - from
  1705.        compact units to large mainframes.  ADA-TUTR is written in Ada (of
  1706.        course!), and Ada programs tend to be very portable.
  1707.  
  1708.        The screen should have at least 24 rows of 80 characters each, and
  1709.        should support the ANSI escape sequences for highlighting, reverse
  1710.        video, cursor positioning, etc.  Almost all computers qualify.
  1711.  
  1712.        You need a way to send text files from your PC to the other computer.
  1713.        Files are usually sent to large mainframes with the program KERMIT,
  1714.        which is in the public domain.  One version of KERMIT runs on the PC,
  1715.        another on the mainframe.  The two communicate with each other.
  1716.        Sometimes XMODEM or another protocol is used instead of KERMIT.
  1717.  
  1718.        If a communications program is available on the PC but not on the
  1719.        other computer, you can still send text files, but not as efficiently.
  1720.        Connect your PC as a terminal and tell the other computer to copy the
  1721.        keyboard to a new file.  For example, on a VAX computer running VMS,
  1722.        the command is "COPY TT: filename.ext" (without the quotes).  Then
  1723.        tell your communications program to send (or "upload") the file, using
  1724.        ASCII protocol, and stripping line feeds.  After the file is sent,
  1725.        type the appropriate end-of-file character for the other computer.  On
  1726.        a VAX running VMS, you would type Control-Z.  Since this method of
  1727.        file transfer doesn't do error checking, you may have to send each
  1728.        file twice using two different names, and compare the two files with
  1729.        each other on the other computer.  It's far better to use a
  1730.        communications program on the other computer, if one is available.
  1731.  
  1732.        OK, you have some means of sending text files.  You won't have to send
  1733.        other kinds of files.  To install ADA-TUTR on the other computer, just
  1734.        follow these steps:
  1735.  
  1736.        1.  Type DAT2TXT on the PC.  This will read the file ADA-TUTR.DAT,
  1737.        which is not a text file, and create a new text file TUTOR.TXT, which
  1738.        can be sent to the other computer.  DAT2TXT will probably take several
  1739.        minutes to run.  Don't try to bypass this step even if you're able to
  1740.        send non-text files.  It's important that you send TUTOR.TXT and not
  1741.        ADA-TUTR.DAT, because the PC version of ADA-TUTR.DAT doesn't work on
  1742.        some systems.
  1743.  
  1744.        2.  Decide where ADA-TUTR will reside on the other computer, so that
  1745.        it will be accessible by all users.  For example, on a VAX computer
  1746.        running VMS, the tutor is usually placed in SYS$INSTRUCTION.  It could
  1747.        also be placed in SYS$MANAGER, etc.
  1748.  
  1749.                                   -- continued --
  1750.  
  1751.                                                                       Page 40
  1752.  
  1753.        3.  Send to the other computer all the files that come with ADA-TUTR,
  1754.        except ADA-TUTR.DAT and the files ending in .EXE.  Be sure to send
  1755.        TUTOR.TXT, created in step 1.  Don't try to send ADA-TUTR.DAT and the
  1756.        .EXE files, because they're not text files.  Also note that ADA-TUTR
  1757.        creates a file ADA-TUTR.USR the first time it's run.  Do NOT send that
  1758.        file, because it also is not a text file.  If our file names are
  1759.        illegal on the other system, you'll have to rename them as they're
  1760.        sent.  (We haven't seen a system where our file names are illegal.)
  1761.  
  1762.        4.  If any of the file names ADA-TUTR.DAT, ADA-TUTR.USR, or TUTOR.TXT
  1763.        are illegal on your system, edit the files ADA-TUTR.ADA, CHANGESN.ADA,
  1764.        and TXT2DAT.ADA to show new, legal file names.  Search for the old
  1765.        file names and replace them with the new ones.
  1766.  
  1767.        5.  Note that each user will probably run ADA-TUTR from his own file
  1768.        directory.  There will be a file ADA-TUTR.USR in each user's
  1769.        directory, but all the other files will reside in a common area, such
  1770.        as SYS$INSTRUCTION, etc.  Therefore, edit the files ADA-TUTR.ADA,
  1771.        CHANGESN.ADA, and TXT2DAT.ADA to show the full path name of the file
  1772.        ADA-TUTR.DAT.  On a VAX system, for example, you might search for the
  1773.        name ADA-TUTR.DAT and replace it with SYS$INSTRUCTION:ADA-TUTR.DAT.
  1774.  
  1775.        6.  On one system we encountered, Ada source file names must end in .a
  1776.        rather than .ADA.  If that's the case on your system, rename all the
  1777.        .ADA files.
  1778.  
  1779.        7.  On the other computer, compile, link, and run TXT2DAT.ADA.  Some
  1780.        systems call the linking step "binding."  This program will read
  1781.        TUTOR.TXT and create ADA-TUTR.DAT on the other system.  If you wish,
  1782.        you may then delete TUTOR.TXT.
  1783.  
  1784.        8.  If you're using VAX Ada, skip to page 42.  If you're using a UNIX
  1785.        based system that has a C compiler with the ability to link into Ada
  1786.        programs, skip to page 43.  Otherwise, continue with the next page.
  1787.        If you're not certain, continue with the next page.
  1788.  
  1789.                                   -- continued --
  1790.  
  1791.                                                                       Page 41
  1792.  
  1793.  
  1794.        9.  Compile VANILLA.ADA, but don't try to link or run it.  This "plain
  1795.        vanilla" file will work with any standard Ada compiler.
  1796.  
  1797.        10.  Compile ADA-TUTR.ADA.
  1798.  
  1799.        11.  Link, giving the name of the main program, ADA_TUTR (with an
  1800.        underline).  This will produce an executable file, which on most
  1801.        systems will be called ADA_TUTR.EXE (with an underline).  Rename this
  1802.        file.  On most systems, the appropriate new name is ADA-TUTR.EXE (with
  1803.        a hyphen).
  1804.  
  1805.        12.  Run ADA-TUTR.  Note that, on some systems, you'll have to strike
  1806.        ENTER (or RETURN or NEW-LINE) after each response, even though the
  1807.        program says, "You need not hit ENTER."  The reason is that some
  1808.        systems require you to strike ENTER when they read the keyboard
  1809.        through TEXT_IO.  However, with recent versions of TeleGen Ada, you
  1810.        don't have to hit ENTER.  Also note that some of the tutorial text
  1811.        refers to commands that are meant for a PC, such as COPY and PRINT.
  1812.        These commands may have to be varied slightly to work on your system.
  1813.  
  1814.        13.  Define a command so that each user will be able to run ADA-TUTR
  1815.        easily.
  1816.  
  1817.  
  1818.        We'll be happy to help you install ADA-TUTR and get it running, even
  1819.        if you haven't registered or bought a license.  We want you to try
  1820.        ADA-TUTR before paying for it.
  1821.  
  1822.                                                                       Page 42
  1823.  
  1824.                           SPECIAL INSTRUCTIONS FOR VAX ADA
  1825.  
  1826.        9.  If you're using VAX Ada, compile VAX.ADA, but don't try to link or
  1827.        run it.  The file VANILLA.ADA would work, but VAX.ADA makes it
  1828.        unnecessary to strike RETURN after each response.  The reason is that
  1829.        VAX.ADA gets characters from the keyboard by calling the System
  1830.        Service routines, without going through TEXT_IO.
  1831.  
  1832.        10.  Compile ADA-TUTR.ADA.
  1833.  
  1834.        11.  Link, giving the name of the main program, ADA_TUTR (with an
  1835.        underline).  The command is ACS LINK ADA_TUTR.  This will produce an
  1836.        executable file, ADA_TUTR.EXE (with an underline).  Rename that file
  1837.        to ADA-TUTR.EXE (with a hyphen).
  1838.  
  1839.        12.  Run ADA-TUTR.  Note that some of the tutorial text refers to
  1840.        commands that are meant for a PC, such as COPY and PRINT.  These
  1841.        commands may have to be varied slightly to work on your system.  For
  1842.        example, when the text says to type COPY TRITYPE.DUM TRITYPE.ADA, your
  1843.        users might have to type COPY SYS$INSTRUCTION:TRITYPE.DUM TRITYPE.ADA.
  1844.  
  1845.        13.  Define a command so that each user will be able to run ADA-TUTR
  1846.        easily.  For example, you might add the following line to SYLOGIN.COM:
  1847.  
  1848.                    $ TEACHADA :== "RUN SYS$INSTRUCTION:ADA-TUTR"
  1849.  
  1850.  
  1851.        We'll be happy to help you install ADA-TUTR and get it running, even
  1852.        if you haven't registered or bought a license.  We want you to try
  1853.        ADA-TUTR before paying for it.
  1854.  
  1855.                                                                       Page 43
  1856.  
  1857.                     SPECIAL INSTRUCTIONS FOR UNIX BASED SYSTEMS
  1858.  
  1859.        9.  If you're using a UNIX based system with a C compiler, and your
  1860.        Ada compiler can link with modules produced by C, compile ONECHAR.C
  1861.        with the C compiler.
  1862.  
  1863.        10.  Compile UNIX.ADA, but don't try to link or run it.  The file
  1864.        VANILLA.ADA would work, but UNIX.ADA, when used with ONECHAR.C, makes
  1865.        it unnecessary to strike RETURN after each response.  The reason is
  1866.        that ONECHAR.C gets characters directly from the keyboard, without
  1867.        going through TEXT_IO.
  1868.  
  1869.        11.  Compile ADA-TUTR.ADA.
  1870.  
  1871.        12.  Link, giving the name of the main program, ADA_TUTR (with an
  1872.        underline).  Include the object file from the C compiler in the link.
  1873.        This will create an executable file, called ADA_TUTR (with an
  1874.        underline) on most systems.  (On one system we encountered, the file
  1875.        created was named a.out.)  Rename that file to an appropriate name,
  1876.        such as ada-tutr or ADA-TUTR or ADA-TUTR.EXE.
  1877.  
  1878.  
  1879.        Here are sample steps 9 through 12 for two UNIX based systems:
  1880.  
  1881.               ON A UNISYS 5000/80:             ON A HARRIS HCX:
  1882.  
  1883.               cc -c onechar.c                  cc -c onechar.c
  1884.               ada unix.ada ada-tutr.ada        ada unix.a ada-tutr.a
  1885.               ald -p'onechar' ada_tutr         a.ld ada_tutr onechar.o
  1886.                                                mv a.out ada-tutr
  1887.  
  1888.  
  1889.        13.  Run ADA-TUTR.  Note that some of the tutorial text refers to
  1890.        commands that are meant for a PC, such as COPY and PRINT.  These
  1891.        commands may have to be varied slightly to work on your system.
  1892.  
  1893.        14.  Define a command so that each user will be able to run ADA-TUTR
  1894.        easily.
  1895.  
  1896.  
  1897.        We'll be happy to help you install ADA-TUTR and get it running, even
  1898.        if you haven't registered or bought a license.  We want you to try
  1899.        ADA-TUTR before paying for it.
  1900.  
  1901.                                                                       Page 44
  1902.  
  1903.                  APPENDIX F:  WE LISTEN!  NEW FEATURES OF ADA-TUTR
  1904.  
  1905.        Our sincere thanks to all of you who registered your copies of
  1906.        versions 1.00 and 1.01 of ADA-TUTR!  (Version 1.01 corrected some
  1907.        minor typographical errors in version 1.00.)
  1908.  
  1909.        We asked for your comments and suggestions, and you responded.  Thank
  1910.        you very much!  That's why we created this version 1.2 of ADA-TUTR.
  1911.  
  1912.        You asked that the Tutor automatically remember where you leave off
  1913.        when you exit the program, so that you won't have to write down the
  1914.        screen number.  You suggested that ADA-TUTR tell you the approximate
  1915.        percentage through the course, and that it tell you when you come to
  1916.        the start of a major section.  You suggested that ADA-TUTR be able to
  1917.        go back to the last question and to the last Outside Assignment.  You
  1918.        wanted to be able to select colors.
  1919.  
  1920.        We added all these features, including color, without sacrificing the
  1921.        ability to run ADA-TUTR on mainframes.  You can strike S at any time
  1922.        to set the foreground, background, and border colors.  The Tutor
  1923.        remembers your color choices and remembers where you leave off.  When
  1924.        you strike X, ADA-TUTR tells you the current screen number and the
  1925.        approximate percentage through the course.  It then gives you a chance
  1926.        to exit, go back to where you were, go back to the last question, go
  1927.        back to the last Outside Assignment, or go to a screen number of your
  1928.        choice.  A special screen tells you when you come to the start of each
  1929.        major section.
  1930.  
  1931.        We're very grateful to Mr. David Hill, 7549 Wynford Street, Salt Lake
  1932.        City, UT 84121, for sending us the file ONECHAR.C and giving us
  1933.        permission to include it in ADA-TUTR.  This file (used with UNIX.ADA)
  1934.        makes it possible to run the Tutor on UNIX based machines without
  1935.        having to strike ENTER after each response.  See pages 39-43.
  1936.  
  1937.        Starting with version 1.20 of ADA-TUTR, we offer customized versions
  1938.        of ADA-TUTR, and a new Customization Kit.  Details are on page 34.
  1939.        Also, ADA-TUTR is now available on 3.5" diskettes.
  1940.  
  1941.        We're planning a major update of ADA-TUTR with the next revision (9X)
  1942.        of the Ada language.  Please continue to send us your comments and
  1943.        suggestions.  We want to produce the very best Ada Tutor possible!
  1944.  
  1945.                                                                       Page 45
  1946.  
  1947.                         APPENDIX G:  DISCLAIMER OF WARRANTY
  1948.  
  1949.        We hate legal mumbo jumbo, but we have to say the following to protect
  1950.        ourselves:
  1951.  
  1952.        Software Innovations Technology makes no warranty of any kind,
  1953.        expressed or implied, including any warranties of merchantability or
  1954.        fitness for a particular purpose.  We shall not be liable for any
  1955.        damages, whether direct, indirect, incidental, special, or
  1956.        consequential, arising from a failure of this program to operate in a
  1957.        manner desired by the user.  We shall not be liable for any damage to
  1958.        data or property which may be caused directly or indirectly by use of
  1959.        this program.  IN NO EVENT SHALL SOFTWARE INNOVATIONS TECHNOLOGY BE
  1960.        LIABLE FOR ANY DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS, OR
  1961.        OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
  1962.        INABILITY TO USE THIS PROGRAM, OR FOR ANY CLAIM BY ANY OTHER PARTY.
  1963.