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 USA LLC. 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 on the Research Page.

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
PRINT 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 2026 Software Validation Ltd. All rights reserved.