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'
}