![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Suiv.: Sélection des périphériques graphiques
Sup.: Généralités
Préc.: Liste des bibliothèques MODULEF -
Table des matières
La partie non portable de Modulef est aussi réduite que possible (quelques
sous-programmes). Si une version a déjà été programmée pour votre machine,
c'est cette version qui vous utiliserez (ex: Sun). Sinon, une
bibliothèque de nom u_mod est fournie à titre d'exemple, mais il est
nécessaire de l'adapter à votre site.
Cette partie non portable comprend les sous-programmes BIP, EXEC, MAJUSC,
MINUSC,
NOMFSD, OUVRIR, RETPAG, TILT, TRUNIT, et les "fonctions INFO":
SUBROUTINE EXEC(COM)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT : EXECUTER UNE COMMANDE DU SYSTEME HOTE
C
C EXEMPLE : CALL EXEC('ls') IMPRIME LA LISTE DES FICHIERS
C SOUS SYSTEME MULTICS
C
C PARAMETRE D'ENTREE
C COM : CHAINE CONTENANT LA COMMANDE
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CHARACTER*(*) COM
Si l'ordinateur, de manière interne, code les caractères en ASCII, il suffit de conserver la version fournie:
CHARACTER*1 FUNCTION MAJUSC(C)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT : TRANSFORMER UNE LETTRE MINUSCULE EN 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
L'inverse de la fonction MAJUSC.
Cette fonction crée un nom de fichier pour une Structure de Données (S.D.) Modulef, à partir d'un nom générique (éventuellement blanc) et du type de la S.D. :
CHARACTER*80 FUNCTION NOMFSD(NOMGER,NOMSD)
C *********************************************************************
C BUT : CREER UN NOM GENERIQUE
C ----
C NOMGER : NOM GENERIQUE
C NOMSD : NOM DE LA S.D
C *********************************************************************
CHARACTER*(*) NOMSD,NOMGER,NOM*256
Cette fonction est portable si le nom du fichier a la forme: NOMGER.NOMSD
L'expérience montre que l'ordre OPEN de Fortran 77 n'est pas totalement portable. Nous avons donc défini le sous-programme OUVRIR, qui peut demander quelques modifications sur un nouveau site :
SUBROUTINE OUVRIR(UNIT,FILE,SPEC,RECL,IOSTAT) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : C OUVRIR UN FICHIER (OPEN) C APRES UN APPEL A OUVRIR, TESTER IOSTAT (SINON APPELER OUVRIS) C C LES CONVENTIONS SONT CELLES DE LA NORME FORTRAN 77, A PART C L'EXTENSION SUIVANTE : SI SPEC CONTIENT 'OLD' ET 'DIRECT', C ET SI RECL=0, ALORS LE FICHIER EST OUVERT AVEC LA LONGUEUR C D'ENREGISTREMENT DONNEE LORS DE SA CREATION C C PARAMETRES D'ENTREE : C UNIT : NUMERO D'UNITE DU FICHIER C FILE : NOM DU FICHIER C SI FILE=' ', OPEN SANS SPECIFIEUR FILE=... C SPEC : LISTE DE SPECIFIEURS (EX: 'OLD,DIRECT,UNFORMATTED') C RECL : LONGUEUR D'UN ENREGISTREMENT C SI RECL=0, OPEN SANS SPECIFIEUR RECL=... C C PARAMETRES DE SORTIE : C IOSTAT : CODE D'ETAT DU SYSTEME D'ENTREES/SORTIES C IOSTAT = 0 SI AUCUNE ERREUR N'EST SURVENUE C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUBROUTINE RETPAG(IUNIT,NUMENR,BUF,LPAGE,NBPAGE)
C**********************************************************************
C BUT : SOUS PROGRAMME NON PORTABLE PERMETTANT DE BALAYER UN
C ------ FICHIER EN ACCES DIRECT JUSQU'A LA FIN DU FICHIER
C ATTENTION IL N'Y A AUCUNE VERIFICATION DU TYPE D'ERREUR
C**********************************************************************
C MOTIVATION : SOUS UNIX LA FIN DE FICHIER EST REPERE PAR L'OPTION
C ------------ END = , ALORS QUE SOUS MULTICS LES OPTIONS
C REC = , ET END = SONT INCOMPATIBLES .
C**********************************************************************
C EN ENTREE :
C -----------
C IUNIT : NUMERO D'ETIQUETTE LOGIQUE
C NUMENR : NUMERO DE L'ENREGISTREMENT A LIRE
C SI NUMENR EST < 0 ON BALAYE LE FICHIER POUR RETOURNER LE
C NOMBRE DE PAGE DE CELUI CI SINON ON LIT L'ENREGISTREMENT
C NUMRENG DANS LE BUFFER BUF
C LPAGE : LONGUEUR DU TABLEAU BUF
C EN SORTIE :
C -----------
C BUF : CONTENU DE L'ENREGISTREMENT SI NUMREN >0
C VIDE SINON
C NBPAGE : NOMBRE DE PAGE SI NUMREG <=0
C VIDE SINON
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=NUMERR,ERR=150,END=250) BUF
NBPAGE = NBPAGE + 1
GOTO 200
250 CONTINUE
NBPAGE = NBPAGE - 1
ENDIF
RETURN
END
Ce sous-programme est appelé par ARRET ou d'autres sous-programmes, afin d'avorter une exécution Modulef. Plusieurs implémentations sont possibles :
Ce sous-programme, lui aussi, n'est pas tout à fait portable :
SUBROUTINE TRUNIT(UNIT) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : C TROUVER UN NUMERO D'UNITE LIBRE, C'EST-A-DIRE CONNECTE A AUCUN C FICHIER. CE SOUS-PROGRAMME PRECEDE SOUVENT LE S.P. OUVRIR C C PARAMETRES DE SORTIE : C UNIT : NUMERO D'UNITE DU FICHIER C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Il s'agit des 4 fonctions IINFO (de type INTEGER), RINFO (REAL), DINFO (DOUBLE PRECISION), et KINFO (CHARACTER*80). Ces fonctions permettent aux programmes d'accéder à des informations générales (numéro d'unité de l'imprimante, plus petit nombre flottant positif, nom de l'utilisateur, ...) sans avoir recours à des COMMON.
L'adaptation de ces fonctions consiste à lire la version fournie (u_mod) avec un éditeur de textes, et à la modifier légèrement d'après les commentaires insérés dans chaque fonction. Par exemple, la fonction IINFO a l'aspect suivant :
INTEGER FUNCTION IINFO(MOTCLE)
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT :
C RETOURNER UNE INFORMATION DE TYPE INTEGER
C
C PARAMETRE D'ENTREE :
C MOTCLE : NATURE DE L'INFORMATION A RETOURNER, EN CLAIR
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CHARACTER*(*) MOTCLE
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. PARTIE PORTABLE
C ------------------
C
IF (MOTCLE .EQ. ...) THEN
...
ELSE IF (MOTCLE .EQ. ...) THEN
...
C
C 2. PARTIE NON PORTABLE
C ----------------------
C
C NUMERO D'UNITE INITIAL DU LECTEUR
ELSE IF (MOTCLE .EQ. 'LECTEUR INITIAL') THEN
IINFO = 5
...
C
C ERREUR
ELSE
WRITE (IMPRIM,*) 'IINFO : MOT-CLE INCONNU : ', MOTCLE
IINFO = 0
END IF
END
Ici, la partie 1 ne doit évidemment pas être modifiée,
mais il faut examiner la partie 2. Dans notre exemple, changer
éventuellement le numéro initial du lecteur (
Rappelons que l'utilisateur a la possibilité,
en cours d'exécution, de modifier le numéro du lecteur : utiliser pour cela la
commande !LECTEUR (cf. [Guide Modulef - 2]).)
remplacer le 5, valable sur Multics et de nombreuses autres machines,
par la valeur adéquate (par exemple 105
sous SIRIS 8). Les valeurs retournées par les fonctions INFO peuvent être
obtenues par une simple affectation de constante, mais aussi par un appel
au système (obtention du temps CPU, ...).
Si une telle valeur est difficile à obtenir sur la machine hôte,
donner une valeur quelconque, par exemple 'DUPONT' pour le nom de
l'utilisateur.
Les mots-clés définis à ce jour sont :
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'