fpt and WinFPT Reference Manual - Command-line Commands
| SimCon Home | Ref Manual Home |
CHANGE I/O TO SUB-PROGRAM CALLS
Syntax:
[DO NOT] CHANGE [ALL] I/O TO SUB-PROGRAM CALLS
CHANGE FILE I/O TO SUB-PROGRAM CALLS
Licensing:
This command is supported by a special version of fpt developed in collaboration with Sector7 Inc. An additional licence is required for its use. Please contact customer support if this is required.
Important Note - Libraries for Use with this Command:
Please see the notes on Fortran compilation for the VX/Tools libraries.
Function:
This command is used when migrating code from VMS to other operating systems. It may also be useful in supporting some of the software research applications described here.
Fortran I/O statements are replaced by calls to Sector7's VX/Tools RMS library routines. These are the statements introduced by the keywords: ACCEPT BACKSPACE CLOSE DELETE ENDFILE INQUIRE OPEN PRINT READ REWRITE TYPE UNLOCK WRITE
Note that the commands CHANGE ALL I/O TO SUB-PROGRAM CALLS and CHANGE I/O TO SUB-PROGRAM CALLS change terminal I/O statements. To leave terminal I/O unchanged, please use the command CHANGE FILE I/O TO SUB-PROGRAM CALLS.
Labelled Statements and IF Statement Clauses
When fpt modifies an I/O statement, it may replace a single statement with two or more statements. It is therefore necessary to remove labels, and to change IF statements which contain I/O sub-statements to IF-THEN-ELSE constructs. For example, the labelled statement:
DO 110 I=1,6 110 READ(4,IOSTAT=ISTAT)CAND(I)
becomes
DO 110 I=1,6 !110 READ(4, IOSTAT=ISTAT)CAND(I) CALL VXRMS_READ('UNIT=',4,'IOSTAT=',ISTAT,%VAL(0)) CALL VXRMS_FROM_BUFFER(CAND(I),124) 110 CONTINUE
In this case, the original statement label is moved to a CONTINUE statement after the original statement. If the label is a GOTO destination, the CONTINUE statement is written before the original statement. Please see the commands REMOVE LABELS FROM EXECUTABLE STATEMENTS and CHANGE IF TO IF-THEN for a description of this process.
Replacement of the I/O Statements
The original I/O statement is left in place in the code, but is commented-out. It is replaced by a subroutine call. The subroutines are:
Keyword | Subroutine |
ACCEPT | VXRMS_READ |
BACKSPACE | VXRMS_BACKSPACE |
CLOSE | VXRMS_CLOSE |
DELETE | VXRMS_DELETE |
ENDFILE | VXRMS_ENDFILE |
INQUIRE | VXRMS_INQUIRE |
OPEN | VXRMS_OPEN |
VXRMS_WRITE | |
READ |
VXRMS_READ or VXRMS_FORMATTED_READ |
REWRITE | VXRMS_REWRITE |
TYPE | VXRMS_WRITE |
UNLOCK | VXRMS_UNLOCK |
WRITE |
VXRMS_WRITE or VXRMS_FORMATTED_WRITE |
The I/O statement control list is replaced by a series of arguments in which the original argument labels are replaced by strings. Thus, for example:
OPEN (COLORLUN,FILE='COLOR.ISM',STATUS='OLD' 1 ,ORGANIZATION='INDEXED' 1 ,KEY=(1:8,9:16,17:40),ACCESS='KEYED',RECL=128, 1 ,IOSTAT=IOS)
becomes
CALL VXRMS_OPEN('UNIT=',COLORLUN,'FILE=','COLOR.ISM', 1 'STATUS=','OLD','ORGANIZATION=','INDEXED','KEY=',1,8, 1 'CHARACTER','ASCENDING','KEY=',9,16,'CHARACTER', 1 'ASCENDING','KEY=',17,40,'CHARACTER','ASCENDING', 1 'ACCESS=','KEYED','RECL=',128,'IOSTAT=',IOS,%VAL(0))
Note that the defaults UNIT= for the unit number and CHARACTER and ASCENDING for the key attributes have been supplied. The argument list is terminated by a null, written as %VAL(0).
In most cases, the argument labels are replaced by the label text, including the '=' sign if this is present, converted to a string. The argument labels KEY= in a READ statement (where it is a synonym for KEYEQ=), KEYEQ=, KEYGE=, KEYGT=, KEYLE= and KEYLT= are changed to strings which indicate the data type of the key. They become:
Label |
INTEGER*2 Argument |
INTEGER*4 Argument |
String Argument |
KEY= | 'I2KEYEQ=' | 'I4KEYEQ=' | 'SKEYEQ=' |
KEYEQ= | 'I2KEYEQ=' | 'I4KEYEQ=' | 'SKEYEQ=' |
KEYGE= | 'I2KEYGE=' | 'I4KEYGE=' | 'SKEYGE=' |
KEYGT= | 'I2KEYGT=' | 'I4KEYGT=' | 'SKEYGT= |
KEYLE= | 'I2KEYLE=' | 'I4KEYLE=' | 'SKEYLE=' |
KEYLT= | 'I2KEYLT=' | 'I4KEYLT=' | 'SKEYLT=' |
When an I/O list is also present, in READ, WRITE and REWRITE statements, the treatment depends on whether or not the file is formatted. If a format is specified, fpt writes data to, or reads data from an internal character array or file. The data is transferred to or from the target file by the VXRMS_READ, VXRMS_WRITE or VXRMS_REWRITE call. For example:
WRITE (INDXFMLUN,'(2A1,I12)') 1 CHAR(ICHAR('A')-1+I),CHAR(ICHAR('Z')+1-I),I
becomes
! WRITE (INDXFMLUN,'(2A1,I12)',IOSTAT=IOS) ! 1 CHAR(ICHAR('A')-1+I),CHAR(ICHAR('Z')+1-I),I WRITE (VXRMS_BUFFER,FMT='(2A1,I12)') 1 CHAR(ICHAR('A')-1+I),CHAR(ICHAR('Z')+1-I),I CALL VXRMS_WRITE('UNIT=',INDXFMLUN,'IOSTAT=',IOS,%VAL(0))
If the I/O statement is unformatted, fpt writes the data to, or reads the data from a buffer, and the buffer is packed or unpacked by calls to the subroutines VXRMS_TO_BUFFER or VXRMS_FROM_BUFFER. These routines keep track of internal pointers into the buffer. The pointers are initialised by a call to VXRMS_INIT_BUFFER. For example:
READ (KEYEQ=4,UNIT=INDXUFLUN,IOSTAT=IOS)J,K
becomes
! READ (KEYEQ=4,UNIT=INDXUFLUN,IOSTAT=IOS)J,K CALL VXRMS_INIT_BUFFER CALL VXRMS_READ('I4KEYEQ=',4,'UNIT=',INDXUFLUN, 1 'IOSTAT=',IOS,%VAL(0)) CALL VXRMS_FROM_BUFFER(J,4) CALL VXRMS_FROM_BUFFER(K,4)
Diagnostic Returns
In cases where IOSTAT is not captured and there is no END= or ERR= handler, the VX/Tools run-time system handles any fatal error.
Insertion of Declarations
The COMMON block containing VXRMS_IOSTAT and the attributes of the other sub-programs are declared in the INCLUDE file vxrms_cmn.fpi. An INCLUDE statement is automatically inserted in the header of every sub-program which requires these declarations. vxrms_cmn.fpi is distributed as part of the VX/Tools library.
Where to Use this Command
Operating system command line | Yes |
Configuration file, config.fsp | Yes |
Specification (fsp) files, *.fsp | Yes |
Interactively, to FPT> prompt | Yes |
Interactive command files | Yes |
Embedded in the Fortran code | Yes |
Default
I/O statements are not changed by default.
Copyright ©1995 to 2024 Software Validation Ltd. All rights reserved.