![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Next: 4.3 Selecting the graphic peripherals
Up: 4 Generalities
Prev: 4.1 List of the MODULEF libraries
Contents
The non-portable part of MODULEF is kept as small as possible. If a version has already been programmed on your machine, this is the version you will use (ex: The subroutines found in U_SUN if you are working on Sun). If not, you need to modify the subroutines in library U_MOD to conform to your machine.
The non-portable part contains the subroutines EXEC, MAJUSC, MINUSC, NOMFSD, OUVRIR, RETPAG, TILT, TRUNIT, and functions INFO listed below:
SUBROUTINE EXEC(COM)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PURPOSE : EXECUTE A COMMAND ON THE HOST SYSTEM
C
C EXAMPLE : CALL EXEC('ls') PRINTS THE LIST OF FILES ON THE
C MULTICS SYSTEM
C
C INPUT PARAMETER :
C COM : CHAIN CONTAINING A COMMAND
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CHARACTER*(*) COM
}
If the computer codes characters internally in ascii, the following function is used to transform lower-case to upper-case letters: {
CHARACTER*1 FUNCTION MAJUSC(C)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PURPOSE : TRANSFORMS A MINISCULE CHARACTER INTO A MAJUSCULE
C VERSION ASCII
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CHARACTER*1 C
I = ICHAR(C)
IF (97.LE.I .AND. I.LE.122) THEN
MAJUSC = CHAR(I-32)
ELSE
MAJUSC = C
ENDIF
END
}
The inverse of function MAJUSC.
This function creates a file name for a MODULEF data structure (D.S.) from a generic name (possibly blank) and the D.S. type: {
CHARACTER*80 FUNCTION NOMFSD(NOMGER,NOMSD)
C *********************************************************************
C PURPOSE: CREATE A GENERIC NAME
C -------
C NOMGER : GENERIC NAME
C NOMSD : D.S. NAME
C *********************************************************************
CHARACTER*(*) NOMSD,NOMGER,NOM*256
}
The above function is portable if the file name has the form: NOMGER.NOMSD
Experience shows that the FORTRAN 77 command, OPEN, is not totally portable. Subroutine OUVRIR has been defined for this purpose and may require some modifications at a new site: {
SUBROUTINE OUVRIR(UNIT,FILE,SPEC,RECL,IOSTAT) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C PURPOSE : C TO OPEN A FILE (OPEN) C AFTER A CALL TO OUVRIR, TEST IOSTAT (IF NOT CALL OUVRIS) C C THE CONVENTIONS ARE THOSE OF THE FORTRAN 77 STANDARD, EXCEPT FOR C THE FOLLOWING EXTENSION : IF SPEC CONTAINS 'OLD' AND 'DIRECT', C AND IF RECL=0, THEN THE FILE IS OPEN WITH THE RECORD LENGTH C GIVEN AT THE TIME IT WAS CREATED C C INPUT PARAMETERS : C UNIT : FILE UNIT NUMBER C FILE : FILE NAME C IF FILE=' ', OPEN WITHOUT FILE =... SPECIFIERS C SPEC : LIST OF SPECIFIERS (EX: 'OLD,DIRECT,UNFORMATTED') C RECL : RECORD LENGTH C IF RECL=0, OPEN WITHOUT RECL=... SPECIFIER C C OUTPUT PARAMETERS : C IOSTAT : INPUT/OUTPUT STATUS C IOSTAT = 0 IF NO ERRORS OCCURRED C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
SUBROUTINE RETPAG(IUNIT,NUMENR,BUF,LPAGE,NBPAGE)
C**********************************************************************
C PURPOSE : NON-PORTABLE SUBROUTINE TO SWEEP THROUGH A DIRECT ACCESS FILE
C ------- UNTIL THE END OF THE FILE.
C ATTENTION: THERE IS NO ERROR VERIFICATION
C**********************************************************************
C MOTIVATION : WITH UNIX THE END OF FILE IS MARKED BY THE OPTION
C ------------ END = , WHILE WITH MULTICS THE OPTIONS
C REC = , AND END = ARE INCOMPATIBLE.
C**********************************************************************
C ON ENTRY :
C -----------
C IUNIT : LOGICAL FILE UNIT NUMBER
C NUMENR : RECORD NUMBER TO READ
C IF NUMENR IS < 0 WE SWEEP THE FILE IN ORDER TO RETURN THE
C NUMBER OF PAGES, IF NOT WE READ THE RECORD
C NUMENR IN BUFFER BUF
C LPAGE : LENGTH OF TABLE BUF
C ON EXIT :
C -----------
C BUF : CONTENTS OF THE RECORD IF NUMENR >0
C EMPTY IF NOT
C NBPAGE : NUMBER OF PAGES IF NUMENR <=0
C EMPTY IF NOT
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C VERSION UNIX
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DIMENSION BUF(LPAGE)
C
IF (NUMENR .GT. 0) THEN
READ (IUNIT,REC=NUMENR,ERR=150,END=150) BUF
150 CONTINUE
ELSE
NBPAGE = 1
200 READ (IUNIT,REC=NUMENR,ERR=150,END=250) BUF
NBPAGE = NBPAGE + 1
GOTO 200
250 CONTINUE
NBPAGE = NBPAGE - 1
ENDIF
RETURN
END
}
This subroutine is called by ARRET, or other subroutines, to abort a MODULEF run. Several implementations are possible:
This subroutine is also not completely portable: {
SUBROUTINE TRUNIT(UNIT)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PURPOSE :
C TO FIND A FREE UNIT NUMBER, I.E., NOT CONNECTED TO ANY FILE.
C THIS SUBROUTINE OFTEN PRECEDES SUBROUTINE OUVRIR.
C
C OUTPUT PARAMETERS :
C UNIT : FILE UNIT NUMBER
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
It corresponds to the 4 functions: IINFO (integer), RINFO (real), DINFO (double precision)
and KINFO (character
). These functions enable the programs to have access to general information
(output device unit number, smaller positive floating number, user name, etc.) without using commons.
To adapt these functions, the user should read the version provided
( U_MOD) with a text editor
and modify it slightly by consulting the comments inserted in each function. For example, function IINFO
looks like:
{
INTEGER FUNCTION IINFO(KEYWRD)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PURPOSE :
C TO RETURN INFORMATION OF TYPE INTEGER
C
C INPUT PARAMETER :
C KEYWRD : NATURE OF THE INFORMATION TO RETURN
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CHARACTER*(*) KEYWRD
C
COMMON /TRAVA1/ PADTR1(29),IMPRE,PADTR2(3)
COMMON /UNITES/ LECTEU,IMPRIM,INTERA,NFNEWS,NFSAUV,PADUNI(27)
REAL PADTR1,PADTR2,PADUNI
INTEGER LECTEU,INTERA,IMPRIM,NFNEWS,NFSAUV,IMPRE
C------------------------------------------------
C-- MODIF 13/10/93
C-- F.HECHT ET E.SALTEL POUR QUE LES COMMONS
C-- SOIENT TOUJOURS INITIALISES
C------------------------------------------------
INTEGER COUNTK
SAVE COUNTK
DATA COUNTK /0/
IF(COUNTK.EQ.0) THEN
C--- INIT DE INFO
LECTEU = 5
IMPRIM = 6
INTERA = 0
NFNEWS = 99
NFSAUV =0
IMPRE = 1
COUNTK = 1
ENDIF
C
C 1. PORTABLE PART
C ------------------
C
IF (KEYWRD .EQ. ...) THEN
...
ELSE IF (KEYWRD .EQ. ...) THEN
...
C
C 2. NON-PORTABLE PART
C ----------------------
C
C INITIAL INPUT DEVICE UNIT NUMBER
ELSE IF (KEYWRD .EQ. 'LECTEUR INITIAL') THEN
IINFO = 5
...
C
C ERROR
ELSE
WRITE (IMPRIM,*) 'IINFO : KEYWORD UNKNOWN : ', KEYWRD
IINFO = 0
END IF
END
}
Part 1 in the above function must obviously not be modified. However, part 2 must be examined, for
example, to
change the initial unit number of the input device (
Recall that the user can modify the input device
unit number during execution by using the !LECTEUR command [MODULEF User Guide - 2].)
by replacing the value 5, valid on Multics and numerous other machines, by the appropriate value (for example the
value 105 on SIRIS 8). The values returned by functions INFO may be obtained by a simple constant
assignment, but also by a system call (obtaining CPU time, etc.). If this type of value is difficult
to obtain on the host machine, give an arbitrary value, for example 'SMITH' as the user name.
The keywords presently defined are: {
DOUBLE PRECISION FUNCTION DINFO(MOTCLE) 'PETIT' 'GRAND' 'PRECISION' 'HORLOGE' 'DELTA HORLOGE' 'CPU' 'DELTA CPU' INTEGER FUNCTION IINFO(MOTCLE) 'I' 'IMPRIMANTE' 'L' 'LECTEUR' 'INTERACTIVITE' 'NOUVELLES' 'SAUVEGARDE' 'BAVARD' 'LANGUE' 'LECTEUR INITIAL' 'IMPRIMANTE INITIALE' 'REEL2' 'RECL' 'UNITE RECL' 'INTERACTIVITE INITIALE' 'GRAND' CHARACTER*80 FUNCTION KINFO(MOTCLE) 'TITRE' 'MACHINE' 'DATE' 'HEURE' 'UTILISATEUR' 'POBA' 'PRE_HELP' 'SYMD' 'TESD' 'HELP ' 'SYMD ' 'PROC' REAL FUNCTION RINFO(MOTCLE) 'PETIT' 'GRAND' 'PRECISION'
}