subroutine aptffip (ius, fd, iamax, idmax, iemax, aword, iword, & fword, mtype, lword, nword, achar, nerr) ccbeg. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c c SUBROUTINE APTFFIP c c call aptffip (ius, fd, iamax, idmax, iemax, aword, iword, c & fword, mtype, lword, nword, achar, nerr) c c Version: aptffip Updated 1993 February 18 15:20. c aptffip Originated 1993 February 16 14:00. c c Author: Arthur L. Edwards, LLNL, L-298, Telephone (925) 422-4123. c c c Purpose: To read a free field input line from I/O unit ius in format c (80a1), store the ASCII result in achar, then crack the input c line into fields separated by the delimiter fd, storing the c results into aword, iword and fword according to the field type c mtype, and also return the length of each field, lword, the c number of fields, nword, and a result flag nerr. c Character array aword has words of length iamax. c The maximum number of digits in an integer, and the maximum c magnitude of floating point exponents are specified by idmax c and iemax, to allow use on computers with different word sizes. c c Input: ius, fd, iamax, idmax, iemax. c c Output: aword, iword, fword, mtype, lword, nword, achar, nerr. c c Calls: aptchap c c Glossary: c c achar Output A character*1 array of 80 characters, the uncracked c input line. c c aword Output A character*iamax array of input line fields. Size 40. c Initialized to blank characters. If the n'th data c field translated is a character field (mtype = 0, c 1 or 4), it will be stored in the leftmost characters c of aword(n), and right-filled with blank characters, c as necessary. The number of characters preceding the c first blank is lword. c c fd Input A type character*1 field delimiter. c c fword Output A floating-point array, size 40. c Initialized to zero. c The maximum allowable exponent is iemax. c If the data field is translated into an integer c (mtype = 2) or into a floating-point number c (mtype = 3), its floating-point value will be c returned in fword. If the field is formatted as an c integer, but contains more than idmax digits after c any leading zeros, it will be translated into a c floating-point number, and returned in fword. c The data field may have leading or trailing c blanks. The first non-blank character may be a "+" c or "-". The mantissa may contain any number of c digits, but no more than one decimal point, and c may have trailing blanks. If an exponent is given, c it must begin with "e", "E", "d", "D", "+" or "-". c An initial "e", "E", "d" or "D" may be followed by c a "+" or "-". The digits of the exponent may have c leading and trailing blanks, but no additional c characters following any trailing blanks. c Note: do not equivalence iword to fword. c Note: the largest floating-point value possible on c the Cray is approximately 1.e+2465. c c iamax Input The length of words in character array aword. c c idmax Input Maximum number of digits in an integer. Depends on c the machine. At least 13 on a Cray. c c iemax Input Maximum size (positive or negative) of the exponent c of a floating-point number. Depends on the machine. c Approximately 2465 on a Cray. c c ius Input Input file I/O unit, for reading next input line. c c iword Output An integer array, size 40. Initialized to zero. c If the n'th data field translated is c an integer (mtype = 2), its integer value will be c stored in iword(n), and its floating-point value c stored in fword(n). The maximum number of digits c is idmax. The data field may have leading or c trailing blanks. The first non-blank character may c be a "+" or "-". All other characters must be c digits, with no more than idmax digits following any c leading zeros. c Note: the largest integer possible on the Cray c is 2**46 - 1 = 7.03687e+13. c Note: do not equivalence iword to fword. c c lword Output An integer array, size 40. The number of characters c preceding the first blank, in each output word aword. c c mtype Output An integer array, size 40. The first nword values c indicate the data types of the data fields c translated from the character string achar: c 0: Not recognizable as an integer or floating-point c number, and longer than iamax characters c (nerr = 0), or a floating-point number whose c exponent exceeds the limit iemax (nerr = 5). c Returned in aword. c Also, blank fields after last non-blank field. c 1: Not recognizable as an integer or floating-point c number. Field has 1 to iamax characters. c Returned in aword, left-adjusted, right-filled c with blanks, as necessary. c 2: Data field translated into integer mode. c The integer value is returned in iword, and the c floating-point value is returned in fword. c Also returned in aword, as for mtype = 0 or 1. c 3: Data field translated into floating-point c mode, and returned in fword. The integer value c can not be stored in iword, because of the c possibility of overflow of numbers with large c exponents. If nerr = 4, the data field was c an integer with more than idmax digits. c Also returned in aword, as for mtype = 1. c c nerr Output Result sentinal. 0 if input line was cracked. c Otherwise, the last error found by aptchap: c -1 if an end of file was reached in the input file. c 4 if an integer exceeds idmax characters (in any c field). If so, a floating-point result is returned c in fword, with mtype = 3. c 5 if a floating-point exponent exceeds iemax (in any c field). If so, a character string is returned in c aword, with mtype = 0. c 10 if the system could not read the input line. c c nword Output The number of data fields found in achar. c Zero if input line was blank. c c Example: Following is an example of a valid input line, and how it would c be cracked and typed by aptffip, when iamax = 8. c Input: abc charstringxxx 10 1.0e+01 6 7.12 c c nword = 6 c word aword iword fword mtype lword c 1 abc 0 0.0 1 ASCII 3 c 2 charstring 0 0.0 1 ASCII 9 c 3 10 10 10.0 2 integer 2 c 4 1.0e+01 0 10.0 3 floating-point 7 c 5 6 6 6.0 2 integer 1 c 6 7.12 0 7.12 3 floating-point 4 c c Changes: c c cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccend. c.... Dimensioned arguments. c---- Input line uncracked ASCII words. dimension achar (1) character*1 achar c---- Cracked fields. ASCII (mtype = 0, 1). dimension aword (1) character*(*) aword c---- Cracked fields. Real (mtype = 2, 3). dimension fword (1) c---- Cracked fields. Integer (mtype = 2). dimension iword (1) c---- Number of characters in input fields. dimension lword (1) c---- Cracked field types (0, 1, 2 or 3). dimension mtype (1) c---- Scalar arguments. c---- Field delimiter. character*1 fd c.... Local variables. c---- Index in several arrays. common /laptffip/ i c---- Max # of characters to translate. common /laptffip/ nchar c---- Max # of fields to translate. common /laptffip/ nwordm c.... Initialize. nchar = 80 ! Max # of characters to translate. nwordm = 40 ! Max # of fields to translate. c---- Result sentinal. nerr = 0 cbugc***DEBUG begins. cbug 9801 format (/ 'aptffip parsing an input line. ius=',i3 / cbug & ' iamax=',i3,' idmax=',i3,' iemax=',i5) cbug write (3, 9801) ius, iamax, idmax, iemax cbugc***DEBUG ends. do 110 i = 1, nwordm aword(i) = ' ' iword(i) = 0 fword(i) = 0.0 mtype(i) = 0 lword(i) = 0 110 continue cbugc***DEBUG begins. cbug 9802 format (/ 'aptffip initial aword is' / ('"',a,'"')) cbug write (3, 9802) aword(1) cbugc***DEBUG ends. c.... Read a line from the input disk file. 800 format (80a1) c++++ Read input line. read (unit=ius, fmt=800, err=120, end=130) & (achar(i), i = 1, 80) c.... Crack space delimited fields to ASCII, integer and floating-point. call aptchap (achar, 1, nchar, nwordm, fd, iamax, idmax, iemax, & aword, iword, fword, mtype, lword, nword, nerr) go to 210 c---- System can not read input line. 120 nerr = 10 go to 210 c---- Found end of file. 130 nerr = -1 210 return c.... End of subroutine aptffip. (+ 1 line). end UCRL-WEB-209832