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

  1. ::::::::::
  2. nlg.ada
  3. ::::::::::
  4. ---- NLG.ADA
  5. -- This package is a generic package of
  6. -- generic procedures, where a generic formal parameter of the
  7. -- generic package is a generic formal parameter of the generic
  8. -- function.  This package implements a namelist function in ADA.
  9. -- The data is read in from a user defined file and stored in
  10. -- a character array(VAR_ARRAY). This array is indexed
  11. -- by a enumerated type which is the name of the
  12. -- variable with VAL tacked on to the end.  The initialization of
  13. -- VAR_ARRAY is done by the procedure INIT_NAMELIST.
  14. -- The data is transfered to the program
  15. -- variables by the generic procedures GET_VAL
  16. -- and GET_VAL_V.  GET_VALUE is not a generic procedure and
  17. -- reads in data of predefined type STRING.
  18. -- Vectors and two dimensional arrays can be read in.
  19. -- NL_PRINT_FLAG controls the print out: if NL_PRINT_FLAG = 1 the
  20. -- data lines will be sent to the current output device as
  21. -- they are read in.  In addition, the values as they are
  22. -- stored in VAR_ARRAY are printed out.
  23. --
  24. -- Written by David Kwong...finished 10/86
  25. -- 11/86 changed FILE_NAME to NAMELIST_FILE_NAME and
  26. --       moved declaration to package specification
  27.  
  28.     WITH TEXT_IO; USE TEXT_IO;
  29.     WITH INTEGER_TEXT_IO;
  30. GENERIC
  31.     TYPE VAR IS (<>);
  32.     WITH PROCEDURE GET(FROM: IN STRING; ITEM: OUT VAR;
  33.         LAST: OUT POSITIVE) IS <>;
  34. PACKAGE NAMELIST_GENERIC IS
  35.  
  36.     -- Define Global Variables
  37.     SUBTYPE INSTRING IS STRING(1..120);
  38.     NAMELIST_FILE_NAME: STRING(1..30) :="                              ";
  39.     TYPE VAR_ARRAY_T IS ARRAY (VAR) OF INSTRING;
  40.     VAR_ARRAY:VAR_ARRAY_T; -- Array containing all all the data
  41.     NL_PRINT_FLAG : INTEGER := 0; -- Flag controlling
  42.                                   -- printing of information
  43.     -- This constant string is used to check if a value has
  44.     -- been changed.  This string cannot be used as an
  45.     -- input to the namelist.
  46.     NOT_CHANGED: CONSTANT STRING(1..3):=(ASCII.FF,
  47.                                           ASCII.ESC,ASCII.FF);
  48.  
  49. -- Procedure used to initialized VAR_ARRAY with values from the
  50. -- input file
  51.  
  52.     PROCEDURE INIT_NAMELIST(FNAME: IN STRING := NOT_CHANGED);
  53.  
  54. -- Function used to read strings from the namelist
  55.  
  56.     PROCEDURE GET_VALUE (OUT_STRING: IN OUT STRING; INDEX: IN VAR);
  57.  
  58. -- Generic procedure used to read integer, floating point
  59. -- and enumerated types from the namelist.
  60.  
  61.     GENERIC
  62.         TYPE OUT_VAL IS PRIVATE;
  63.         WITH PROCEDURE GET(FROM: IN INSTRING; ITEM: OUT OUT_VAL;
  64.                            LAST: OUT POSITIVE) IS <>;
  65.     PROCEDURE GET_VAL (VALUE: IN OUT OUT_VAL; INDEX: IN VAR);
  66.  
  67. -- Generic procedure used to read 1 dimensional arrays or vectors
  68. -- from the namelist
  69.  
  70.     GENERIC
  71.         TYPE COMP_TYPE IS PRIVATE;
  72.         TYPE VINDEX IS (<>);
  73.         TYPE VECT IS ARRAY (VINDEX RANGE <>) OF COMP_TYPE;
  74.         WITH PROCEDURE GET(FROM: IN INSTRING; ITEM: OUT COMP_TYPE;
  75.                            LAST: OUT POSITIVE) IS <>;
  76.     PROCEDURE GET_VAL_V (OUT_VECT: IN OUT VECT; INDEX: IN VAR);
  77.  
  78. -- Generic procedure used to read 2 dimensional arrays or matrices
  79. -- from the namelist
  80.  
  81.     GENERIC
  82.         TYPE COMP_TYPE IS PRIVATE;
  83.         TYPE MINDEX IS (<>);
  84.         TYPE MATRIX IS ARRAY (MINDEX RANGE <>, MINDEX RANGE <>)
  85.                                      OF COMP_TYPE;
  86.         WITH PROCEDURE GET(FROM: IN INSTRING; ITEM: OUT COMP_TYPE;
  87.                            LAST: OUT POSITIVE) IS <>;
  88.     PROCEDURE GET_VAL_M (OUT_MAT: IN OUT MATRIX; INDEX: IN VAR);
  89.  
  90. END NAMELIST_GENERIC;
  91.  
  92.  
  93. PACKAGE BODY NAMELIST_GENERIC IS
  94.  
  95. -- This procedure  will read a file and initialize the data array used in
  96. -- the package NAMELIST_GENERIC.
  97.  
  98.     PROCEDURE INIT_NAMELIST(FNAME: IN STRING := NOT_CHANGED) IS
  99.  
  100.         USE INTEGER_TEXT_IO;
  101.  
  102.         CVAL: INSTRING;
  103.         DATALINE: STRING(1..132); -- Max size of line in input file
  104.         INDEX: VAR; -- Emumerated type which indexes VAR_ARRAY
  105.         LAST: INTEGER;
  106.         LASTJ: INTEGER; -- Last value of index J in string CVAL
  107.         NL_FILE: FILE_TYPE;
  108.         NLINES: INTEGER := 0;
  109.         NCHAR: INTEGER;-- Total number of characters in input line
  110.         NCHARD: INTEGER; -- Number of data
  111.                          -- characters in input DATALINE
  112.         NROWS: INTEGER := 1; -- Number of rows in two
  113.                              -- dimensional matrix
  114.         INDEXS: INTEGER :=1; -- Index of beginning
  115.                              -- of matrix data element
  116.  
  117.     BEGIN
  118.  
  119.         IF(FNAME(1..3) = NOT_CHANGED) THEN
  120.             PUT("PLEASE ENTER NAME OF NAME LIST FILE: ");
  121.             GET_LINE(NAMELIST_FILE_NAME,NCHAR);
  122.             NEW_LINE;
  123.         ELSE
  124.             NCHAR := FNAME'LAST;
  125.             NAMELIST_FILE_NAME(1..NCHAR) := FNAME;
  126.         END IF;
  127.  
  128.         OPEN(FILE=>NL_FILE, MODE=>IN_FILE,
  129.             NAME=>NAMELIST_FILE_NAME(1..NCHAR));
  130.  
  131.         -- Initialize VAR_ARRAY 
  132.         FOR II IN VAR_ARRAY'RANGE LOOP
  133.             VAR_ARRAY(II)(1..3) := NOT_CHANGED;
  134.         END LOOP;
  135.  
  136.         FOR I IN 1..200 LOOP -- reads up to 200 entries
  137.  
  138.             IF(END_OF_FILE(NL_FILE)) THEN
  139.                 EXIT;
  140.             END IF;
  141.             NLINES := NLINES + 1;
  142.  
  143.             -- INITIALIZE DATALINE
  144.             FOR I IN DATALINE'RANGE LOOP
  145.                 DATALINE(I) := ' ';
  146.             END LOOP;
  147.             -- Read line from input file
  148.             GET_LINE(NL_FILE,DATALINE,NCHARD);
  149.             -- Look for comments
  150.             FOR I IN 2..NCHARD LOOP
  151.                 IF((DATALINE(I)='-') AND (DATALINE(I-1)='-')) THEN
  152.                     NCHARD := I-2; -- NCHARD = 0 is ok
  153.                     EXIT;
  154.                 END IF;
  155.             END LOOP;
  156.  
  157.             IF(NL_PRINT_FLAG = 1) THEN
  158.                 NEW_LINE;
  159.                 PUT (DATALINE(1..NCHARD));
  160.             END IF;
  161.  
  162.             -- PARSE STRING AND INPUT INTO ARRAY
  163.  
  164.             FOR I IN 1..NCHARD LOOP
  165.  
  166.                 -- Check to see if variable is matrix
  167.                 IF (DATALINE(I) = '(') THEN
  168.  
  169.                     GET(DATALINE(1..I-1),INDEX,NCHAR); -- Get index
  170.  
  171.                     FOR J IN I..NCHARD LOOP
  172.  
  173.                         IF(DATALINE(J) = ',')THEN -- Get num of rows
  174.                             GET(DATALINE((I+1)..(J-1)),NROWS,LAST);
  175.                         END IF;
  176.  
  177.                         -- read in first line of data
  178.                         IF (DATALINE(J) = '=') THEN -- Look for "="
  179.                             FOR K IN J+1..NCHARD LOOP
  180.                                 CVAL(K-J) := DATALINE(K);
  181.                             END LOOP;
  182.                             LASTJ := NCHARD-J; -- Last used pos in CVAL
  183.                             EXIT;
  184.                         END IF;
  185.  
  186.                     END LOOP;
  187.  
  188.                     -- Read in additional datalines for matrix
  189.                     -- Loop on number of rows-1 in matrix
  190.                     FOR K IN 1..NROWS-1 LOOP
  191.  
  192.                         -- INITIALIZE DATALINE
  193.                         FOR I IN DATALINE'RANGE LOOP
  194.                             DATALINE(I) := ' ';
  195.                         END LOOP;
  196.                         -- Read line from input file
  197.                         GET_LINE(NL_FILE,DATALINE,NCHARD);
  198.                         IF(NL_PRINT_FLAG = 1) THEN
  199.                             NEW_LINE;
  200.                             PUT (DATALINE(1..NCHARD));
  201.                         END IF;
  202.  
  203.                         INDEXS :=1;
  204.                         FOR I IN 2..NCHARD LOOP
  205.                             -- Look for comments
  206.                             IF((DATALINE(I)='-') AND
  207.                                (DATALINE(I-1)='-')) THEN
  208.                                 NCHARD := I-2; -- NCHARD = 0 is ok
  209.                                 EXIT;
  210.                             END IF;
  211.                             -- Find beginning of data strip
  212.                             -- leading blanks and tabs
  213.                             IF(INDEXS = 1 AND DATALINE(I) /=' '
  214.                                 AND DATALINE(I) /= ASCII.HT) THEN
  215.                                 INDEXS :=I;
  216.                             END IF;
  217.                         END LOOP;
  218.  
  219.                         -- Make sure data can fit in CVAL
  220.                         IF(CVAL'LAST>=LASTJ+NCHARD-INDEXS+1) THEN
  221.                             FOR J IN INDEXS..NCHARD LOOP
  222.                                 CVAL(J+LASTJ-INDEXS+1):= DATALINE(J);
  223.                             END LOOP;
  224.                             LASTJ := NCHARD-INDEXS+1+LASTJ;
  225.                         ELSE
  226.                             NEW_LINE;
  227.                             PUT(" DATALINE FOR MATRIX TOO LONG");
  228.                             NEW_LINE;
  229.                             PUT("FIX BY INCREASING CVAL'LAST");
  230.                             RAISE CONSTRAINT_ERROR;
  231.                         END IF;
  232.  
  233.                     END LOOP;
  234.  
  235.                     -- Pad with blanks
  236.                     FOR J IN LASTJ+1..CVAL'LAST LOOP
  237.                         CVAL(J) := ' ';
  238.                     END LOOP;
  239.  
  240.                     -- Put read in data into VAR_ARRAY
  241.                     VAR_ARRAY(INDEX) := CVAL;
  242.                     IF(NL_PRINT_FLAG = 1) THEN
  243.                         NEW_LINE;
  244.                         PUT(" CVAL =");
  245.                         PUT(CVAL);
  246.                     END IF;
  247.                     EXIT;
  248.  
  249.                 ELSIF (DATALINE(I) = '=') THEN -- Look for "="
  250.  
  251.                     GET(DATALINE(1..I-1),INDEX,NCHAR); -- Get index
  252.                     IF (CVAL'LAST <= NCHARD-I) THEN
  253.                         -- Read in data for value when input data
  254.                         -- is greater than CVAL print out warning
  255.                         NEW_LINE;
  256.                         PUT("INPUT LINE IS TOO LARGE");
  257.                         PUT("FOR VALUE: ");PUT(DATALINE(1..I-1));
  258.                         NEW_LINE; PUT("TRUNCATING AND CONTINUING");
  259.                         NEW_LINE;
  260.                         PUT("FIX BY INCREASING CVAL'LAST");
  261.                         FOR J IN CVAL'RANGE LOOP
  262.                             CVAL(J):=DATALINE(I+J);
  263.                         END LOOP;
  264.                     ELSE
  265.                         -- Read in data for value when input data
  266.                         -- is smaller than CVAL
  267.                         FOR J IN 1..NCHARD-I LOOP
  268.                             CVAL(J):=DATALINE(I+J);
  269.                         END LOOP;
  270.                         -- Pad with blanks
  271.                         FOR J IN NCHARD-I+1..CVAL'LAST LOOP
  272.                             CVAL(J) := ' ';
  273.                         END LOOP;
  274.                     END IF;
  275.  
  276.                     -- Put read in data into VAR_ARRAY
  277.                     VAR_ARRAY(INDEX) := CVAL;
  278.                     IF(NL_PRINT_FLAG = 1) THEN
  279.                         NEW_LINE;
  280.                         PUT(" CVAL =");
  281.                         PUT(CVAL);
  282.                     END IF;
  283.                     EXIT;
  284.  
  285.                 END IF;
  286.  
  287.             END LOOP;
  288.  
  289.         END LOOP;
  290.  
  291.         CLOSE(NL_FILE);
  292.  
  293.         IF(NL_PRINT_FLAG = 1) THEN
  294.             NEW_LINE;
  295.             PUT(NLINES);
  296.             PUT("  LINES READ INTO NAMELIST");
  297.             NEW_LINE;
  298.         END IF;
  299.     EXCEPTION
  300.         WHEN DATA_ERROR =>
  301.             NEW_LINE(STANDARD_OUTPUT);
  302.             PUT(STANDARD_OUTPUT," ERROR IN NAME LIST: ");
  303.             PUT(STANDARD_OUTPUT," VARIABLE NAME NOT CORRECT?(xxxVAL)");
  304.             RAISE;
  305.         WHEN OTHERS =>
  306.             RAISE;
  307.  
  308.     END INIT_NAMELIST;
  309.  
  310.  
  311. -- This procedure reads in strings to string variables
  312.  
  313.     PROCEDURE GET_VALUE (OUT_STRING: IN OUT STRING; INDEX: IN VAR) IS
  314.  
  315.         Q1,Q2:INTEGER := 0;
  316.         DINDEX: INTEGER;
  317.         DATA: INSTRING := VAR_ARRAY(INDEX);
  318.  
  319.     BEGIN
  320.  
  321.         -- Check to see if value has been changed
  322.         IF(VAR_ARRAY(INDEX)(1..3) = NOT_CHANGED) THEN
  323.             RETURN;
  324.         END IF;
  325.  
  326.         -- Find the quotes
  327.         FOR I IN INSTRING'RANGE LOOP
  328.             IF(DATA(I) = '"') THEN
  329.                 IF(Q1 = 0) THEN
  330.                     Q1 := I;
  331.                 ELSE
  332.                     Q2 := I;
  333.                 END IF;
  334.             END IF;
  335.         END LOOP;
  336.         -- Place characters between quotes into out string.
  337.         -- If out string is too short, characters are truncated
  338.         -- from right side.  If out string is too long, blanks
  339.         -- are added to right side.
  340.         DINDEX := Q1;
  341.         FOR I IN OUT_STRING'RANGE LOOP
  342.             DINDEX := DINDEX+1;
  343.             IF((DINDEX) >= Q1) AND (DINDEX < Q2 ) THEN
  344.                 OUT_STRING(I) := DATA(DINDEX);
  345.             ELSE
  346.                 OUT_STRING(I) := ' ';
  347.             END IF;
  348.         END LOOP;
  349.  
  350.     EXCEPTION
  351.  
  352.         WHEN DATA_ERROR =>
  353.             NEW_LINE(STANDARD_OUTPUT);
  354.             PUT(STANDARD_OUTPUT," ERROR IN NAME LIST INPUT DATA: ");
  355.             PUT(STANDARD_OUTPUT," CHECK SYNTAX OF INPUT FILE");
  356.             RAISE;
  357.         WHEN OTHERS =>
  358.             RAISE;
  359.  
  360.     END GET_VALUE;
  361.  
  362.  
  363. -- This generic procedure can be instantiated for integer, float
  364. -- and enumerated
  365. -- types.  "GET" for that type must be defined as a generic parameter.
  366.  
  367.     PROCEDURE GET_VAL (VALUE: IN OUT OUT_VAL; INDEX: IN VAR) IS
  368.  
  369.         LAST:POSITIVE;
  370.  
  371.     BEGIN
  372.  
  373.         -- Check to see if value has been changed
  374.         IF(VAR_ARRAY(INDEX)(1..3) = NOT_CHANGED) THEN
  375.             RETURN;
  376.         END IF;
  377.  
  378.         GET(VAR_ARRAY(INDEX),VALUE,LAST);
  379.  
  380.     EXCEPTION
  381.  
  382.         WHEN DATA_ERROR =>
  383.             NEW_LINE(STANDARD_OUTPUT);
  384.             PUT(STANDARD_OUTPUT," ERROR IN NAME LIST INPUT DATA: ");
  385.             PUT(STANDARD_OUTPUT," CHECK SYNTAX OF INPUT FILE");
  386.             RAISE;
  387.         WHEN OTHERS =>
  388.             RAISE;
  389.  
  390.     END GET_VAL;
  391.  
  392.  
  393. -- This generic procedure is used to read in the values for a one
  394. -- dimensional array or vector.
  395.  
  396.     PROCEDURE GET_VAL_V (OUT_VECT: IN OUT VECT; INDEX: IN VAR) IS
  397.  
  398.         C1,C2:INTEGER := 1;
  399.         LAST : INTEGER;
  400.         DATA: INSTRING := VAR_ARRAY(INDEX);
  401.         VALUE: COMP_TYPE;
  402.  
  403.     BEGIN
  404.  
  405.         -- Check to see if value has been changed
  406.         IF(VAR_ARRAY(INDEX)(1..3) = NOT_CHANGED) THEN
  407.             RETURN;
  408.         END IF;
  409.  
  410.         -- Find the commas
  411.         FOR M IN OUT_VECT'RANGE LOOP
  412.             FOR I IN C1..DATA'LAST LOOP
  413.                 IF M = OUT_VECT'LAST THEN
  414.                     C2 := DATA'LAST;
  415.                     EXIT;
  416.                 END IF;
  417.                 IF(DATA(I) = ',') THEN
  418.                     C2 := I-1;
  419.                     EXIT;
  420.                 END IF;
  421.             END LOOP;
  422.  
  423.             -- Place characters between commas into the correct
  424.             -- element of the vector 
  425.             GET(VAR_ARRAY(INDEX)(C1..C2),VALUE,LAST);
  426.  
  427.             OUT_VECT(M) := VALUE;
  428.  
  429.             C1 := C2+2;
  430.  
  431.         END LOOP;
  432.  
  433.     EXCEPTION
  434.  
  435.         WHEN DATA_ERROR =>
  436.             NEW_LINE(STANDARD_OUTPUT);
  437.             PUT(STANDARD_OUTPUT," ERROR IN NAME LIST INPUT DATA: ");
  438.             PUT(STANDARD_OUTPUT," CHECK SYNTAX OF INPUT FILE");
  439.             RAISE;
  440.         WHEN OTHERS =>
  441.             RAISE;
  442.  
  443.     END GET_VAL_V;
  444.  
  445.  
  446. -- This generic procedure is used to read in the values for a two
  447. -- dimensional array or matrix.
  448.  
  449.     PROCEDURE GET_VAL_M (OUT_MAT: IN OUT MATRIX; INDEX: IN VAR) IS
  450.  
  451.         C1,C2:INTEGER := 1;
  452.         LAST : INTEGER;
  453.         DATA: INSTRING := VAR_ARRAY(INDEX);
  454.         VALUE: COMP_TYPE;
  455.  
  456.     BEGIN
  457.  
  458.         -- Check to see if value has been changed
  459.         IF(VAR_ARRAY(INDEX)(1..3) = NOT_CHANGED) THEN
  460.             RETURN;
  461.         END IF;
  462.  
  463.         -- Find the commas and place into correct part of matrix
  464.         FOR I IN OUT_MAT'RANGE(1) LOOP -- Loop on rows
  465.             FOR J IN OUT_MAT'RANGE(2) LOOP -- Loop on columns
  466.  
  467.                 FOR K IN C1..DATA'LAST LOOP
  468.                     IF (I = OUT_MAT'LAST(1)) AND -- Pick up last value
  469.                        (J = OUT_MAT'LAST(2)) THEN
  470.                         C2 := DATA'LAST;
  471.                         EXIT;
  472.                     END IF;
  473.                     IF(DATA(K) = ',') THEN
  474.                         C2 := K-1;
  475.                         EXIT;
  476.                     END IF;
  477.                 END LOOP;
  478.  
  479.                 -- Place characters between commas into the correct
  480.                 -- element of the matrix
  481.                 GET(VAR_ARRAY(INDEX)(C1..C2),VALUE,LAST);
  482.  
  483.                 OUT_MAT(I,J) := VALUE;
  484.  
  485.                 C1 := C2+2;
  486.  
  487.             END LOOP;
  488.  
  489.         END LOOP;
  490.  
  491.     EXCEPTION
  492.  
  493.         WHEN DATA_ERROR =>
  494.             NEW_LINE(STANDARD_OUTPUT);
  495.             PUT(STANDARD_OUTPUT," ERROR IN NAME LIST INPUT DATA: ");
  496.             PUT(STANDARD_OUTPUT," CHECK SYNTAX OF INPUT FILE");
  497.             RAISE;
  498.         WHEN OTHERS =>
  499.             RAISE;
  500.  
  501.  
  502.     END GET_VAL_M;
  503.  
  504.  
  505. END NAMELIST_GENERIC;
  506. ::::::::::
  507. tnl.ada
  508. ::::::::::
  509. ---  TNL.ADA
  510. -- This program tests the name list PROCEDUREs
  511. -- by instantiating the file NLG.ADA
  512.  
  513.     WITH NAMELIST_GENERIC;
  514.     WITH TEXT_IO; USE TEXT_IO;
  515.     WITH INTEGER_TEXT_IO; USE INTEGER_TEXT_IO;
  516.     WITH FLOAT_TEXT_IO; USE FLOAT_TEXT_IO;
  517.  
  518. PROCEDURE TNL IS
  519.  
  520.     TYPE VAR IS
  521.      (FYVAL,IVAL,M1VAL,M2VAL,M3VAL,M4VAL,MIVAL
  522.      ,TITLE1VAL,TITLE2VAL,TITLE3VAL,V1VAL
  523.      ,V12VAL,V2VAL,V3VAL,V4VAL,VACVAL,XVAL,YVAL);
  524.  
  525.     PACKAGE ENUM_IO IS NEW ENUMERATION_IO(VAR);
  526.     USE ENUM_IO;
  527.  
  528.     PACKAGE NL IS NEW NAMELIST_GENERIC(VAR);
  529.     USE NL;
  530.  
  531. -- test enumerated type
  532.  
  533.     TYPE DAYS IS (MON,TUES,WED,THUR,FRI,SAT,SUN);
  534.  
  535.     PACKAGE DAYS_IO IS NEW ENUMERATION_IO(DAYS);
  536.     USE DAYS_IO;
  537.  
  538. -- Test Fixed point type
  539.  
  540.     TYPE FIXED IS DELTA 2.0 RANGE -20.0..18.0;
  541.  
  542.     PACKAGE FIXED_TEXT_IO IS NEW FIXED_IO(FIXED);
  543.     USE FIXED_TEXT_IO;
  544.  
  545. -- Vector types
  546.     TYPE VECTOR_F IS ARRAY(INTEGER RANGE <> ) OF FLOAT;
  547.     TYPE VECTOR_E IS ARRAY(DAYS RANGE <> ) OF FLOAT;
  548.     TYPE VECTOR_D IS ARRAY(INTEGER RANGE <> ) OF DAYS;
  549.  
  550. -- Matrix types
  551.     TYPE MATRIX_F IS ARRAY(INTEGER RANGE <>, INTEGER RANGE <>) OF FLOAT;
  552.     TYPE MATRIX_I IS ARRAY(INTEGER RANGE <>, INTEGER RANGE <>) OF INTEGER;
  553.     TYPE MATRIX_E IS ARRAY(DAYS RANGE <>, DAYS RANGE <>) OF FLOAT;
  554.     TYPE MATRIX_D IS ARRAY(INTEGER RANGE <>, INTEGER RANGE <>) OF DAYS;
  555.  
  556. -- Instantiate procedures for scalar types
  557.     PROCEDURE GET_VALUE IS NEW GET_VAL(DAYS);
  558.     PROCEDURE GET_VALUE IS NEW GET_VAL(FLOAT);
  559.     PROCEDURE GET_VALUE IS NEW GET_VAL(FIXED);
  560.     PROCEDURE GET_VALUE IS NEW GET_VAL(INTEGER);
  561.  
  562. -- Instantiate procedures for vector types
  563.     PROCEDURE GET_VALUE IS NEW GET_VAL_V(FLOAT,INTEGER,VECTOR_F);
  564.     PROCEDURE GET_VALUE IS NEW GET_VAL_V(FLOAT,DAYS,VECTOR_E);
  565.     PROCEDURE GET_VALUE IS NEW GET_VAL_V(DAYS,INTEGER,VECTOR_D);
  566.  
  567. -- Instantiate procedures for 2 dimensional array types
  568.     PROCEDURE GET_VALUE IS NEW GET_VAL_M(FLOAT,INTEGER,MATRIX_F);
  569.     PROCEDURE GET_VALUE IS NEW GET_VAL_M(INTEGER,INTEGER,MATRIX_I);
  570.     PROCEDURE GET_VALUE IS NEW GET_VAL_M(FLOAT,DAYS,MATRIX_E);
  571.     PROCEDURE GET_VALUE IS NEW GET_VAL_M(DAYS,INTEGER,MATRIX_D);
  572.  
  573.     Y,X:FLOAT:= 0.0;
  574.     I:INTEGER:= 0;
  575.     VAC: DAYS:= FRI;
  576.     FY:FIXED := 4.0;
  577.  
  578.     V1:VECTOR_F(1..5);
  579.     V2:VECTOR_F(-1..1);
  580.     V3:VECTOR_E(MON..FRI);
  581.     V4:VECTOR_D(3..5);
  582.  
  583.     M1:MATRIX_F(1..3,1..3);
  584.     M2:MATRIX_F(1..2,-1..1);
  585.     MI:MATRIX_I(-1..0,-1..0);
  586.     M3:MATRIX_E(THUR..FRI,WED..FRI);
  587.     M4:MATRIX_D(0..2,-1..0);
  588.  
  589.  
  590.     TITLE1: STRING(1..10);
  591.     TITLE2: STRING(1..22):=" Whats your problem?!!";
  592.     TITLE3: STRING(1..40);
  593.  
  594.     FNAME: STRING(1..30);
  595.     OUTFILE: FILE_TYPE;
  596.     NCHAR: INTEGER;
  597.  
  598. BEGIN
  599.  
  600. -- READ IN DATA FROM FILE AND INITIALIZE THE DATA ARRAY
  601.     NL_PRINT_FLAG := 1;
  602.     INIT_NAMELIST;
  603.  
  604. -- Open up output file
  605.     NEW_LINE;
  606.     PUT("PLEASE ENTER NAME OF OUTPUT FILE: ");
  607.     GET_LINE(FNAME,NCHAR);
  608.     NEW_LINE;
  609.     CREATE(FILE=>OUTFILE, MODE=> OUT_FILE, NAME=> FNAME(1..NCHAR));
  610.     SET_OUTPUT(OUTFILE);
  611.  
  612.     NEW_LINE(2);
  613.     PUT("THIS IS A TEST: The following are the translated values");
  614.     NEW_LINE(2);
  615.  
  616. -- Floating point scalars
  617.     GET_VALUE(X,XVAL);
  618.     PUT("X:FLOAT TYPE=");
  619.     PUT(X);
  620.  
  621.     NEW_LINE(2);
  622.     GET_VALUE(Y,YVAL);
  623.     PUT("Y: FLOAT TYPE=");
  624.     PUT(Y);
  625.  
  626. -- Fixed point scalar
  627.     NEW_LINE(2);
  628.     GET_VALUE(FY,FYVAL);
  629.     PUT("FY: FIXED POINT  TYPE=");
  630.     PUT(FY);
  631.  
  632. -- Integer scalar
  633.     NEW_LINE(2);
  634.     GET_VALUE(I,IVAL);
  635.     PUT("I: INTEGER TYPE=");
  636.     PUT(I);
  637.  
  638. -- Enumerated scalar
  639.     NEW_LINE(2);
  640.     GET_VALUE(VAC,VACVAL);
  641.     PUT("VAC: ENUMERATION TYPE=");
  642.     PUT(VAC);
  643.  
  644. -- Strings
  645.     NEW_LINE(2);
  646.     GET_VALUE(TITLE1,TITLE1VAL);
  647.     PUT("TITLE1(STRING(1..10))=");
  648.     PUT(TITLE1);
  649.  
  650.     NEW_LINE(2);
  651.     GET_VALUE(TITLE2,TITLE2VAL);
  652.     PUT("TITLE2(STRING)(DEFAULT VALUE)=");
  653.     PUT(TITLE2);
  654.  
  655.     NEW_LINE(2);
  656.     GET_VALUE(TITLE3,TITLE3VAL);
  657.     PUT("TITLE3: STRING(1..40)=");
  658.     PUT(TITLE3);
  659.  
  660. -- Floating point element of vector
  661.     NEW_LINE(2);
  662.     GET_VALUE(V1(2),V12VAL);
  663.     PUT("V1(2):ELEMENT OF VECTOR=");
  664.     NEW_LINE;
  665.     PUT(V1(2));
  666.  
  667. -- Floating point vectors
  668.     NEW_LINE(2);
  669.     GET_VALUE(V1,V1VAL);
  670.     PUT("V1: VECTOR(1..5) OF FLOAT TYPE=");
  671.     NEW_LINE;
  672.     FOR K IN V1'RANGE LOOP
  673.         PUT(V1(K));
  674.     END LOOP;
  675.  
  676.  
  677.     NEW_LINE(2);
  678.     GET_VALUE(V2,V2VAL);
  679.     PUT("V2: VECTOR(-1..1) OF FLOAT TYPE=");
  680.     NEW_LINE;
  681.     FOR K IN V2'RANGE LOOP
  682.         PUT(V2(K));
  683.     END LOOP;
  684.  
  685. -- Vector indexed by enumerated type of floating point
  686.     NEW_LINE(2);
  687.     GET_VALUE(V3,V3VAL);
  688.     PUT("V3: VECTOR(MON..FRI) OF FLOAT TYPE=");
  689.     NEW_LINE;
  690.     FOR K IN V3'RANGE LOOP
  691.         PUT(V3(K));
  692.     END LOOP;
  693.  
  694. -- Vector of  enumerated type DAYS
  695.     NEW_LINE(2);
  696.     GET_VALUE(V4,V4VAL);
  697.     PUT("V4: VECTOR(3..5) OF ENUMERATED TYPE=");
  698.     NEW_LINE;
  699.     FOR K IN V4'RANGE LOOP
  700.         PUT(V4(K));PUT(" ");
  701.     END LOOP;
  702.  
  703.  
  704. -- 3x3 Matrix of floating point
  705.     NEW_LINE(2);
  706.     GET_VALUE(M1,M1VAL);
  707.     PUT("M1: MATRIX(3,3) OF FLOAT TYPE=");
  708.     NEW_LINE;
  709.     FOR K IN M1'RANGE(1) LOOP
  710.         PUT(M1(K,1));
  711.         PUT(M1(K,2));
  712.         PUT(M1(K,3));
  713.         NEW_LINE;
  714.     END LOOP;
  715.  
  716. -- 2x3 Matrix of floating point
  717.     NEW_LINE(2);
  718.     GET_VALUE(M2,M2VAL);
  719.     PUT("M2: MATRIX(2,3) OF FLOAT TYPE=");
  720.     NEW_LINE;
  721.     FOR K IN M2'RANGE(1) LOOP
  722.         PUT(M2(K,-1));
  723.         PUT(M2(K,0));
  724.         PUT(M2(K,1));
  725.         NEW_LINE;
  726.     END LOOP;
  727.  
  728. -- 2x2 Matrix of integer
  729.     NEW_LINE(2);
  730.     GET_VALUE(MI,MIVAL);
  731.     PUT("MI: MATRIX(2,2) OF INTEGER TYPE=");
  732.     NEW_LINE;
  733.     FOR K IN MI'RANGE(1) LOOP
  734.         PUT(MI(K,-1));
  735.         PUT(MI(K,0));
  736.         NEW_LINE;
  737.     END LOOP;
  738.  
  739. -- 2x3 Matrix of indexed by enumerated type DAYS of floating point
  740.     NEW_LINE(2);
  741.     GET_VALUE(M3,M3VAL);
  742.     PUT("M3: MATRIX(2,3) INDEX BY ENUMERATED TYPE; OF FLOAT TYPE=");
  743.     NEW_LINE;
  744.     FOR K IN M3'RANGE(1) LOOP
  745.         PUT(M3(K,WED));
  746.         PUT(M3(K,THUR));
  747.         PUT(M3(K,FRI));
  748.         NEW_LINE;
  749.     END LOOP;
  750.  
  751. -- 3x2 Matrix of type DAYS indexed by INTEGER
  752.     NEW_LINE(2);
  753.     GET_VALUE(M4,M4VAL);
  754.     PUT("M4: MATRIX(3,2)of ENUMERATED TYPE=");
  755.     NEW_LINE;
  756.     FOR K IN M4'RANGE(1) LOOP
  757.         PUT(M4(K,-1));PUT(" ");
  758.         PUT(M4(K,0));
  759.         NEW_LINE;
  760.     END LOOP;
  761.  
  762.     CLOSE(OUTFILE);
  763.  
  764. END TNL;
  765. ::::::::::
  766. test1.dat
  767. ::::::::::
  768. -- TEST1.DAT  File to test capabilities of NAMELIST
  769.  
  770.      YVAL= 234234.0
  771.  
  772. -- Fixed point type
  773.  
  774.         FYVAL = 12.0
  775.  
  776. -- 5 Element vector 
  777.  V1VAL = 2.0,3.0,4.0,5.0,6.0
  778.  
  779. -- One element of vector
  780.     v12val = 12.0
  781.   IVAL = 9909
  782.     VACVAL = SAT
  783.  
  784.  
  785.     TITLE1VAL = "This is the first title"
  786. TITLE3VAL = "  ``single quotes'' 2 DOUBLE QUOTES " "  SDF    "
  787.  
  788. -- Vector Input
  789.  
  790.     V2VAL = 34.5,67.8,90.1
  791.  
  792.     v3val = 2.0,3.0,0.234,4.0,5.0  -- Vector indexed by enumerated type of floating
  793.  
  794.     v4val = FRI,FRI,SAT -- Vector of enumerated type
  795.  
  796. -- Matrix inputs
  797.  
  798.  
  799. -- FLOATING POINT MATRIX
  800. M1VAL(3,3)= 1.0,2.0,3.0, -- FIRST ROW
  801.         4.0,5.0,6.0,-- SECOND ROW
  802.         7.0,8.0,9.0 -- THIRD ROW
  803.  
  804. M2VAL(2,2)=    1.0,2.0,3.0,
  805.         4.0,5.0,6.0
  806.  
  807. -- INTEGER MATRIX
  808. MIVAL(2,2)= 11, 12,
  809.             13, 14
  810.  
  811.     M3VAL(2,3) = 123.45,2345.476,35.0,
  812.            123.45,2345.476,35.0
  813.  
  814.     M4VAL(3,2) =     MON,MON,
  815.                 TUES,TUES,
  816.                 SAT,SUN
  817.  
  818. -- End of File
  819. ::::::::::
  820. outnl.dat
  821. ::::::::::
  822.  
  823.  
  824. THIS IS A TEST: The following are the translated values
  825.  
  826. X:FLOAT TYPE= 0.00000E+00
  827.  
  828. Y: FLOAT TYPE= 2.34234E+05
  829.  
  830. FY: FIXED POINT  TYPE= 12.0
  831.  
  832. I: INTEGER TYPE=       9909
  833.  
  834. VAC: ENUMERATION TYPE=SAT
  835.  
  836. TITLE1(STRING(1..10))=This is th
  837.  
  838. TITLE2(STRING)(DEFAULT VALUE)= Whats your problem?!!
  839.  
  840. TITLE3: STRING(1..40)=  ``single quotes'' 2 DOUBLE QUOTES " " 
  841.  
  842. V1(2):ELEMENT OF VECTOR=
  843.  1.20000E+01
  844.  
  845. V1: VECTOR(1..5) OF FLOAT TYPE=
  846.  2.00000E+00 3.00000E+00 4.00000E+00 5.00000E+00 6.00000E+00
  847.  
  848. V2: VECTOR(-1..1) OF FLOAT TYPE=
  849.  3.45000E+01 6.78000E+01 9.01000E+01
  850.  
  851. V3: VECTOR(MON..FRI) OF FLOAT TYPE=
  852.  2.00000E+00 3.00000E+00 2.34000E-01 4.00000E+00 5.00000E+00
  853.  
  854. V4: VECTOR(3..5) OF ENUMERATED TYPE=
  855. FRI FRI SAT 
  856.  
  857. M1: MATRIX(3,3) OF FLOAT TYPE=
  858.  1.00000E+00 2.00000E+00 3.00000E+00
  859.  4.00000E+00 5.00000E+00 6.00000E+00
  860.  7.00000E+00 8.00000E+00 9.00000E+00
  861.  
  862.  
  863. M2: MATRIX(2,3) OF FLOAT TYPE=
  864.  1.00000E+00 2.00000E+00 3.00000E+00
  865.  4.00000E+00 5.00000E+00 6.00000E+00
  866.  
  867.  
  868. MI: MATRIX(2,2) OF INTEGER TYPE=
  869.          11         12
  870.          13         14
  871.  
  872.  
  873. M3: MATRIX(2,3) INDEX BY ENUMERATED TYPE; OF FLOAT TYPE=
  874.  1.23450E+02 2.34548E+03 3.50000E+01
  875.  1.23450E+02 2.34548E+03 3.50000E+01
  876.  
  877.  
  878. M4: MATRIX(3,2)of ENUMERATED TYPE=
  879. MON MON
  880. TUES TUES
  881. SAT SUN
  882.