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
[DO NOT] 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.

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